pwn工具安装及其使用

首先一个ubuntu16.04版本以上的虚拟机

关闭保护的方法:

pie: -no-pie
canary: -fno-stack-protector
aslr: 查看: cat /proc/sys/kernel/randomize_va_space 2表示打开
      关闭:echo 0 > /proc/sys/kernel/randomize_va_space
NX: -z execstack

gdb使用以及插件安装

gdb <file>加载程序

gdb基本命令:

命令

作用

示例

start

启动程序,并且在入口处停下

run

启动并且执行程序,直到遇到断点或者程序结束

continue

继续执行

x/<num><size><format> addr

查看内存,num为数量,size为数据大小,format为格式,addr为内存地址

x/8gx addr

disas

查看汇编编码

searchmem<data>

寻找内存

Searchmem flag

vmmap

查找程序内存布局

info b

查看断点列表

info r

查看寄存器

p

查看一个值

p printf

b

下断点

b main

Delete breakpoint <num>

删除断点,num为断点下标

Next

步过,单步调试,跳过函数执行

Step

步入,单步调试,但会跟进调用函数

Finish

执行到函数返回

Watch

监视内存或者寄存器

watch *0x8000

set

改变某值

set $rax 0

q

退出gdb

pwndbg是gdb的插件

安装

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

安装好之后要把gdb的插件切换为pwndbg:

vim ~/.gdbinit
source ~/peda/peda.py

pwndb不可和其他插件一起使用

基本指令

help //帮助

i //info,查看一些信息,只输入info可以看可以接什么参数,下面几个比较常用

i b //常用,info break 查看所有断点信息(编号、断点位置)

i r //常用,info registers 查看各个寄存器当前的值

i f //info function 查看所有函数名,需保留符号

show //和info类似,但是查看调试器的基本信息,如:

show args //查看参数

rdi / / 常 用 ,+寄存器名代表一个寄存器内的值,用在地址上直接相当与一个十六进制变量

backtrace //查看调用栈

q //quit 退出,常用

执行指令

s //单步步入,遇到调用跟进函数中,相当于step into,源码层面的一步

si //常用,同s,汇编层面的一步

n //单步补过,遇到电泳不跟进,相当于step over,源码层面的一步

ni //常用,同n,汇编层面的一步

c //continue,常用,继续执行到断点,没断点就一直执行下去

r //run,常用,重新开始执行

断点指令

下普通断点指令b(break):

b *(0x123456) //常用,给0x123456地址处的指令下断点

b *$ rebase(0x123456) //$rebase 在调试开PIE的程序的时候可以直接加上程序的随机地址

b fun_name //常用,给函数fun_name下断点,目标文件要保留符号才行

b file_name:fun_name

b file_name:15 //给file_name的15行下断点,要有源码才行

b 15

b +0x10 //在程序当前停住的位置下0x10的位置下断点,同样可以-0x10,就是前0x10

break fun if $rdi==5 //条件断点,rdi值为5的时候才断

删除、禁用断点:

使用info break(简写: i b)来查看断点编号

delete 5 //常用,删除5号断点,直接delete不接数字删除所有

disable 5 //常用,禁用5号断点

enable 5 //启用5号断点

clear //清除下面的所有断点

内存断点指令watch:

watch 0x123456 //0x123456地址的数据改变的时候会断

watch a //变量a改变的时候会断

info watchpoints //查看watch断点信息

捕获断点catch:

catch syscall //syscall系统调用的时候断住

tcatch syscall //syscall系统调用的时候断住,只断一次

info break //catch的断点可以通过i b查看

除syscall外还可以使用的有:
1)throw: 抛出异常
2)catch: 捕获异常
3)exec: exec被调用
4)fork: fork被调用
5)vfork: vfork被调用
6)load: 加载动态库
7)load libname: 加载名为libname的动态库
8)unload: 卸载动态库
9)unload libname: 卸载名为libname的动态库
10)syscall [args]: 调用系统调用,args可以指定系统调用号,或者系统名称

打印指令

查看内存指令x:

x /nuf 0x123456 //常用,x指令的格式是:x空格/nfu,nfu代表三个参数

n代表显示几个单元(而不是显示几个字节,后面的u表示一个单元多少个字节),放在’/'后面

u代表一个单元几个字节,b(一个字节),h(俩字节),w(四字节),g(八字节)

f代表显示数据的格式,f和u的顺序可以互换,也可以只有一个或者不带n,用的时候很灵活

x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
s 按字符串显示。
b 按字符显示。
i 显示汇编指令。

x /10gx 0x123456 //常用,从0x123456开始每个单元八个字节,十六进制显示是个单元的数据

x /10xd $rdi //从rdi指向的地址向后打印10个单元,每个单元4字节的十进制数

x /10i 0x123456 //常用,从0x123456处向后显示十条汇编指令

打印指令p(print):

p fun_name //打印fun_name的地址,需要保留符号

p 0x10-0x08 //计算0x10-0x08的结果

p &a //查看变量a的地址

p *(0x123456) //查看0x123456地址的值,注意和x指令的区别,x指令查看地址的值不用星号

