刚开始学,菜鸟一B。
下面直接进入主题。
首先练习一个脱壳。ASPack 2.12 -> Alexey Solodovnikov
我们尝试用ESP定律
程序入口为
00431001 > 60 pushad 00431002 E8 03000000 call crackme2.0043100A 00431007 - E9 EB045D45 jmp 45A014F7 0043100C 55 push ebp 0043100D C3 retn 0043100E E8 01000000 call crackme2.00431014
F8一次,下硬件访问断点,F9运行后取消断点。来到这
004313B0 /75 08 jnz short crackme2.004313BA 004313B2 |B8 01000000 mov eax,1 004313B7 |C2 0C00 retn 0C 004313BA \68 01F04200 push crackme2.0042F001 004313BF C3 retn 004313C0 8B85 26040000 mov eax,dword ptr ss:[ebp+426] 004313C6 8D8D 3B040000 lea ecx,dword ptr ss:[ebp+43B]
F8单步走三次就到达程序OEP
00403861 55 push ebp 00403862 8BEC mov ebp,esp 00403864 6A FF push -1 00403866 68 F0624000 push CrackMe1.004062F0 0040386B 68 D44C4000 push CrackMe1.00404CD4 00403870 64:A1 00000000 mov eax,dword ptr fs:[0] 00403876 50 push eax 00403877 64:8925 0000000>mov dword ptr fs:[0],esp 0040387E 83EC 58 sub esp,58 00403881 53 push ebx 00403882 56 push esi 00403883 57 push edi 00403884 8965 E8 mov dword ptr ss:[ebp-18],esp 00403887 FF15 48604000 call dword ptr ds:[406048] ; kernel32.GetVersion
整个流程就是——
1、单步F8
2、记录ESP的地址
3、在ESP的地址处,下硬件访问断点
4、接着运行
5、删除硬件断点
6、单步走3次
7、就来到OEP了!
所以脚本就可以写了。
脚本一般都是保存为OSC格式,也可以保存为txt格式
var addr//定义一个变量addr
sto //单步,也就是F8
mov addr,esp //把此处ESP的地址给变量addr
bphws addr,"r"//下硬件读取断点,也就是硬件访问断点
run//运行,也就是F9
BPHWC addr //取消断点
sto //单步,也就是F8,第1次
sto //单步,也就是F8,第2次
sto //单步,也就是F8,第3次
cmt eip,"this is the OEP! found by JoyChou"//在EIP处,也就是现在OD停留了位置加注释
MSG "dump and fix it"//弹出一个对话框
ret//结束脚本
快吃午饭了,写着玩玩,下午还去图书馆!
下面接着一个PE PACK的壳
整个流程是——
1、单步F8三次
2、记录ESP的地址
3、在ESP的地址处,下硬件访问断点
4、接着运行
5、删除硬件断点
6、F8一次就到OEP
所以脚本为
1 var addr//定义一个变量 2 sto//单步走 3 sto 4 sto 5 mov addr,esp 6 bphws addr,"r"//在esp处下硬件访问断点 7 run 8 bphwc addr//删除断点 9 sto 10 cmt eip, "this is the OEP ,found by JoyChou"//在eip加注释 11 MSG "Now, dump and fix it" 12 13 ret