正如标题所说,我试图获取帧中存储的EIP的地址.对于这个简单的程序:
func1(int a, int b)
{
int x = 1;
}
int main(void)
{
func1(1,2);
}
Run Code Online (Sandbox Code Playgroud)
我的gdb反汇编是:
(gdb) disassemble main
Dump of assembler code for function main:
0x08048430 <main+0>: push %ebp
0x08048431 <main+1>: mov %esp,%ebp
0x08048433 <main+3>: sub $0x8,%esp
0x08048436 <main+6>: add $0xfffffff8,%esp
0x08048439 <main+9>: push $0x2
0x0804843b <main+11>: push $0x1
0x0804843d <main+13>: call 0x8048410 <func1>
0x08048442 <main+18>: add $0x10,%esp
0x08048445 <main+21>: mov %ebp,%esp
0x08048447 <main+23>: pop %ebp
0x08048448 <main+24>: ret
End of assembler dump.
Run Code Online (Sandbox Code Playgroud)
从GDB打印的堆栈框架:
(gdb) info frame
Stack level 0, frame at 0xffbfdda0:
eip = 0x8048416 in func1 (t.c:3); saved eip 0x8048442
called by frame at 0xffbfddc0
source language c.
Arglist at 0xffbfdd98, args: a=1, b=2
Locals at 0xffbfdd98, Previous frame's sp is 0xffbfdda0
Saved registers:
ebp at 0xffbfdd98, eip at 0xffbfdd9c
Run Code Online (Sandbox Code Playgroud)
info frame不提供保存的eip的地址,它只显示save eip的值.
我在func1上设置了一个断点,然后打印了帧信息.保存的EIP的值为0x8048442,与反汇编中的值相对应.我很困惑,如何计算EIP(0x8048442)所在的地址?
我检查了地址0x8048412(0x8048416 - 4),但它不包含已保存的EIP地址.
您需要检查arg列表前的区域.它告诉你:eip at 0xffbfdd9c
.
该地址是arg列表前的4个字节 - 0xffbfdd98
.请记住,列表增长,因此"x之前的4个字节"表示"x + 4".
该saved eip 0x8048442
信息是在哪里做的EIP点,这是在文本部分,而不是在堆栈.
归档时间: |
|
查看次数: |
4409 次 |
最近记录: |