p $rdi //显示rdi寄存器的值,注意和x的区别,这只是显示rdi的值,而不是rdi指向的值

p *($rdi) //显示rdi指向的值

打印汇编指令disass(disassemble):

disass 0x123456 //显示0x123456前后的汇编指令

x /10i //x也可以显示汇编指令

打印源代码指令list:

list //查看当前附近10行代码,要有源码,list指令pwn题中几乎不用,但为了完整性还是简单举几个例子

list 38 //查看38行附近10行代码

list 1,10 //查看1-10行

list main //查看main函数开始10行

修改和查找指令

修改数据指令set:

set $rdi=0x10 //把rdi寄存器的值变为0x10

set *(0x123456)=0x10 //0x123456地址的值变为0x10,注意带星号

set args “abc” “def” “gh“//给参数123赋值

set args “python -c ‘print “1234\x7f\xde”’” //使用python给参数赋值不可见字符

查找数据:

search rdi //从当前位置向后查包含rdi的指令,返回若干

search -h //查看search帮助,我也不太长用这个指令

find “hello” //查找hello字符串,pwndbg独有

ropgadget //查找ropgadget,pwndbg独有,没啥用,可以用其他工具

堆操作指令(pwndbg插件独有)

arena //显示arena的详细信息

arenas //显示所有arena的基本信息

arenainfo //好看的显示所有arena的信息

bins //常用,查看所有种类的堆块的链表情况

fastbins //单独查看fastbins的链表情况

largebins //同上,单独查看largebins的链表情况

smallbins //同上,单独查看smallbins的链表情况

unsortedbin //同上,单独查看unsortedbin链表情况

tcachebins //同上,单独查看tcachebins的链表情况

tcache //查看tcache详细信息

heap //数据结构的形式显示所有堆块,会显示一大堆

heapbase //查看堆起始地址

heapinfo、heapinfoall //显示堆得信息,和bins的挺像的,没bins好用

parseheap //显示堆结构,很好用

tracemalloc //好用,会跟提示所有操作堆的地方

其他pwndbg插件独有指令

cyclc 50 //生成50个用来溢出的字符,如:aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaama

$reabse //开启PIE的情况的地址偏移

b *$reabse(0x123456) //断住PIE状态下的二进制文件中0x123456的地方

codebase //打印PIE偏移,与rebase不同,这是打印,rebase是使用

stack //查看栈

retaddr //打印包含返回地址的栈地址

canary //直接看canary的值

plt //查看plt表

got //查看got表

hexdump //想IDA那样显示数据,带字符串

ida

IDA分析可执行文件

IDA会对可识别的文件进行代码反编译,反编译过程依据文件大小而定。IDA软件会利用回归方式递进分析可执行文件反汇编代码。判断IDA分析完毕的三种方法分别为:

1)图中IDA的“Output Window”窗口输出“The initial autoanalysis has been finished”日志时,则说明IDA已分析完毕。

2)如图所示进度条处黄色向上箭头消失时,则表明IDA分析完毕。

3)图中IDA界面左下角AU处于”idle”状态时,也表明IDA分析完毕。

四、常用快捷键

空格键:反汇编窗口切换文本跟图形

Esc:在反汇编窗口中使用为后退到上个操作的地址处

Shift +F5:打开签名窗口

shift+F12:自动分析出参考字符串

ALT+T:搜索字符串(文本搜索)

ALT+L:标记(Lable)

ALT+M:设置标签(mark)

ALT+G:转换局部变量为结构体

ALT+Enter:跳转到新的窗口

Alt+B:快捷键用于搜索十六进制字节序列,通常在分析过程中可以用来搜索opcode

CTRL+M:列举出当前已经添加的标签

CTRL+S列举出二进制程序的段的开始地址、结束地址、权限等信息

F9:动态调试程序(其实IDA主要用作静态分析用的)

F5:将一个函数逆向出来(生成c伪代码)

G:跳转到指定地址

A:将选择的信息转换成ASCII(转换成可读性跟强的字符串)

X(ctrl+X):交叉引用,类似于OD中的栈回溯操作

N:对符号重命名

:&;(冒号&分号):光标所在位置添加常规注释和可重复注释

P:创建函数

T:解析结构体偏移

M:转换为枚举类型常量

Y:设置变量类型

H:转换16进制

C:光标所在地址处的内容解析成代码

D:光标所在地址处的内容解析成数据

A:光标所在地址处的内容解析成ascll码字符串

U:光标所在地址处的内容解析成未定义内容。

pwntools

from pwn import *
myelf = ELF('myelfname')
libc = ELF('')
#conn = process('') //本地调试
conn = remote('')
conn.recv() //接收多少字节
conn.recvuntil('') //直到接收到
recvall()
recvline() //直到接收到'\n'

conn.send()
conn.sendline()
conn.sendlineafter()

嵌入gdb
gdb.attach()

字符转换
p64(),p32(),p16(),p8()

解包
u64(string) u32,u16,u8

b'aaaa'+p64(0xa)

conn.interactive() //和shell交互

查看内存

def p():
    gdb.attach(io)
    raw input() //控制断点,不让程序往下走

  • 18
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值