 
  pwn工具的安装及使用指令
pwntools
| 1 |  | 
LibcSearcher
1、安装
| 1 |  | 
2、错误:
处理办法:
3、常见用法(脚本中使用)
| 1 |  | 
以上内容转载LibcSearcher 安装 错误处理 与使用
ROPgadget
一般用在64位下,因为64位的函数传参与32位有些不同,需使用到寄存器传参,常用命令格式:
| 1 |  | 
文件也可以是libc
附:
搭配使用 one_gadget
安装:
| 1 |  | 
one_gadget 是用来去查找动态链接库里execve(“/bin/sh”, rsp+0x70, environ)函数的地址的
使用方法:
但是这样只会给出常见的容易满足的one_gadget,通过下面指令可以查询到一些比较难满足的one_gadget
| 1 |  | 
来源: https://blog.csdn.net/yongbaoii/article/details/109101822
gdb
安装
先装,因为这个带有 parseheap、以及 heapinfo 等指令,有的场景下更好用
| 1 |  | 
pwndbg:pwndbg (/poʊnddb æg/)是一个GDB插件,使GDB的调试不那么糟糕,重点关注低级软件开发人员、硬件黑客、逆向工程师和开发人员需要的特性
peda:GDB的Python开发协助
gef:GEF(发音为ʤɛf -“Jeff”)是一组用于x86/64、ARM、MIPS、PowerPC和SPARC的命令,用于在使用老式GDB时帮助开发人员和反向工程师
把这三个都先下载下来:
| 1 |  | 
pwndbg安装:
| 1 |  | 
安装插件依赖:
| 1 |  | 
更换gdb指令,在gef、pwndbg、peda中选择,选哪个就把其他都注释掉
| 1 |  | 
1. 用途
启动你的程序,可以按照你的自定义的要求随心所欲的运行程序
可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
当程序被停住时,可以检查此时你的程序中所发生的事。
动态的改变你程序的执行环境
使用前要:
| 1 |  | 
2. 常用指令:
- checksec 查看elf编译的保护选项 
- aslr 查看gdb的aslr设置 aslr on 可开启alsr设置 
- file 文件名 加载objfile 
- disas addr 对地址addr处的指令进行反汇编,addr可以是函数名(但是不加* 使用函数名就无法用于参数确认;不加*,断点就不会设置到汇编语言层级的函数开头) 
- b *addr 在addr处下一个断点 b后跟函数名就不用 * 
- rwatch *addr 在addr处下一个硬件断点 
- enable 激活断点 
- disable 禁用断点 
- info b 查看断点 
- del num 删除断点 
- x addr 查看addr处存储的数据值 
- x/wx $esp 以4字节16进制显示栈中内容 
- stack 100 插件提供,显示栈中100项 
- find xxx 快速查找,很实用 
- r 运行被调试的程序 
- c 继续运行 
- ni 单步执行不进入函数调用 
- si 单步执行并进入函数调用 
- elfsymbol – 获取non-debugging symbol信息(plt表) 
- parseheap 可以对heap进行分析,得到相关信息 
- dumprop –在给定内存范围中Dump出所有ROP gadgets 
- vmmap 得到虚拟映射地址,同时可查看执行权限 
- heapinfo 查看bin链信息 
- heapbase 查看堆地址 
- finish 执行到函数返回 
- arena 查看 mainarena 
- telescope 地址 可以查看一小段该地址的内容 
- dumpargs– 函数将要被调用时,显示将要被传入函数的所有参数 
- readelf – 获取elf头信息 
- x/<n/f/u>其中n、f、u是可选的参数 - x/s 地址 查看字符串 - x/wx 地址 查看DWORD - x/c 地址 单字节查看 - x/16x $esp+0x12 查看寄存器偏移(16代表查看16个) 
- set args 可指定程序运行时参数。(如:set args 10 20 30 40 50)
- set $rdi=0x10 把rdi寄存器的值变为0x10
- set (0x123456)=0x10 0x123456地址的值变为0x10,*注意带星号
- show args 命令可以查看设置好的运行参数。
- break fun if $rdi==5 条件断点,rdi值为5的时候才断
参数意义:
s 按字符串输出
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
基本
- si 步入,可以进入查看具体的函数调用。 
- n 执行下一条语句(C代码中的一句语句),ni 步入,这个执行的是下一条汇编指令 
- b 在某处下断点,可以用 
- b * adrress
- b function_name
- info b 查看断点信息
- delete 1 删除第一个断点
 
