本帖最后由 漁滒 于 2021-3-4 20:13 编辑
这是第一次进行window软件的逆向,整个过程搞了差不多一整天,废话不多说,直接进入正题。
逆向之前需要准备以下一些工具
1.破解专用虚拟机2.0(用于脱壳和修复)站内链接:https://www.52pojie.cn/thread-661779-1-1.html
1.1、吾爱破解OllyDbg(用于脱壳)虚拟机自带
1.2、CFF Explorer(用于修复)虚拟机自带
2.VMware Workstation Pro(用于启动上方的虚拟机)
3.IDA_Pro_v7.0(用于静态分析脱壳后的程序)
4.python(运行frida注入js代码)
一、脱壳
启动虚拟机后,在吾爱破解工具包的PE工具中打开【PEID V0.95】
将待脱壳的【【2021春节】解题领红包之二.exe】拖到【PEID V0.95】窗口里面
发现是UPX的压缩壳,接下来要使用OllyDbg进行脱壳,这里使用的是ESP定律法脱壳
我学习参考的视频来自于:https://www.bilibili.com/video/BV1TT4y1T7QC
首先使用OD附加进程
这时会提示代码压缩,这里选择【否】
这是代码会在【pushad】这条指令下断下,然后按一下F7
此时可以看到,只有ESP和EIP两个寄存器是红色的,其他都是白色的
然后在ESP寄存器的值上右键,选择【数据窗口中跟随】,接着在数据窗口的第一个值的位置右键,选择【断点】-> 【硬件写入】 -> 【Word】
然后按一下F9,会运行到一个地方,它的上一行指令就是【popad】
然后继续按F7往下走,来到【jnz】的地方会有一个红色的箭头往上
然后在它下一行的地址处【00436831】点击一下,然后按F4就可以直接来到点击的地方,接着按F7,就可以来到【jmp】的地方
此时只要再按一次F7,就真正进程程序的地方
接着在汇编窗口右键,选择【用OllyDump脱壳调试程序】
什么都不用改,直接点击【脱壳】,重命名为【1.exe】
将脱壳后的程序拖回本机,双击运行,发现提示不出来,并且直接闪退,接下来需要修复
打开吾爱破解工具包的PE工具中打开【CFF Explorer】
打开刚刚脱壳得到的1.exe,点击【File Header】中的【Click here 】
勾选 Relocation info stripped from file并点击【OK】,然后另存为【2.exe】
再次将得到的【2.exe】拖回本机,双击运行,显示正常了。此时脱壳修复完成
二、静态分析
使用AID打开【2.exe】,然后快捷键【ALT+T】打开文本搜索,输入我们一开始看到的【Please input password:】,会查到到sub_402320函数,F5转换为伪C代码
可以看到我们输入字符串以后,下面有一个判断字符串长度的地方,只有字符串长度是23的时候,才会执行里面两个函数,如果不是,则直接显示【Error, please try again】
然后进入sub_402490和sub_402020大致先浏览一下,可以发现在sub_402020中同时出现【Success】和【Error, please try again】,那么可以初步猜测sub_402020就是判断的关键函数
经过简单的分析可以知道,v22是函数的第一个参数,也是我们输入的字符串,v23就是flag的指针,下面while循环判断是否全部相等
那么理论上说只要hook出v23的指针,在通过指针就可以拿到flag了,开始实践
python代码
[Python] 纯文本查看 复制代码
import frida
import sys
def on_message(message, data):
pass
with open('win.js', 'r', encoding='utf-8') as f:
jscode = f.read()
session = frida.attach('2.exe')
script = session.create_script(jscode)
script.on('message', on_message)
script.load()
sys.stdin.read()
js代码
[JavaScript] 纯文本查看 复制代码 function main() {
var sub_402020 = ptr(0x402020); //来源于IDA函数名
var instr;
console.log("sub_402020 "+sub_402020);
Interceptor.attach(sub_402020, {
onEnter: function(arge){
console.log("sub_402020 Enter");
instr = Memory.readByteArray(arge[0], 32);
console.log(instr);
instr = Memory.readByteArray(arge[1], 32);
console.log(instr);
instr = Memory.readByteArray(arge[2], 32);
console.log(instr);
instr = arge[3];
send(instr);
instr = arge[4];
send(instr);
},
onLeave: function (retval){
console.log("sub_402020 Leave");
var flagptr = Memory.readPointer(ptr(0x42E968)) //来源于xmmword_42E968
var flag = Memory.readCString(flagptr);
console.log("flag");
console.log(flag);
}
})
}
main();
我们先运行【2.exe】,然后等待出现【Please input password:】后运行hook的脚本
等脚本输出【sub_402020 0x402020】后,我们随意输入23为的字符串
软件显示的是输入的flag不正确,再来看看hook的内容
此时正确的flag【2021HappyNewYear52PoJie】已经被hook出来了
最后测试一下
结果正确
|