【问题标题】:Get address of system function manually?手动获取系统函数地址?
【发布时间】:2014-04-21 19:31:22
【问题描述】:

我做“打印系统”时如何获取GDB给出的地址?

假设,如果我启动程序然后立即暂停它,然后查看 /proc/$pid/maps 并获取库的基地址。然后我需要在 libc.so.6 中找到 system() 的偏移量并将这两个加在一起。但是,当我在实践中尝试此操作时,我最终得到的地址与 gdb 提供的地址不同。

获取 system() 地址的最佳方法是什么?

请注意,我正在尝试获取另一个程序的地址,而不是我自己编译的那个。

【问题讨论】:

  • 你为什么要这样做?
  • 偏移量是指代码的文件偏移量还是虚拟地址?你明白其中的区别吗?
  • 在 linux 上,函数指针可以转换为 void *.所以例如void *ptr = system; printf("%p\n", ptr); 虽然这可能无法解决您实际尝试做的事情。 `
  • @nos 他可能想侵入另一个进程并让它产生一些其他进程。另一种选择:用他自己的system 调用的东西不起作用,所以他正在寻找异常。如果是这样,那么他可能找错地方了。
  • @nos 我认为这样会打印当前可执行文件中system 存根的地址

标签: c gdb system


【解决方案1】:

获取 system() 地址的最佳方法是什么?

#include <stdio.h>    // printf()
#include <stdlib.h>   // system()
...

...
   {
   int rCode=0;
   int (*system_ptr)(const char *command) = system;
   ...
   rCode=(*system_ptr)("echo \"hello\"");
   ...
   printf("Address of system(): %p\n", system_ptr);
   ...
   }
...

【讨论】:

  • 这可能会打印当前图像中存根的地址,而不是实际代码的地址。 IE。在同一个过程中,不同图像得到的地址会有所不同。
  • 返回系统的PLT地址,不是我要找的。​​span>
【解决方案2】:

没试过,只是有个想法。怎么样:

void* libc = dlopen("libc.so");
void* address = dlsym( libc, "system");

?

【讨论】:

  • 它返回 0xb7e9af10。 GDB 给出的地址是 0xb7e9ef10。非常接近。
  • 您能检查一下这些地址下的内容吗?也许其中一个只包含到另一个的跳转指令?顺便提一句。为什么你真的想要 gdb 显示的值?
  • 我正在做 ret2libc,只有 GDB 中的函数地址有效。当我编译并运行它时,它给了我 0xb7e9af10。当我在 gdb 中打开这个程序并执行“p system”时,我得到了相同的地址(0xb7e9af10)。但是当我打开其他文件并执行“p system”时,我得到 0xb7e9ef10。
  • 在你的程序中,我的代码和 gdb 都同意,所以没有混淆。在您要破解的程序中,系统的地址似乎不同,并且由于它不是您的程序,您不能使用我的代码来确认它-我理解这种情况吗?首先,我会检查/proc/$pid/maps 以查看您的程序是否具有与被黑程序相同的 libc 基地址。可能其他一些 lib 已经占用了 libc 地址空间的一部分,因此需要重新定位 libc 并因此进行更改。
  • ~只是想检查我的系统是否有不同的 libc 加载地址:我运行for i in `ls /proc | grep [0-9]\\\+`; do cat /proc/$i/maps | grep "libc-"; done | grep 00000000 | sort | uniq | wc -l,它显示了不同进程的 34 个不同的基本地址。猜想 ASLR 是有罪的 - 你禁用它了吗?
猜你喜欢
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 2014-06-05
相关资源
最近更新 更多