- c 继续 
- r 执行 
- disas addr 查看addr处前后的反汇编代码 
- readelf 文件信息 
一般c,n,ni后面都可以跟数字,
ni 10
就代表下10行指令
显示数据
p
- p function 显示某个函数地址
- p $esp 某个寄存器的值
- p 0xdd-0x55 可以当计算器
- p &VarName 查看变量地址
- p * 0xffffebac 查看某个地址处的值
x
- x/10wx addr 显示某个地址处开始的16进制内容,如果有符号表会加载符号表
- x/40gx addr 跟上面一样,一般上面32位用,这个64位
- x/10s addr 查看addr开始的10个字符串
- x/x $esp 查看esp寄存器中的值
- x/b addr 查看addr处的字符
- x/10i addr 查看addr处的反汇编结果(addr可以为函数)(常用)
info(i)
- info register $ebp 查看寄存器ebp中的内容 (简写为 i r ebp)
- i r eflags 查看状态寄存器
- i r 查看所有寄存器
- i b 查看断点信息
- i functions 查看所有的函数
查找数据
- search mem 查找字符串 peda带有
pwntools
1. context设置
context是pwntools用来设置环境的功能。在很多时候,由于二进制文件的情况不同,我们可能需要进行一些环境设置才能够正常运行exp,比如有一些需要进行汇编,但是32的汇编和64的汇编不同,如果不设置context会导致一些问题。
一般来说我们设置context只需要简单的一句话:
| 1 |  | 
这句话的意思是:
- os(operating system 操作系统)设置系统为linux系统,在完成ctf题目的时候,大多数pwn题目的系统都是linux
- arch设置架构为amd64,可以简单的认为设置为64位的模式,对应的32位模式是’i386’
- log_level设置日志输出的等级为debug,这句话在调试的时候一般会设置,这样pwntools会将完整的io过程都打印下来,使得调试更加方便,可以避免在完成CTF题目时出现一些和IO相关的错误。
2. Cyclic Pattern
Cyclic pattern是一个很强大的功能,大概意思就是,使用pwntools生成一个pattern,pattern就是指一个字符串,可以通过其中的一部分数据去定位到他在一个字符串中的位置。
在我们完成栈溢出题目的时候,使用pattern可以大大的减少计算溢出点的时间。
| 1 |  | 
比如,我们在栈溢出的时候,首先构造cyclic(0x100),或者更长长度的pattern,进行输入,输入后pc的值变为了0x61616161,那么我们通过cyclic_find(0x61616161)就可以得到从哪一个字节开始会控制PC寄存器了,避免了很多没必要的计算。
可以直接在shell中使用cyclic 100
然后查找溢出点 使用 cyclic -l 0x61616161
来源:https://blog.csdn.net/qq_29343201/article/details/51337025
转载自:https://blog.csdn.net/qq_41560595/article/details/114597342
patchelf && glibc-all-in-one
patchelf
| 1 |  | 
glibc-all-in-one
| 1 |  | 
1. 安装glibc-all-in-one
| 1 |  | 
2. 安装patchelf
| 1 |  | 
可能会遇到 autoreconf: not found
安装一下就好
| 1 |  | 
3.生成所需的符号链接
| 1 |  | 
文件路径要注意修改为自己的路径
4.更改elf文件的ld和libc
| 1 |  | 
glibc-2.34及以上:
| 1 |  | 
我自己调试情况:
首先,这是还未更换的文件的ld和libc
当输入patchelf --replace-needed libc.so.6 /home/shoucheng/glibc-all-in-one/libs/2.23-0ubuntu11.2_amd64/libc.so.6 1时
可以发现,libc.so.6的路径被更换了,换为了glibc-all-in-on目录下的libc.so.6,本来按照上面的来讲,总共是要两步的,先是更换链接器,然后改变libc路径。但是我直接去修改libc的路径,得到的结果是跟上述是一样的,已经完成了修改。
去修改链接器,最终指向的仍然是/lib64/ld-linux-x86-64.so.2 并没有在本质上改变了什么
结论为:暂时不知道是因为什么,不过还是建议按上面步骤来
seccomp-tools 工具
可以seccomp-tools这个工具去查看禁用的系统调用
- 安装: - 1 
 2- sudo apt install gcc ruby-dev
 sudo gem install seccomp-tools
