C 利用漏洞可以在gdb中工作,但不能在命令行中工作

C 利用漏洞可以在gdb中工作,但不能在命令行中工作,c,buffer-overflow,exploit,C,Buffer Overflow,Exploit,我一直在学习“黑客:剥削的艺术”并遵循这些例子。在第145页,作者演示了如何使用存储在环境变量中的外壳代码利用notesearch.c程序。Erickson通过以下方式实现这一点: ./notesearch$(perl-e“print”\x47\xf9\xff\xbf“x40”) 在命令行中,这对我不起作用,但在GDB中,输入 运行$(perl-e“print”\x47\xf9\xff\xbf“x40”) 确实有效 注: 当然,由于CPU中的保护,上面的地址与我的地址不同,但我只是按照他的示例在

我一直在学习“黑客:剥削的艺术”并遵循这些例子。在第145页,作者演示了如何使用存储在环境变量中的外壳代码利用notesearch.c程序。Erickson通过以下方式实现这一点:

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

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

运行$(perl-e“print”\x47\xf9\xff\xbf“x40”)

确实有效

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

(gdb)x/s 0xbffff8e3+100

当然,我的地址与上面的地址不同,但仍然,所有内容都已签出,但它不起作用

****但是****

当我在GDB中运行他的攻击代码时,它工作正常

运行$(perl-e“print”\x47\xf9\xff\xbf“x40”)

那么为什么会呢

运行$(perl-e“print”\x47\xf9\xff\xbf“x40”)

在gdb工作,给我一个根shell,但是

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


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

我们不需要借助ASLR来解释为什么漏洞利用可以在gdb中工作,但不能在命令行中工作。在GDB中运行时,堆栈位置只需移动一点(在我的系统上,向下移动80字节),因此需要调整提供的地址
0xbfff947
,以便从shell命令行开始工作。要验证这一点,只需在。g

    printf("searchstring = %p\n", searchstring);

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

我猜地址随机化在GDB和操作系统中都起作用。每个程序运行时,地址都是随机的,因此程序独立运行时的地址与您以前使用GDB提取的地址不匹配。谢谢Jonas,我很担心这一点。这对我来说是一个很好的练习,但对于其他正在挣扎的人来说,当一个已演示的漏洞不能像所描述的那样工作时,尤其是当提供了VM和代码时,它确实会弄乱局面。从我的角度来看,这只是一个猜测(这就是为什么我没有提供答案),可能还有其他原因导致这种行为。有证据和/或经验的人可能能够就此做出明确的陈述。