Exploit在gdb中工作,但在命令行中不起作用

时间:2015-01-20 15:09:56

标签: c buffer-overflow exploit

我经历过"黑客攻击:剥削艺术"并按照例子。在页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显示的地址与程序实际运行的地址之间是否存在不匹配?提前感谢任何指导。

1 个答案:

答案 0 :(得分:0)

我们不需要在ASLR上绘制,以解释为什么 Exploit在gdb中工作,而不是在命令行上工作。在GDB中运行时,堆栈位置只是稍微移位(在我的系统上,80字节向下),因此需要调整提供的地址0xbffff947以便从shell命令行工作。要验证这一点,只需看一下e。克。

    printf("searchstring = %p\n", searchstring);
<{1>}中的

;你每次从shell运行命令时都会看到一个常量地址,每次从GDB运行时都会看到另一个常量地址。