首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免堆栈缓冲区溢出漏洞的崩溃?

如何避免堆栈缓冲区溢出漏洞的崩溃?
EN

Stack Overflow用户
提问于 2021-08-10 13:29:45
回答 1查看 296关注 0票数 0
代码语言:javascript
复制
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

我的问题是:

如果使用

  1. ,则外壳代码由msfvenom、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生成的不需要编码的外壳代码可以工作。

  1. 如何避免原始程序在calc弹出后崩溃,如何保持堆栈平衡以避免崩溃?
EN

回答 1

Stack Overflow用户

发布于 2021-08-23 21:05:10

  1. 很难说。我会使用一个自定义的有效负载(只需复制windows/exec cmd=calc.exe),并将一个0xcc放在开始并调试它(或者在调试器下很容易识别的东西,如ud2\0xeb\0xfe)。如果您的有效载荷被执行,您将看到它。绕过添加的指令(只是NOP ),看看剩余的有效载荷可能会出现什么问题。

  1. 您将需要一个自定义的有效负载;由于您使用的是XP SP3,所以不需要做疯狂的事情。

  • 不要尝试执行溢出操作并粉碎整个堆栈(考虑到您的溢出似乎是完美的,仅足以控制rIP)。

  • 查看目标函数(在示例中是deal_msg)在正常情况下的行为。注意执行ret时的堆栈地址(如果寄存器需要有某些值,这取决于调用方)。

  • 尝试在您的外壳代码中复制这一点:您很可能会在shellcode代码的末尾调整堆栈指针。

  • 确保在执行有效负载时调用方(main)堆栈没有受到影响。这种情况可能会发生,在这种情况下,可以在堆栈上预留足够的空间(降低地址),因此调用方堆栈远离有效负载所需的堆栈空间,并且不会受到有效负载执行的影响。

  • 最终返回到目标的ret,或者在调用deal_msg函数之后直接返回(或者您认为合适的地方,例如直接返回到ExitProcess(),但是返回到以前的“正常”执行路径可能更有趣)。

总之,

  • 在执行有效负载之后返回某个地方很容易,只有push <addr>ret,但是您需要确保堆栈处于良好的状态才能继续执行,并且大多数寄存器都已正确设置。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68727726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档