pwn musl libc环境配置

pwn musl libc环境配置

上网找不到能看的资料,太惨了。还是自己看手册把。
原本是符号调试musl libc时碰到的困难,发现不知道怎么符号调试,后面询问别人看到要用dir命令。然后上网查发现并不能查到讲的清楚的。如果下面有写的有问题的,请大家指出。
gdb dir命令手册

起源

源文件在编译时其实不能携带源代码(好像确实,以前以为-g命令就会带上源代码的)而且源代码可能会移动,因此gdb需要一种方法寻找源代码文件的位置。gdb默认会有一个寻找源文件的列表叫做source path
source path有两部分组成,$cdir$cwd

$cdir:compile directory:如果加上了调试信息附加符号-g,$cdir会记录编译时文件夹绝对路径。如果没有加上-g就不会添加。这样也就可以理解为什么加上-g之后gdb可以找到文件源代码的原因了。

$cwd:current working directory当前工作目录。也就是当前gdb运行时目录

下面举一个例子,也是文档中的例子。
如果编译时使用了-g选项记录了源文件路径是/usr/src/foo-1.0/lib/foo.c之后编译的目录是/project/build(为什么两者可以不同?因为有时候编译会包含一些include的文件,不一定会在源文件目录中编译。)之后之前提到的source path 是/mnt/cross:$cdir:$cwd,当前gdb启动位置是/home/user,那么source path 会是

/usr/src/foo-1.0/lib/foo.c
/mnt/cross/usr/src/foo-1.0/lib/foo.c
/project/build/usr/src/foo-1.0/lib/foo.c
/home/user/usr/src/foo-1.0/lib/foo.c
/mnt/cross/project/build/usr/src/foo-1.0/lib/foo.c
/project/build/project/build/usr/src/foo-1.0/lib/foo.c
/home/user/project/build/usr/src/foo-1.0/lib/foo.c
/mnt/cross/foo.c
/project/build/foo.c
/home/user/foo.c

可以看到路径的构造方式:

  1. 源文件路径(第一种)
  2. 编译目录or source path or 启动位置+源文件路径(234种)
  3. 编译目录or source path or 启动位置+编译目录+源文件路径(567种)
  4. 编译目录or source path or 启动位置+源文件名称(8 9 10种)
    总结:好扯,没整明白为什么是这样拼接的

接下来windows下的地址寻找就不详细写了。因为用不到。
当开启gdb的时候,只包含了上述的 $cdir and $cwd,如果要添加文件夹,需要手动输入。比如我们想源码调试musl中的malloc.c文件。
手动添加dir的方式如下所示

directory dirname …
dir dirname …

    Add directory dirname to the front of the source path. Several directory names may be given to this command, separated by ‘:(;’ on MS-DOS and MS-Windows, where ‘:’ usually appears as part of absolute file names) or whitespace. You may specify a directory that is already in the source path; this moves it forward, so GDB searches it sooner.

    The special strings ‘$cdir’ (to refer to the compilation directory, if one is recorded), and ‘$cwd’ (to refer to the current working directory) can also be included in the list of directories dirname. Though these will already be in the source path they will be moved forward in the list so GDB searches them sooner.

源代码调试二进制文件

可以看到,如果我们添加dir /home就相当于在source path下面直接添加了一个文件夹,之后由于编译的时候我们include了malloc.c文件,就可以源码调试malloc文件。但是!这样没有debug symbol。
用如下方式添加源代码路径,注意要添加的是源代码路径的上层文件夹。(例如malloc.c在文件夹/home/src/aaaa/malloc.c中,就写命令
dir /home/src/aaaa 如下图
在这里插入图片描述如下图是调试过程中malloc的源代码显示。
在这里插入图片描述
但是如果换成了strip过的binary,发现也是可以的,太震惊了。
在这里插入图片描述

为musl libc添加debug symbol

首先我们要获取有debug symbol的libc。在glibc中,我们是添加.debug文件夹里面放入debug symbol。但是musl libc似乎不同,因为他不是一个文件夹。首先要编译一份带调试符号的libc,这一步中的prefix可以不用它提供的地址,写自己的地址即可。
编译musllibc
在网站上下载到的是.ddeb文件,还不知道是干什么的,上网搜索了一番。好不容易找到了
ddeb文件是什么
但是没有讲怎么添加调试符号,无果。


10.21更新
原来是pwndbg里面,heap只能用于查看heap段的信息,而musllibc中,heap是和libc整合在一起的。。。
直接输出结构体信息即可。但是注意:这样操作需要libc.so有调试符号。具体怎么获得有调试符号的musl libc,如果题目中没有给(用gdb ./libc.so看有没有load symbol)就需要自己编译。参考上面的网站编译musllibc即可。
在这里插入图片描述
最后再给出一个musl libc源码下载的地址,亲测下载到的.ddeb文件没什么用处。musl源码下载地址

总结

  1. 编译带有调试符号的musl libc,确保libc.so有符号
  2. dir命令使用方法,查看源码调试。
  3. 在pwntools里面启动时io = process('./libc.so','pwn')
  4. 不能用heap等命令查看结构体,p mal.bins即可。

参考链接在文章中都有。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值