dbg
今天第一次手脱了壳(找不到工具,被迫脱壳),是ASpack,搜了一下是压缩壳.
先介绍一下dbg工具的功能吧,真得好用,真的.
x64dbg使用技巧与实用插件合集 - 吾爱破解 - 52pojie.cn
这篇就够了,然后我再贴上我手脱壳题目别人的wp吧,题目是攻防世界难度3的Windows_Reverse2
有点烧脑的ASPACK
EugeneL1发布于2022-08-25
首先拿到程序,将程序拖到exeinfo中,发现是一个利用Aspack加壳后的程序。
因为手里没有现成的Aspack脱壳工具,所以利用OllDBG对程序进行手动脱壳,Aspack壳脱壳的过程很固定,下面将演示对本题目中程序的Aspack壳的脱壳过程。
【ASPACK脱壳】
工具:吾爱破解OllyDBG
过程:
1.首先使用OllyDBG打开题目中给出的可执行文件,首先可以看到程序的基址为0x296000
(记住这个基址,后面会用到),同时程序停止在0x296001
处,指令为pushad
,这是Aspack壳的一个显著特征。
2.按F8步过,此时程序停留在一个call
指令,此时右键ESP寄存器,在该地址添加硬件断点,接着按F9执行到这个地址,此时程序已经完成了脱壳。
3.此时程序执行到一条JNZ
指令,按两次F8步过直到执行完push指令,到达程序真正的OEP。
4.此时到达程序真正的OEP,在第一次分析时,需要右键重新分析代码。
5.此时,在程序停留的call
指令处右键,利用Ollydump脱壳。
6.此时可以看到程序默认的起始地址为0x400000,但是程序当前实际运行的基址为前面记录的0x290000,因此要修改程序的起始地址,否则不能够dump内存。同时,要将程序OEP修改为脱壳后的程序实际OEP,就是刚刚程序JMP
之后的第一条call
指令地址偏移,为0x170F。
修改后:
7.此时点击脱壳,就完成了对程序的脱壳。
【程序分析】
此时已经完成了脱壳的部分,正式进入到对程序的分析。利用IDA打开脱壳之后的程序,搜索字符串发现了关键字符串DDCTF{reverse+}
,到其交叉引用的位置,按F5进行反汇编,查看程序逻辑。图中标黄的是关键函数(函数名有自己修改)。
首先查看函数sub_6211F0(),首先可以猜测它是对输入进行了判断,函数的逻辑也确实证实了我的猜测,if
中的判断逻辑限制输入的长度必须大于0并且是偶数,while循环中的if
判断限定输入必须是09,AF,这很明显,输入必须在16进制的表示范围之内。
回到上层,查看calc函数,这个函数对用户输入进行了处理,并最终将结果与reverse+
进行比较。可以看到,第一个do/while循环是将每两位用户输入处理成其对应的16进制数值,例如用户输入AD
,则结果等于('A'-55) * 0x10 + 'D'-55 = 0xAD
,因为A的ASCII为0x65
,因此A减去55等于10,相当于是将其变为16进制中A的值,这是需要思考和理解的一点。
经过处理之后,用户输入存储在一个新的字符串中。接着看return中的函数,根据其特征可以看出是Base64编码的过程。
一个更明显的特征,函数对可能存在的最后两位空位填充时用了=
,这是base64的典型特征。
【编写注册机】
现在我们已经基本清楚了程序的逻辑,首先接收用户输入,并将其处理中其在16进制中的实际大小,之后对存储处理之后数据的字符串进行base64编码,将编码之后的字符串与reverse+
进行比较。
我们要做的就是将reverse+
进行base64解码,将其解码后的十六进制数值变成符合09,AF范围的字符串。
import base64
s = 'reverse+'
s = base64.b64decode(s)
print(s)
结果:
flag = flag{ADEBDEAEC7BE}