- 使用:一般用到dump这个用法,其他详细用法可见上面github。 - 1 - seccomp-tools dump ./xxx
libc_database
有一些PWN题故意不给libc文件,但是可以泄露地址,libc database可以利用泄露的地址来确定服务器使用的libc。
先下载libc database
| 1 |  | 
利用get来下载流行的libc库
| 1 |  | 
程序会自动在ubuntu网站上下载相关的libc文件,存储到./db文件夹下
用法:使用./find可以在db中找到对应libc,如泄露的地址是printf 0xf7xxxx260 puts 0xf7xxxf30,输入最后三位即可
| 1 |  | 
z3
| 1 |  | 
在python3上安装这个库即可,功能十分强大,可以在python中用这个库解决任何方程(只要有解)
使用
来源:https://www.jianshu.com/p/64d87659673a
首先要给所有的变量设置一个类型,他有很多种类型,Int型他代表整数所有的解都只能是整数,当然也可以用Ints一次性设置多个变量
img
还有就是Real型的这个代表的是有理数,可以解出所有的有理数
img
BitVec(‘a’ , 8),用来进行位的运算与求解(第二个是指变量的位的个数)
img
首先是给变量赋值,设置一个解方程的类Solver,然后一个一个添加(这样比较直观),check一下看看有没有解,最后得出一个解,当然还有另外一种方法
img
直接用solve函数就可以了
img
纯字符shellcode
来源:
https://www.codenong.com/cs105236336/
https://xz.aliyun.com/t/5662#toc-4
https://n0va-scy.github.io/2020/06/21/shellcode%E7%9A%84%E8%89%BA%E6%9C%AF/
可见字符能组成的汇编代码
| 1 |  | 
msf内置的encoder
一、内置的shellcode
命令如下:
| 1 |  | 
BufferRegister指的是指向shellcode的寄存器的值
二、用msf编码自己写的shellcode
| 1 |  | 
alpha3
修改完之后还需要编译源码,但是编译源码的工具也在google上,如果懒得自己编译,可以直接下载大佬的修改版:
| 1 |  | 
之后输入以下命令:
x64:
| 1 |  | 
rax是用于编码的寄存器(shellcode基址),就是在执行shellcode时,借用跳转执行的寄存器,如call rax。就填入rax
x86:
| 1 |  | 
mixedcase:数字+大小写字母;lowercase:数字+小写字母;uppercase:数字+大写字母。只有x86才有三种选项
寄存器同上
AE64
AE64是杭电的一位大师傅写的工具,专用于生成64位的aplha shellcode
| 1 |  | 
| 1 |  | 
还需要安装以上的两个依赖
image-20211003154639933
如果出现上述情况,执行以下的命令
| 1 |  | 
此外AE64是python写的,可以直接在python中调用,以下是例子
| 1 |  | 
可见字符对应的汇编代码
| Opcode | Char | Instruction | 
|---|---|---|
| 20 | AND [m8],r8 | |
| 21 | ! | AND [m16/32/64],r16/32/64 | 
| 22 | “ | AND r8,[m8] | 
| 23 | # | AND r16/32/64,[m16/32/64] | 
| 24 | $ | AND AL,i8 | 
| 25 | % | AND AX/EAX/RAX,i16/32/64 | 
| 26 | & | ES:PREFIX | 
| 27 | ‘ | Invalid | 
| 28 | ( | SUB [m8],r8 | 
| 29 | ) | SUB [m16/32/64],r16/32/64*1 | 
| 2A | * | SUB r8,[m8] | 
| 2B | + | SUB r16/32/64,[m16/32/64]*1 | 
| 2C | , | SUB AL,i8 | 
| 2D | - | SUB AX/EAX/RAX,i16/32/64*2 | 
| 2E | . | CS:PREFIX | 
| 2F | / | Invalid | 
| 30 | 0 | XOR [m8],r8 | 
| 31 | 1 | XOR [m16/32/64],r16/32/64 | 
| 32 | 2 | XOR r8,[m8] | 
| 33 | 3 | XOR r16/32/64,[m16/32/64] | 
| 34 | 4 | XOR AL, i8 | 
| 35 | 5 | XOR AX/EAX/RAX, i16/32/64 | 
| 36 | 6 | SS:PREFIX | 
| 37 | 7 | Invalid | 
| 38 | 8 | CMP [m8],r8 | 
| 39 | 9 | CMP [m16/32/64],r16/32/64 | 
| 3A | : | CMP r8,[m8] | 
| 3B | ; | CMP r16/32/64,[m16/32/64]* | 
| 3C | < | CMP AL,i8 | 
| 3D | = | CMP AX/EAX/RAX,i16/32/64* | 
| 3E | > | DS:PREFIX | 
| 3F | ? | Invalid | 
| 40 | @ | REX: .... | 
|---|---|---|
| 41 | A | REX: ...B | 
| 42 | B | REX: ..X. | 
| 43 | C | REX: ..XB | 
| 44 | D | REX: .R.. | 
| 45 | E | REX: .R.B | 
| 46 | F | REX: .RX. | 
| 47 | G | REX: .RXB | 
| 48 | H | REX: W... | 
| 49 | I | REX: W..B | 
| 4A | J | REX: W.X. | 
| 4B | K | REX: W.XB | 
| 4C | L | REX: WR.. | 
| 4D | M | REX: WR.B | 
| 4E | N | REX: WRX. | 
| 4F | O | REX: WRXB | 
| 50 | P | PUSH AX/RAX/R8*3 | 
| 51 | Q | PUSH CX/RCX/R9*3 | 
| 52 | R | PUSH DX/RDX/R10*3 | 
| 53 | S | PUSH BX/RBX/R11*3 | 
| 54 | T | PUSH SP/RSP/R12*3 | 
| 55 | U | PUSH BP/RBP/R13*3 | 
| 56 | V | PUSH SI/RSI/R14*3 | 
| 57 | W | PUSH DI/RDI/R15*3 | 
| 58 | X | POP AX/RAX/R8*3 | 
| 59 | Y | POP CX/RCX/R9*3 | 
| 5A | Z | POP DX/RDX/R10*3 | 
| 5B | [ | POP BX/RBX/R11*3 | 
| 5C | \ | POP SP/RSP/R12*3 | 
| 5D | ] | POP BP/RBP/R13*3 | 
| 5E | ^ | POP SI/RSI/R14*3 | 
| 5F | _ | POP DI/RDI/R15*3 | 
| 60 | ` | Invalid | 
|---|---|---|
| 61 | a | Invalid | 
| 62 | b | Invalid | 
| 63 | c | MOVSXD r64,[m32](Zero extend) | 
| 66 63 | fc | MOVSXD r64,[m16](Zero extend) | 
| 48 63 | Hc | MOVSXD r64,[m32](Sign extend) | 
| 64 | d | FS:PREFIX | 
| 65 | e | GS:PREFIX | 
| 66 | f | OPERAND SIZE OVERRIDE | 
| 67 | g | ADDRESS SIZE OVERRIDE | 
| 68 | h | PUSH i32(Sign extend to i64) *4 | 
| 66 68 | fh | PUSH i16*4 | 
| 69 | i | IMUL r32, [m32], i32 | 
| 66 69 | fi | IMUL r16, [m16], i16(i16 not i32) | 
| 48 69 | Hi | IMUL r64, [m64], i32 | 
| 6A | j | PUSH i8 | 
| 6B | k | IMUL r32, [m32], i8 | 
| 66 6B | fk | IMUL r16, [m16], i8 | 
| 48 6B | Hk | IMUL r64, [m64], i8 | 
| 6C | l | INSB | 
| 6D | m | INSW/INSD/INSQ*5 | 
| 6E | n | OUTSB | 
| 6F | o | OUTSW/OUTSD/OUTSQ*5 | 
| 70 | p | JO o8 | 
| 71 | q | JNO o8 | 
| 72 | r | JB o8 | 
| 73 | s | JAE o8 | 
| 74 | t | JE o8 | 
| 75 | u | JNE o8 | 
| 76 | v | JBE o8 | 
| 77 | w | JA o8 | 
| 78 | x | JS o8 | 
| 79 | y | JNS o8 | 
| 7A | z | JP o8 | 
| 7B | { | JPO o8 | 
| 7C | | | JL o8 | 
| 7D | } | JGE o8 | 
| 7E | ~ | JLE o8 | 
zsh以及常用插件
安装和配置zsh
- 安装oh-my-zsh
| 1 |  | 
- 更改默认shell为zsh - [sudo] chsh -s $(which zsh)
或者
| 1 |  | 
安装常用插件
- autojump
| 1 |  | 
- zsh-autosuggestions
| 1 |  | 
- zsh-syntax-highlighting
| 1 |  | 
docker
首先,安装必要的证书并允许 apt 包管理器使用以下命令通过 HTTPS 使用存储库:
| 1 |  | 
然后,运行下列命令添加 Docker 的官方 GPG 密钥:
| 1 |  | 
添加 Docker 官方库:
| 1 |  | 
使用命令更新 Ubuntu 源列表:
| 1 |  | 
最后,运行下列命令在 Ubuntu 22.04 LTS 服务器中安装最新 Docker CE:
| 1 |  | 
- 本文作者:ShouCheng
- 本文链接:http://shoucheng3.github.io/2020/12/01/pwn%E5%B7%A5%E5%85%B7%E7%9A%84%E5%AE%89%E8%A3%85%E5%8F%8A%E4%BD%BF%E7%94%A8%E6%8C%87%E4%BB%A4/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!





