C语言 漏洞利用在 gdb 中有效,但在命令行上无效



我一直在经历"黑客:剥削的艺术"并遵循示例。 在第 145 页,作者演示了如何使用存储在环境变量中的 shellcode 来利用 notesearch.c 程序。 埃里克森这样做了:

./notesearch $(perl -e 'print "\x47\xf9\xff\xbf"x40')

在命令行上,这对我不起作用,但在 GDB 中,键入

Run $(perl -e 'print "\x47\xf9\xff\xbf"x40')

确实有效。

笔记:当然,由于 CPU 中的保护,他上面的地址与我的地址不同,但我只是按照他的例子在 gdb 中运行 notesearch,在环境变量中获取 shellcode 的地址,并向其添加 100:

(GDB) x/s 0xbffff8e3 + 100

当然,我的地址与他的上述地址不同,但仍然检查了所有内容,但没有用。

****但****

当我在 GDB 中运行他的漏洞利用代码时,它工作正常。

Run $(perl -e 'print "\x47\xf9\xff\xbf"x40')

那为什么会

Run $(perl -e 'print "\x47\xf9\xff\xbf"x40')

在 gdb 中工作,给我一个根外壳,但

./notesearch $(perl -e 'print "\x47\xf9\xff\xbf"x40')

在命令行上不起作用? 地址随机化是否在 gdb 中关闭,但在操作系统中未关闭? GDB 显示的地址与程序实际运行的地址之间是否存在不匹配? 提前感谢您的任何指导。

我们不需要利用 ASLR 来解释为什么 Exploit 在 gdb 中工作,但在命令行上不起作用。在 GDB 中运行时,堆栈位置只是移动了一点(在我的系统上,向下移动了 80 字节),因此需要调整提供的地址0xbffff947以从 shell 命令行工作。要验证这一点,只需通过放置例如

    printf("searchstring = %pn", searchstring);

notesearch.c 中,每次从命令行管理程序运行命令时,您可能会看到一个常量地址,每次从 GDB 运行时,您可能会看到另一个常量地址。

最新更新