获取返回地址GDB

Joe*_*Joe 12 gdb

我最近开始在课堂上使用GDB而且我一直在苦苦挣扎.我有一个任务,我必须进行实验1练习2,需要我在代码中搜索两个漏洞,并使用它们执行以下操作:

第一个必须覆盖堆栈上的返回地址,第二个必须覆盖您将用来接管程序控制流的其他一些数据结构.

我已经溢出了数据结构,我认为它正在谈论的是EIP,它指向它将执行的其他指令.

现在我如何到达帧的返回地址(RET)?任何帧,没关系,我只想知道如何计算RET和ESP之间的字节,这样我就可以减去它并获得长度.我刚开始使用GDB,所以请放轻松.

mof*_*foe 20

现在我如何到达帧的返回地址(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
Run Code Online (Sandbox Code Playgroud)

注意saved eip = 0xf7e3ca63eip at 0xffffd6fc.在这种情况下,您将要覆盖该值,0xffffd6fc以便在函数返回执行时将继续存储在那里的值.

  • 所以我想覆盖指令指针(EIP)?这引出了另一个问题:我不明白 EIP 和 RET 之间的区别。EIP 不是要指向下一条指令,RET 是程序在进入函数之前存储的保存地址吗?RET 和 EIP 如何相互关联? (3认同)
  • 是的,`RET`是存储的`EIP`.`call`指令将把下一条指令的地址存储在堆栈中.在函数结尾中,`ret`指令将````从堆栈"弹出"到`EIP`寄存器.当你覆盖`RET`时,这是你获得程序流控制权的那一刻.您可以在此处阅读有关函数pro和epilogue的更多信息:https://en.wikipedia.org/wiki/Function_prologue (3认同)