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

时间:2011-11-20 10:54:40

标签: assembly buffer-overflow

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

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

0x55683984:     0x5568398c   0x...(old r.a)      0x68e322a1      0x0000c31c
0x55683994:     0xf7fa9400      0x0804a3d7       0x556839c0      0xf7e518d0

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

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

Program received signal SIGSEGV, Segmentation fault.
0x5568398c in ?? ()
(gdb) x 0x5568398c
0x5568398c: 0x68e322a1

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

2 个答案:

答案 0 :(得分:6)

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

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

(gdb) disassemble 0x7fffffffbb00,0x7fffffffbbff

答案 1 :(得分:4)

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

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