我一直致力于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更多。
答案 0 :(得分:1)
没关系,我想通了。
gdb执行中的环境变量与正常执行程序时的环境变量不同。
在imgur链接中有一个明显的区别:在gdb中,程序在调试器外部使用其完整路径(/ opt / protostar / bin / stack5)进行调用,使用其相对路径调用(。 / stack5)。
因为argv [0]保存程序的字符串,因为它被调用;把我的有效载荷移到堆栈上,让我错过了我的' \ x90'雪橇。
此外,gdb设置环境变量LINES和COLUMNS,它们可以无效以获得真实的'调试时的地址。
谢谢马蒂亚斯!
答案 1 :(得分:0)
我没有仔细查看您的测试,但有一点需要注意的是,GDB默认禁用地址空间随机化。通常,这是调试时所需要的,以便变量地址在运行之间保持不变。
我的猜测是,当ASLR开启时,你的漏洞利用不起作用。
您可以要求GDB使用set disable-randomization off
命令启用地址随机化。
您也可以在禁用ASLR的情况下在GDB外部运行程序:
setarch -R i386 stack5 < stack5_exploit