我正在尝试针对给定的易受攻击的代码执行缓冲区溢出攻击。 但似乎它出错了,因为虽然我的漏洞利用字符串不会破坏堆栈,但我无法使汇编代码(嵌入在漏洞利用字符串中)工作。
这是执行我要攻击的程序的'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
当我能够看到地址中导致段错误的内容时,怎么会发生这种情况?
答案 0 :(得分:6)
默认情况下disassemble
打印出当前函数的代码。在你的情况下,程序计数器指向某处堆栈,gdb不会理解当前函数的边界在哪里。这就是错误信息的原因。
但您可以手动指定要反汇编的地址范围:
(gdb) disassemble 0x7fffffffbb00,0x7fffffffbbff
答案 1 :(得分:4)
好的,这是我忘记在汇编代码中的movl指令中的地址前放置'$'的故事。因此,程序试图访问导致分段错误的未定义内存地址。
但是,我不喜欢GDB通过说“没有函数包含所选帧的程序计数器”来通知这种情况的方式