您好我正在尝试查找存储数据的内存地址。
这是函数的汇编代码。
0x08048b20 <+0>: push %ebp
0x08048b21 <+1>: mov %esp,%ebp
0x08048b23 <+3>: sub $0x28,%esp
0x08048b26 <+6>: lea -0x14(%ebp),%eax
0x08048b29 <+9>: mov %eax,(%esp)
0x08048b2c <+12>: call 0x8048990 <Gets>
0x08048b31 <+17>: mov $0x1,%eax
0x08048b36 <+22>: leave
0x08048b37 <+23>: ret
我的数据字符串存储在-0x14(%ebp) - (相当正面)。我知道返回地址应为4(%ebp)。我要做的是将返回地址设置为指向我的代码。我不能用汇编来做这件事。我需要知道我的函数启动位置的确切内存位置(我知道它存储在-0x14(%ebp))。任何人都可以帮助我如何获得该位置的记忆位置吗?
此行的地址
0x08048b20 <+0>: push %ebp
0x08048b20是我所在函数的内存位置,而不是%ebp对吗?我的想法是,如果我得到%ebp的内存位置,我可以计算我的函数开始的位置的内存位置。
我正在使用gdb,我不知道如何获取它的内存地址? 请,任何帮助将不胜感激。 谢谢。
修改 当我站在线&lt; + 6&gt;在汇编代码中,我打印%ebp和%esp的值,它们的确具有0x28的精确差异。所以我假设%ebp的地址是我在gdb中打印时得到的值。
但是,当我从该值(0xbfffb5d8)中减去0x14时,给出0xbfffb5c4;它不知道去哪里。如果我已将我的字符串(实际上是反汇编代码的字节代码)存储在-0x14(%ebp),并且我想运行该代码;我不应该把退货地址放到-0x14(%ebp)或我是否完全错误地思考?
答案 0 :(得分:0)
在功能的第一行之前放置一个标签。然后引用标签将为您提供编译函数中第一个操作码的地址。不幸的是,我不明白你的问题不足以帮助你。