首页
社区
课程
招聘
未解决 [求助]gdb在调试so文件的时候怎么确定so文件中函数的虚拟地址?
发表于: 2019-8-19 21:06 6165

未解决 [求助]gdb在调试so文件的时候怎么确定so文件中函数的虚拟地址?

2019-8-19 21:06
6165
各位前辈,最近在做一道CTF逆向题遇到点困难,需要用gdb动态调试clang的编译过程,同时要加载一个clang的插件,由题目提供的一个so文件。我需要能够断下这个so文件中的某个函数,但是我发现,用IDA静态分析so文件的VA地址在gdb中是无法定位到的。

gdb --args clang-3.9 -Xclang -load -Xclang lib0opsPass.so -mllvm -oopsSeed=BAADF00DCAFEBABE3043544620170318 source.c

我执行的是上面的命令开启的动态调试。通过IDA静态分析 lib0opsPass.so 能够得到函数的地址在0x000000000001D054这个位置。但是在gdb中调试的时候

b *0x000000000001D054 之后 continue gdb提示的是无效的断点

Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x1d054

想请教一下各位前辈,我是哪里出问题了

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 161
活跃值: (553)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
0x000000000001D054这个地址是lib0opsPass.so的基地址为 0的时候的值。你要下断点的地址是 lib0opsPass.so基地址+0x000000000001D054,先用gdb看看lib0opsPass.so的基地址吧
2019-8-20 16:25
1
雪    币: 161
活跃值: (231)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3

以下断点在 libc.so 中的 printf 为例

找到 libc.so 在你程序中的加载基址

用gdb载入程序并运行到入口点,用 libs 命令可以找到所有加载的 so 的信息,如下所示:

pwndbg> libs
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
          0x400000           0x401000 r--p     1000 0      /home/crackwiki/test/test
          0x401000           0x402000 r-xp     1000 1000   /home/crackwiki/test/test
          0x402000           0x403000 r--p     1000 2000   /home/crackwiki/test/test
          0x403000           0x404000 r--p     1000 2000   /home/crackwiki/test/test
          0x404000           0x405000 rw-p     1000 3000   /home/crackwiki/test/test
    **0x7ffff7deb000**     0x7ffff7e0d000 r--p    22000 0      /usr/lib64/libc-2.29.so
    0x7ffff7e0d000     0x7ffff7f5a000 r-xp   14d000 22000  /usr/lib64/libc-2.29.so
    0x7ffff7f5a000     0x7ffff7fa6000 r--p    4c000 16f000 /usr/lib64/libc-2.29.so
    0x7ffff7fa6000     0x7ffff7fa7000 ---p     1000 1bb000 /usr/lib64/libc-2.29.so
    0x7ffff7fa7000     0x7ffff7fab000 r--p     4000 1bb000 /usr/lib64/libc-2.29.so
    0x7ffff7fab000     0x7ffff7fad000 rw-p     2000 1bf000 /usr/lib64/libc-2.29.so

0x7ffff7deb000 就是 libc.so 在程序中的加载基址

找到 printf 在 libc.so 中的虚拟地址

我使用radare2来反汇编, 如下所示:

[0x00053220]> pd 10 sym.printf
            ;-- printf:
            ;-- .annobin_printf.c:
            ;-- __printf:
/ (fcn) sym._IO_printf 204
|   sym._IO_printf (int32_t arg11, int32_t arg10, int32_t arg9, int32_t arg8, int32_t arg7, int32_t arg6, int32_t arg5, int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4, int32_t arg_e0h);
| bp: 0 (vars 0, args 0)
| sp: 19 (vars 18, args 1)
| rg: 11 (vars 0, args 11)
|           0x00053220      f30f1efa       endbr64
|           0x00053224      4881ecd80000.  sub rsp, 0xd8
|           0x0005322b      4989fa         mov r10, rdi                ; arg1
|           0x0005322e      4889742428     mov qword [var_28h], rsi    ; arg2
|           0x00053233      4889542430     mov qword [var_30h], rdx    ; arg3
|           0x00053238      48894c2438     mov qword [var_38h], rcx    ; arg4
|           0x0005323d      4c89442440     mov qword [var_40h], r8     ; arg5
|           0x00053242      4c894c2448     mov qword [var_48h], r9     ; arg6
|           0x00053247      84c0           test al, al
|       ,=< 0x00053249      7437           je 0x53282

printf 函数在libc.so中的虚拟地址为: 0x00053220

下断点在 printf

断点地址 = 基址 + 虚拟地址 = 0x7ffff7deb000 + 0x00053220
如下所示:

pwndbg> x /10i 0x7ffff7deb000+0x53220
   0x7ffff7e3e220 <__printf>:    endbr64
   0x7ffff7e3e224 <__printf+4>:    sub    rsp,0xd8
   0x7ffff7e3e22b <__printf+11>:    mov    r10,rdi
   0x7ffff7e3e22e <__printf+14>:    mov    QWORD PTR [rsp+0x28],rsi
   0x7ffff7e3e233 <__printf+19>:    mov    QWORD PTR [rsp+0x30],rdx
   0x7ffff7e3e238 <__printf+24>:    mov    QWORD PTR [rsp+0x38],rcx
   0x7ffff7e3e23d <__printf+29>:    mov    QWORD PTR [rsp+0x40],r8
   0x7ffff7e3e242 <__printf+34>:    mov    QWORD PTR [rsp+0x48],r9
   0x7ffff7e3e247 <__printf+39>:    test   al,al
   0x7ffff7e3e249 <__printf+41>:    je     0x7ffff7e3e282 <__printf+98>

gdb下断点:b *0x7ffff7e3e220

最后于 2019-8-30 15:34 被采臣·宁编辑 ,原因:
2019-8-30 15:33
1
雪    币: 1664
活跃值: (403)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
采臣·宁 # 以下断点在 libc.so 中的 printf 为例 ## 找到 libc.so 在你程序中的加载基址 用gdb载入程序并运行到入口点,用 `libs` 命令可以找到所有加载的 so 的信息, ...
感谢前辈指点!
2019-9-4 18:32
0
游客
登录 | 注册 方可回帖
返回
//