好的,所以我试图了解缓冲区溢出,并且有一个易受BoF攻击的简单程序,因为它将第一个参数复制到5个字符的缓冲区中。在源代码中,有一个名为bar的函数永远不会被程序调用。我的目标是溢出缓冲区并运行该功能。
所以我将它加载到gdb中并输入了disass bar。前几行看起来像这样:
(gdb) disas bar
Dump of assembler code for function bar:
0x0000000000400988 <+0>: push %rbp
基本上,我所要做的就是将地址0x00400988放入溢出缓冲区的末尾。当我溢出变量时,我计算了返回地址为36字节。
所以在GDB中我使用命令set args $(perl -e&#39; print&#34; A&#34; x 36。&#34; \ x88 \ x09 \ x40 \ x00&#34;&# 39)
我在strcpy运行后立即设置断点并检查了rsp的20个单词:
(gdb) x/40xw $rsp
0x7fffffffe240: 0xffffe358 0x00007fff 0x00000000 0x00000003
0x7fffffffe250: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffe260: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffe270: 0x41414141 0x00000088 0xf7a54b45 0x00007fff
0x7fffffffe280: 0x00000000 0x00000000 0xffffe358 0x00007fff
我的问题是返回地址没有正确复制。如您所见,它只复制十六进制值88(我想在缓冲区的开头是00。
这是我到目前为止所尝试的内容: 我试图重新编译并检查是否存在返回地址的问题。
我试图将地址的十六进制值更改为随机值,并且似乎要复制。例如,我试图将值0x85af4709复制到该位置并且它有效。事实上,我发现原来地址中的09是导致问题的原因。例如,我能够使地址0x00400788,但它不能是0x00400788。
话虽这么说,我发现ascii中的07是一个铃,可以写成\ a。即使我这样做,我也得到了原始问题。
之后,我尝试调整&#34; A&#34; s我将复制到缓冲区以查看是否有任何影响。它没有。
我甚至尝试在gdb
中键入run时写出字符串然后,我搜索了这个问题,并找到了一个非常好的例子,说明我正在尝试做什么。我使用了本文第32页的示例程序: https://engineering.purdue.edu/kak/compsec/NewLectures/Lecture21.pdf
令我惊讶的是,我在我的程序中所做的正是我想要在作者示例程序中工作的。
作为结论,我想知道是否有人能够解释为什么地址中的一个位置可以包含除我要复制到其中的任何十六进制值之外的任何十六进制值。除此之外,我不知道如何解决这个问题。
如果您希望任何其他信息ID非常乐意将其提供给您