gpt4 book ai didi

c - 如何计算存储的EIP地址

转载 作者:太空狗 更新时间:2023-10-29 15:58:43 26 4
gpt4 key购买 nike

正如标题所说,我正在尝试获取框架中存储的EIP的地址。对于这个简单的程序:

func1(int a, int b)
{
int x = 1;
}

int main(void)
{
func1(1,2);
}

我的 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.

从 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

info frame不提供保存eip的地址,只是显示保存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指向哪里的,在文本部分,不在栈中。

关于c - 如何计算存储的EIP地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16847979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com