启动!

一键起飞套装

sudo dpkg --add-architecture i386
sudo apt update
sudo apt install -y build-essential jq strace ltrace curl wget rubygems tmux gcc dnsutils netcat-traditional gcc-multilib net-tools vim gdb gdb-multiarch patchelf zip unzip python3-full ipython3 python-is-python3 python3-pip python3-dev lib32z1 libssl-dev libc6-dev-i386 libffi-dev wget git make procps libpcre3-dev libdb-dev libxt-dev libxaw7-dev libc6:i386 libstdc++6:i386 
sudo gem install one_gadget seccomp-tools
pip3 install capstone requests pwntools r2pipe ropper -i https://pypi.tuna.tsinghua.edu.cn/simple

cd ~
wget timlzh.com/files/gdbInit.zip
unzip gdbInit.zip

然后就能直接开个tmux,然后直接gdb即可,超级舒服的分屏,很黑客!

图 1

~/pwninit用来初始化pwn题做题环境

#!/bin/bash
for file in $(ls); do
    fileType=$(file $file)

    if [[ $fileType == *"ELF"* ]]; then
        chmod +x $file
        echo ======$file======
        echo $fileType
        echo ""
        checksec $file
        echo =================
        echo ""
    fi
done

# Create exp.py
if [[ ! -f "exp.py" ]]; then
echo "Create exp.py"
cat > exp.py << EOF
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import *
from pwn import p64, u64, p32, u32
import os

context.log_level = 'debug'
context.arch = 'amd64'

host = '127.0.0.1'
port = 10001
fileName = './pwn'
# libcName = './libc.so.6'
r = process(fileName)
# r = remote('127.0.0.1', 10001)
# r = remote(host, port)
elf = ELF(fileName)
# libc = ELF(libcName)

def debug(p, cmd = ''):
    if os.environ.get('VSCODE_INJECTION', None):
        return
    gdb.attach(p, cmd)
    pause()

debug(r)

payload = cyclic(0x10 + 8) + p64(114514)
r.sendlineafter(b'\n', payload)

r.interactive()
EOF

fi
chmod +x exp.py

GDB,我直接手撕

命令 作用
b *0x400000 在地址0x400000处设置断点
b *main 在main函数处设置断点
r run,运行程序
c continue,继续执行
n next,执行下一条语句
s step into,进入函数
p [exp] print,打印变量

x命令的格式为x/[n][f][size] [addr],其中n为打印的单位个数,f为打印的格式,size为打印的单位大小,addr为打印的地址。

x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。

用不来GDB,用更适合re宝宝体质的ida调试!

把这玩意写到~/.zshrc

RED='\033[0;31m'
NC='\033[0m'

function socatStart() {
    local fileName=$1
    local port=$2

    if [ -z "$fileName" ]; then
        echo "Usage: socatStart <file> [port]"
        return
    fi

    if [ -z "$port" ]; then
        port=10001
        echo "Using default port: $port"
    fi

    if [ ! -f "$fileName" ]; then
        echo "File not found: $fileName"
        return
    fi

    file $fileName
    echo ''
    echo "socat tcp-listen:$RED$port$NC,reuseaddr,fork EXEC:$RED$fileName$NC,pty,raw,echo=0"
    socat tcp-listen:$port,reuseaddr,fork EXEC:$fileName,pty,raw,echo=0
}

直接socatStart ./pwn,然后pwntools里面直接r = remote('127.0.0.1', 10001),ida里面直接attach,然后就可以愉快的调试了。