【问题标题】:How to avoid crash during stack buffer overflow exploit?如何避免在堆栈缓冲区溢出漏洞利用期间崩溃?
【发布时间】:2021-10-14 01:43:30
【问题描述】:
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 xp sp3 en。没有应用其他保护机制,即堆栈可以执行,没有 ASLR。

发送数据为'A' * 1024 + addr_of_jmp_esp + shellcode

我的问题是:

  1. 如果使用strcpy,则shellcode由msfvenom生成,msfvenom -p windows/exec cmd=calc.exe -a x86 -b "\x00" -f python, msfvenom 尝试使用 x86/shikata_ga_nai 的 1 次迭代对有效负载进行编码 发送数据后,没有弹出计算,exploit 将无法工作。 但是如果使用memcpy,则msfvenom -p windows/exec cmd=calc.exe -a x86 -f python生成的shellcode没有编码就可以了。

  2. calc弹出后如何避免原程序崩溃,如何保持栈平衡避免崩溃?

【问题讨论】:

    标签: stack memcpy buffer-overflow exploit


    【解决方案1】:
    1. 很难说。我会使用自定义有效负载(只需复制windows/exec cmd=calc.exe)并在开头放置0xcc 并对其进行调试(或者在调试器下很容易识别的东西,例如ud2\0xeb\0xfe)。如果你的有效载荷被执行,你会看到它。绕过添加的指令(只是 NOP)并尝试查看有效负载的其余部分可能出现的问题。

    2. 你需要一个自定义的有效载荷;由于您使用的是 XP SP3,因此您无需做疯狂的事情。

    • 不要尝试进行溢出并粉碎整个堆栈(鉴于您的溢出看起来很完美,足以控制 rIP)。

    • 查看目标函数(在您的示例中为deal_msg)在正常条件下的行为。注意ret执行时的栈地址(如果寄存器需要有一定的值,这取决于调用者)。

    • 尝试在你的 shellcode 中复制它:你很可能会在 shellcode 的末尾稍微调整堆栈指针。

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

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

    • 总而言之,在负载执行后返回某个位置很容易,只需 push <addr>ret,但您需要确保堆栈处于良好状态才能继续执行,并且大多数寄存器都已正确设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 2012-06-02
      • 1970-01-01
      相关资源
      最近更新 更多