Ubuntu下PWN环境配置小结

前言

简单梳理Pwn环境的搭建过程。

环境

  1. Ubuntu 16.04.7
  2. Python 3.5.2
  3. Python 2.7.12

常用软件

pwntools

一个ctf框架和漏洞利用python库。

1
2
3
4
5
6
7
8
9
# python3 
sudo apt-get install python3-pip python3-dev git libssl-dev libffi-dev build-essential
python3 -m pip install --upgrade pip==20.3.4
python3 -m pip install --upgrade pwntools

# python2
sudo apt-get install python-pip python-dev git libssl-dev libffi-dev build-essential
python2 -m pip install --upgrade pip==20.3.4
python2 -m pip install --upgrade pwntools

gdb

动态调试软件。

1
sudo apt-get install gdb

peda/gef/pwndbg

gdb的三个插件,配合gdb使用可以提升调试效率。

  1. peda

    1
    git clone https://github.com/longld/peda.git ~/peda
  2. gef

    1
    2
    wget -q -O- https://github.com/hugsy/gef/raw/master/scripts/gef.sh | sh
    wget -q -O ~/gef/.gdbinit-gef.py https://github.com/hugsy/gef/raw/master/gef.py
  3. pwndbg

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

在同一时刻只能使用一种插件,而且在解决不同类型的题目时使用不同的插件,因此需要配置三种插件的快捷切换。

  • 找到文件.gdbinit,一般在根目录下,一般安装好pwndbg之后出现,内容为source ~/pwndbg/gdbinit.py,上述语句控制gdb使用的插件类型。

  • 加一个可以识别的字符串#this place is controled by user's shell,不管是什么,需要注释并且不能与别的位置重复,并且需要把原来的source注释。

    1
    2
    # source ~/pwndbg/gdbinit.py
    # this place is controled by user's shell
  • 编写shell脚本:

    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
    #!gdbstart.sh
    #!/bin/bash
    function Mode_change {
    name=$1
    gdbinitfile=~/.gdbinit #路径按实际情况修改

    peda="source ~/peda/peda.py" #路径按实际情况修改
    gef="source ~/.gef/.gdbinit-gef.py" #这个路径按照你的实际情况修改
    pwndbg="source /pwndbg/gdbinit.py" #这个路径按照你的实际情况修改

    sign=$(cat $gdbinitfile | grep -n "#this place is controled by user's shell")
    #此处上面的查找内容要和文件'.gdbinit'保持一致

    pattern=":#this place is controled by user's shell"
    number=${sign%$pattern}
    location=$[number+2]

    parameter_add=${location}i
    parameter_del=${location}d

    message="TEST"

    if [ $name -eq "1" ];then
    sed -i "$parameter_del" $gdbinitfile
    sed -i "$parameter_add $peda" $gdbinitfile
    echo -e "Please enjoy the peda!\n"
    elif [ $name -eq "2" ];then
    sed -i "$parameter_del" $gdbinitfile
    sed -i "$parameter_add $gef" $gdbinitfile
    echo -e "Please enjoy the gef!\n"
    else
    sed -i "$parameter_del" $gdbinitfile
    sed -i "$parameter_add $pwndbg" $gdbinitfile
    echo -e "Please enjoy the pwndbg!\n"
    fi

    }

    echo -e "Please choose one mode of GDB?\n1.peda 2.gef 3.pwndbg"

    read -p "Input your choice:" num

    if [ $num -eq "1" ];then
    Mode_change $num
    elif [ $num -eq "2" ];then
    Mode_change $num
    elif [ $num -eq "3" ];then
    Mode_change $num
    else
    echo -e "Error!\nPleasse input right number!"
    fi

    gdb $1 $2 $3 $4 $5 $6 $7 $8 $9
  • 把shell脚本放到一个环境变量指向的路径里面,随便一个位置即可。

  • 检验效果如下。

32位程序支持

支持32位程序

1
sudo apt-get install libc6-dev-i386

qemu

ARM的PWN环境。

1
2
3
4
5
6
# 安装qemu
sudo apt-get install qemu
sudo apt-get install qemu-system qemu-user-static binfmt-support
# 安装依赖库
sudo apt-get install -y gcc-arm-linux-gnueabi
sudo apt-get install qemu libncurses5-dev gcc-arm-linux-gnueabi build-essential gdb-arm-none-eabi synaptic gcc-aarch64-linux-gnu eclipse-cdt git

LibcSearcher

泄露libc库中函数的偏移的库。

1
2
3
4
5
6
7
8
9
10
11
12
sudo pip install capstone
git clone https://github.com/lieanu/LibcSearcher.git
cd LibcSearcher
sudo python2 setup.py develop
sudo python3 setup.py develop

e.g.
from LibcSearcher import *
obj = LibcSearcher("fgets", 0X7ff39014bd90)
obj.dump("system")
obj.dump("str_bin_sh")
obj.dump("__libc_start_main_ret")

ROPgadget

用于寻找gadget。首先需要安装Capstone,一个轻量级的多平台架构支持的反汇编架构。

1
2
3
4
5
6
7
8
9
sudo apt-get install python-capstone
git clone https://github.com/JonathanSalwan/ROPgadget.git
cd ROPgadget
sudo python setup.py install

e.g.
ROPgadget --binary elf --only 'pop|ret' | grep 'eax'
ROPgadget --binary elf --string "/bin/sh"
ROPgadget --binary elf --only 'int'

one_gatget

用于寻找寻找libc库中的execve(‘/bin/sh’, NULL, NULL)可以一个gadget就可以getshell的位置。

1
2
3
4
sudo add-apt-repository ppa:brightbox/ruby-ng
sudo apt-get install ruby2.6 ruby2.6-dev
sudo apt-get install gem
sudo gem install one_gadget

————————未完待续————————