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即可。

参考链接在文章中都有。

### 如何在Ubuntu上设置PWN环境 #### 准备工作 为了顺利地进行PWN练习,建议使用Linux发行版作为主要的操作系统。对于初学者来说,Ubuntu是一个很好的选择[^2]。 #### 安装必要的软件包 在开始之前,确保已经更新了系统的软件源列表,并安装了一些基本的依赖项: ```bash sudo apt update && sudo apt upgrade -y sudo apt install build-essential git python3-pip nasm libc6-dbg gdb-multiarch qemu-user-static binutils-aarch64-linux-gnu binutils-arm-none-eabi -y ``` 这些命令将会安装编译器、Git版本控制系统以及Python pip工具等必要组件;同时也包含了用于调试目的`libc6-dbg`库文件和多架构支持下的GDB调试器。 #### 配置gdb-peda插件 为了更高效地完成逆向工程任务,可以考虑为GNU Debugger (GDB) 添加peda扩展功能来增强其交互体验: ```bash git clone https://github.com/longld/peda.git ~/peda echo "source ~/peda/peda.py" >> ~/.gdbinit ``` 这段脚本会在用户的家目录下克隆一份最新的PEPDA项目副本,并将其加载至每次启动GDB时自动应用。 #### 设置ROPgadget与pwntools框架 这两个工具是解决CTF竞赛中的二进制题目可或缺的好帮手之一。可以通过pip来进行快速部署: ```bash pip3 install --upgrade ropgadget pwntools ``` 这一步骤能够帮助获取最新稳定版的ROPgadget 和 Pwntools Python库,从而简化后续开发流程。 #### 测试环境有效性 最后通过执行简单的C程序验证当前配置是否正常运作: ```c #include <stdio.h> int main(){ printf("Hello, world!\n"); return 0; } ``` 保存上述代码片段到名为hello.c的新建文档里,接着按照下面的方式对其进行编译链接操作: ```bash gcc hello.c -o hello -no-pie -fno-stack-protector ./hello ``` 如果一切顺利,则说明现在拥有了一个适合开展PWN学习的基础平台。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值