PWN环境搭建

  1. 新建Ubuntu虚拟机

  2. 安装python与pip(可以用python3)

  3. 安装 git,gdb 和 gdb-multiarch,同时安装 binfmt 用来识别文件类型

    1
    2
    sudo apt install git gdb gdb-multiarch
    sudo apt install "binfmt*"
  4. 安装 gdb 的插件 pwndbg(或者 gef 等 gdb plugin)

    1
    2
    3
    git clone https://github.com/pwndbg/pwndbg
    cd pwndbg
    ./setup.sh

    如果安装超时出错参考:Ubuntu安装pwndbg超时处理( Read timed out)

  5. 安装pwntools

    1
    pip install pwntools
  6. 如果要在64位linux下运行32位程序,需要装multilib(测试ubuntu22.04 wsl2不需要)

    1
    sudo apt install gcc-multilib
  7. ~/.local/bin放入环境变量(pwntools自带一些工具)

    1
    2
    # 可以把这一行放入~/.zshrc或~/.bashrc
    export PATH="/home/ylcao/.local/bin/:$PATH"
  8. Libc偏移搜索工具lieanu/LibcSearcher: glibc offset search for ctf.

  9. 更新libc数据库

    1. 删除clone的文件夹里的libc-database,然后

      1
      git clone https://github.com/niklasb/libc-database.git && cd libc-database && ./get ubuntu

使用peda插件(pwndbg安装出现很多问题)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# 载入一个文件
$ gdb {file}
-cd:设置工作目录;
-q:安静模式,不打印介绍信息和版本信息;
-d:添加文件查找路径;
-x:从指定文件中执行GDB指令;
-s:设置读取的符号表文件。
# 或者进入gdb后:
file {file}

# 运行/重新运行
r

# 继续运行
c

# 显示源程序代码的内容,包括各行代码所在的行号
l

# 下断点
b <行号>
b <函数名称>
b *<函数名称>
b *<代码地址> d [编号]
b +/-offset # 在当前暂停位置的偏移下断
tbreak # 只作用一次
rbreak regex # 在正则匹配的函数名开头断点 不会一次消失

# 查看断点
i b
# i 用于查看各类信息

# 删除断点
d 断点序号

# 查看栈
stack <行数>

# 针对源代码的单步
n # 步过
s # 步进

# 针对汇编指令的单步
ni
si

# 显示变量的值
p <value>

# 退出
q

# 查看帮助
h

# 反汇编
disass

# 查看各种数据
x/i
x/s
x/b
# 斜杠后加数字表示查看的数量

# 直接回车进行上一步操作


# 使用命令行参数
gdb --args 命令行+参数等

# backtraces查看堆栈调用:
bt # 显示所有的函数调用栈帧的信息,每个帧一行。
bt n # 显示栈定的n个帧信息。
bt -n # 显示栈底的n个帧信息。
bt full # 显示栈中所有帧的完全信息如:函数参数,本地变量
bt full n # 用发同上。
bt full -n #

例子:BUUCTF T2 rip

载入

查看main函数

给main下断

运行:

⬆︎TOP