【问题标题】:gdb showing different address for the same function?gdb显示相同功能的不同地址?
【发布时间】:2020-10-31 14:55:34
【问题描述】:

所以我想练习做一个 ret2libc 攻击,我在这个简单的程序上玩弄 gdb

// File: retlib.c

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("system = %p\n", system);
    char c[] = "echo 123";
    system(c);

    return 0;
}

现在注意这一点

Reading symbols from ./retlib...(no debugging symbols found)...done.
(gdb) p system
$1 = {<text variable, no debug info>} 0x4004b0 <system@plt>
(gdb) b main
Breakpoint 1 at 0x4005ea
(gdb) r
Starting program: /home/users/mickey/retlib 

Breakpoint 1, 0x00000000004005ea in main ()
(gdb) p system
$2 = {<text variable, no debug info>} 0x7ffff7a523a0 <__libc_system>
(gdb) c
Continuing.
system = 0x4004b0
123
[Inferior 1 (process 11593) exited normally]

我的问题是,为什么我会得到 system 函数地址的 2 个不同输出。甚至在我开始运行程序之后,gdb 命令说一件事,而 printf 说另一件事。我注意到每个地址的标签都不一样,但是为什么会这样呢?任何帮助将不胜感激!

【问题讨论】:

  • 不是说system 两次都在0x4004b0 吗?
  • @JohnnyMopp 是的,但是我第二次输入 p system 它给了我一个不同的地址。
  • Reading symbols from ./retlib...(no debugging symbols found)...done. 你在编译时使用-g 标志吗?
  • printf("system = %p\n", system); 没有指定打印函数地址的方式,它是UB。 printf("system = %p\n", (void*) system); 稍微好一点。没有很好的方法来打印 function 地址
  • @DavidRanieri 嗯,实际上不,我出于某种原因没有添加该标志......但我尝试使用 -g 标志并发生同样的事情。

标签: c debugging gdb


【解决方案1】:

在运行程序之前,gdb会给你过程链接表(.plt)地址,运行之后,是libc函数地址。

【讨论】:

  • 哪一个是用于返回 libc 攻击的有效返回地址?
  • @DaMike 见this
  • @DaMike 没有区别,任何一个最终都会调用system
猜你喜欢
  • 2015-12-22
  • 2012-10-25
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
相关资源
最近更新 更多