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
2sudo 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一次性设置多个变量
还有就是Real型的这个代表的是有理数,可以解出所有的有理数
BitVec(‘a’ , 8),用来进行位的运算与求解(第二个是指变量的位的个数)
首先是给变量赋值,设置一个解方程的类Solver,然后一个一个添加(这样比较直观),check一下看看有没有解,最后得出一个解,当然还有另外一种方法
直接用solve函数就可以了
纯字符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 |
|
还需要安装以上的两个依赖
如果出现上述情况,执行以下的命令
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 许可协议,转载请注明出处!