没有函数包含所选帧的程序计数器

bfa*_*lar 7 assembly buffer-overflow

我试图为给定的易受攻击的代码执行缓冲区溢出攻击.但它似乎是错误的,因为虽然我的漏洞利用字符串不会破坏堆栈,但我无法使我的汇编代码(嵌入在漏洞利用字符串中)起作用.

这是执行我要攻击的程序的'ret'指令之前的一段内存值.

0x55683984:     0x5568398c   0x...(old r.a)      0x68e322a1      0x0000c31c
0x55683994:     0xf7fa9400      0x0804a3d7       0x556839c0      0xf7e518d0
Run Code Online (Sandbox Code Playgroud)

在这一点上,事情出错了,因为它无法弹出堆栈并使%eip指向弹出值?所以我的漏洞汇编代码不起作用.(0x68e322a1 0x0000c31c)Gdb说没有函数包含所选帧的程序计数器.当我尝试在没有调试的情况下执行它时,它会导致分段错误.

这个问题与我的装配长度有关吗?(在这种情况下是6)?

Program received signal SIGSEGV, Segmentation fault.
0x5568398c in ?? ()
(gdb) x 0x5568398c
0x5568398c: 0x68e322a1
Run Code Online (Sandbox Code Playgroud)

当我能够看到导致段错误的地址内部时,怎么会发生这种情况?

les*_*nik 8

默认disassemble打印出当前函数的代码.在你的情况下,程序计数器指向某处堆栈,gdb不会理解当前函数的边界在哪里.这就是错误信息的原因.

但您可以手动指定要反汇编的地址范围:

(gdb) disassemble 0x7fffffffbb00,0x7fffffffbbff
Run Code Online (Sandbox Code Playgroud)

  • 非常好的技巧.或者,您可以使用反汇编$ rip,$ rip + offset,这可以减轻找出堆栈框架位置的痛苦. (3认同)

bfa*_*lar 5

好的,这是我忘记在汇编代码中的movl指令中的地址前面放置“ $”的故事。因此,程序试图访问未定义的内存地址,这会导致分段错误。

但是,我不喜欢GDB通过说“没有函数包含所选帧的程序计数器”来通知这种情况的方式