我最近开始在课堂上使用GDB而且我一直在苦苦挣扎。我有an assignment,我必须在那里进行实验1练习2,这需要我在代码中搜索两个漏洞并使用它们执行以下操作:
第一个必须覆盖堆栈上的返回地址,第二个必须覆盖您将用来接管程序控制流的其他一些数据结构。
我已经溢出了数据结构,我认为它正在谈论的是EIP,它指向它将执行的其他指令。
现在我如何到达帧的返回地址(RET)?任何框架,它都无关紧要,我只想知道如何计算RET和ESP之间的字节,这样我就可以减去它并得到长度。我刚开始使用GDB,所以请放轻松。
答案 0 :(得分:17)
现在我如何到达帧的返回地址(RET)?
要获取特定函数的存储返回地址的位置,可以在该函数上放置断点并使用info frame
命令。
以下是一个例子:
gdb /path/to/binary
(gdb) br main
(gdb) run
Starting program: /path/to/binary
Breakpoint 1, 0x08048480 in main ()
(gdb) info frame
Stack level 0, frame at 0xffffd700:
eip = 0x8048480 in main; saved eip = 0xf7e3ca63
Arglist at 0xffffd6f8, args:
Locals at 0xffffd6f8, Previous frame's sp is 0xffffd700
Saved registers:
ebp at 0xffffd6f8, eip at 0xffffd6fc
请注意saved eip = 0xf7e3ca63
和eip at 0xffffd6fc
。
在这种情况下,您需要覆盖0xffffd6fc
处的值,以便在函数返回执行时将继续存储在那里的值。