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

Linux 利用漏洞导致程序在GDB内以不同的值退出?,linux,gdb,stack-overflow,exploit,shellcode,Linux,Gdb,Stack Overflow,Exploit,Shellcode,我一直在开发exploit-exercises.com“protostar”发行版。我现在很困惑,因为我在stack5上遇到了一个非常奇怪的错误 我已经通过在外壳代码的开头使用'\xcc'(SIGTRAP)操作码并在GDB中测试,验证了我成功地将控制权转移到外壳代码(我现在已经删除了它们) 为了使它尽可能简单,我的外壳代码的目标是让程序以1的状态退出 当我在GDB中运行它时,它成功地触发了攻击并以代码1退出。耶 但出于某种原因,当我退出GDB并尝试在shell中运行它时,它会给我一个“非法指令

我一直在开发exploit-exercises.com“protostar”发行版。我现在很困惑,因为我在stack5上遇到了一个非常奇怪的错误

我已经通过在外壳代码的开头使用'\xcc'(SIGTRAP)操作码并在GDB中测试,验证了我成功地将控制权转移到外壳代码(我现在已经删除了它们)

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

当我在GDB中运行它时,它成功地触发了攻击并以代码1退出。耶

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

我使用的外壳代码是: 在开始时对%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丰富得多。

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

我的猜测是,当ASLR打开时,您的漏洞就不起作用了

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

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

setarch -R i386 stack5 < stack5_exploit
setarch-R i386 stack5
没关系,我想出来了

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

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

因为argv[0]在被调用时保存程序的字符串;将有效负载向上移动,导致我错过'\x90'雪橇

此外,gdb设置环境变量行和列,这些行和列可以在调试时为null以获得“真实”地址

谢谢matthias


链接到注释:

虚拟机已禁用aslr。不过还是要谢谢你的建议!