利用导致程序在GDB内以不同的值退出?

时间:2014-04-19 02:48:57

标签: linux gdb stack-overflow exploit shellcode

我一直致力于exploit-exercises.com" protostar"发行。我目前感到困惑,因为我在stack5上遇到了一个非常奇怪的错误。

我已经通过使用' \ xcc'验证我已成功将控件转移到我的shellcode (SIGTRAP)在我的shellcode开头编码并在GDB中测试它(我现在已经删除了它们)。

为了使它尽可能简单,我的shellcode的目标是让程序以状态1退出。

当我在GDB中运行它时,它成功触发了漏洞并以1的代码退出.Yay!

...

但出于某种原因,当我退出GDB并尝试在shell中运行它时,它给了我一个非法的指令'中断并以132的代码退出。

我使用的shellcode是:  http://repo.shell-storm.org/shellcode/files/shellcode-470.php  稍微调整一下将%eax和%ebx归零,以确保它们是0x80系统调用的正确值。

我用来创建我的漏洞利用文件的命令是:

perl -e 'print "A"x76 . "\x3a\xfd\xff\xbf" . "\x90"x20 . "\x33\xdb\x33\xc0\x40\x43\xcd\x80"' > stack5_exploit

有没有人知道为什么在GDB中运行它会导致不同的输出?

我猜它可能与如何处理0x80中断有关,但我对Windows内部的经验比Linux更多。

2 个答案:

答案 0 :(得分:1)

没关系,我想通了。

gdb执行中的环境变量与正常执行程序时的环境变量不同。

在imgur链接中有一个明显的区别:在gdb中,程序在调试器外部使用其完整路径(/ opt / protostar / bin / stack5)进行调用,使用其相对路径调用(。 / stack5)。

因为argv [0]保存程序的字符串,因为它被调用;把我的有效载荷移到堆栈上,让我错过了我的' \ x90'雪橇。

此外,gdb设置环境变量LINES和COLUMNS,它们可以无效以获得真实的'调试时的地址。

谢谢马蒂亚斯!

评论链接:Buffer overflow works in gdb but not without it

答案 1 :(得分:0)

我没有仔细查看您的测试,但有一点需要注意的是,GDB默认禁用地址空间随机化。通常,这是调试时所需要的,以便变量地址在运行之间保持不变。

我的猜测是,当ASLR开启时,你的漏洞利用不起作用。

您可以要求GDB使用set disable-randomization off命令启用地址随机化。

您也可以在禁用ASLR的情况下在GDB外部运行程序:

setarch -R i386 stack5 < stack5_exploit