我经历过"黑客攻击:剥削艺术"并按照例子。在页145,作者演示了如何利用存储在环境变量中的shellcode来利用notesearch.c程序。埃里克森用以下方法做到了这一点:
./ notesearch $(perl -e' print" \ x47 \ xf9 \ xff \ xbf" x40')
在命令行中,这对我不起作用,但在GDB中,输入
运行$(perl -e' print" \ x47 \ xf9 \ xff \ xbf" x40')
确实有效。
注意: 当然,由于CPU中的保护,上面的地址与我的地址不同,但我只是通过在gdb中运行notesearch,在环境变量中获取shellcode的地址,为其添加100来跟随他的示例:
(gdb)x / s 0xbffff8e3 + 100
当然,我的地址与上述地址不同,但仍然检查了所有内容,但它没有用。
**** **** BUT
当我在GDB中运行他的漏洞利用代码时,它运行正常。
运行$(perl -e' print" \ x47 \ xf9 \ xff \ xbf" x40')
那为什么会
运行$(perl -e' print" \ x47 \ xf9 \ xff \ xbf" x40')
在gdb中工作,给我一个root shell但是
命令行上的./ notesearch $(perl -e' print" \ x47 \ xf9 \ xff \ xbf" x40')
无法工作?地址随机化是在gdb中关闭但在操作系统中没有关闭? GDB显示的地址与程序实际运行的地址之间是否存在不匹配?提前感谢任何指导。
答案 0 :(得分:0)
我们不需要在ASLR上绘制,以解释为什么 Exploit在gdb中工作,而不是在命令行上工作。在GDB中运行时,堆栈位置只是稍微移位(在我的系统上,80字节向下),因此需要调整提供的地址0xbffff947
以便从shell命令行工作。要验证这一点,只需看一下e。克。
printf("searchstring = %p\n", searchstring);
<{1>}中的;你每次从shell运行命令时都会看到一个常量地址,每次从GDB运行时都会看到另一个常量地址。