找到一个没有GDB的函数LIBC的地址

逆向工程
2021-06-22 22:06:03

当 ASLR 未激活时,如何计算 LIBC 中函数的地址。我只有加载 LIBC 的地址(带有ldd /bin/bash)。

谢谢你的解释

编辑:

当我使用你的方法时,我没有得到好的结果,虽然它总体上是好的(我不明白为什么)

libc基本地址

ldd ch33 linux-gate.so.1 => (0xb7fff000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e46000) /lib/ld-linux.so.2 (0x80000000)

系统偏移:

gdb -q /lib/i386-linux-gnu/libc.so.6 gdb$ print system $1 = {<text variable, no debug info>} 0x40310 <__libc_system>

然后我计算 0x40310 + 0xb7e46000 = 0xb7e86310

但是,我应该得到 0xb7e64310

因为: ~$ gdb ch33 gdb$ r Starting program: /challenge/app-systeme/ch33/ch33 ... gdb$ p system $1 = {<text variable, no debug info>} 0xb7e64310 <__libc_system>

1个回答

这可以使用

对象转储:

$ objdump -TC /lib/x86_64-linux-gnu/libc.so.6 | grep " printf$"

0000000000064e80 g    DF .text  00000000000000c3  GLIBC_2.2.5 printf

阅读:

$ readelf -Ws /lib/x86_64-linux-gnu/libc.so.6 | grep " printf@@GLIBC_2.2.5"
   627: 0000000000064e80   195 FUNC    GLOBAL DEFAULT   13 printf@@GLIBC_2.2.5

纳米:

$ nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep " printf$"
0000000000064e80 T printf

数据库:

$ ldd ./shellpointcode               
    linux-vdso.so.1 (0x00007fff3f1e1000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3f9213f000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f3f92732000)
$ gdb -q /lib/x86_64-linux-gnu/libc.so.6
pwndbg: loaded 171 commands. Type pwndbg [filter] for a list.
pwndbg: created $rebase, $ida gdb functions (can be used with print/break)
Reading symbols from /lib/x86_64-linux-gnu/libc.so.6...Reading symbols from /usr/lib/debug//lib/x86_64-linux-gnu/libc-2.27.so...done.
done.
pwndbg> print printf
$1 = {int (const char *, ...)} 0x64e80 <__printf>

那么的有效地址printf将是

0x64e80+0x7f3f9213f000 = 0x7f3f921a3e80