Gdb 为什么不执行EIP内容?

Gdb 为什么不执行EIP内容?,gdb,buffer-overflow,exploit,stack-smash,Gdb,Buffer Overflow,Exploit,Stack Smash,我使用缓冲区溢出并在堆栈中的ret地址上写入。当我用gdb调试它时,我知道eip设置为我想要的地址。地址是libc中的一个小工具。指令的操作码设置正确,但它只是不执行指令,我收到以下消息: 0xb7fa9dd8 in ?? () from /lib/i386-linux-gnu/libc.so.6 为什么??这是什么信息 请查看以下数据: (gdb) x $eip 0xb7fa9dd8: 0xfff2a858 要执行的小工具是: 184dd8: 58

我使用缓冲区溢出并在堆栈中的ret地址上写入。当我用gdb调试它时,我知道eip设置为我想要的地址。地址是libc中的一个小工具。指令的操作码设置正确,但它只是不执行指令,我收到以下消息:

0xb7fa9dd8 in ?? () from /lib/i386-linux-gnu/libc.so.6
为什么??这是什么信息

请查看以下数据:

(gdb) x $eip
 0xb7fa9dd8:    0xfff2a858
要执行的小工具是:

184dd8: 58                      pop    %eax
184dd9: a8 f2                   test   $0xf2,%al
184ddb: ff a8 00 00 00 00       ljmp   *0x0(%eax)

好吧,看看它,它看起来像是你在把控制权转移到堆栈上的某个位置,而不是转移到你想要执行的“小工具”。也可能是
pop%eax
然后
ljmp*0x0(%eax)
将控制转移到您不期望的位置。堆栈很可能被标记为不可执行。非常感谢您的回答。但地址0xb7fa9dd8正好是(184dd8+b7e25000),其中b7e25000是执行时加载到内存中的libc的基。我不需要使堆栈可执行,我不向它注入任何代码。只需使用系统中可用的代码,将eip传输到该地址即可。ljmp*0x0(%eax)应跳转到libc中的另一个地址。