Pwntools_Study

2023-10-09 06:32
文章标签 study pwntools

本文主要是介绍Pwntools_Study,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

pwntools是由Gallopsled开发的一款专用于CTF Exploit的Python库,包含了本地执行、远程连接读写、shellcode生成、ROP链的构建、ELF解析、符号泄漏等众多强大功能,可以说把exploit繁琐的过程变得简单起来。这里简单介绍一下它的使用。Exploit利器——Pwntools
pwntools中文文档
Pwntools | Lantern’s 小站 ,这篇文章也是参考了另一篇 pwntools使用 | 简书 ch3ckr
本文结合两篇,再加一点自己的见解(除了官方玩当还有其他引用,成套娃了)

安装

ubuntu python3 pip3

sudo apt install libssl-dev
sudo apt install libffi-dev
pip install pwntools

简单使用

虽是简单使用,但对于还是菜鸟的我,还是十分受用的。

导入

from pwn import *

使用 from pwn import * 将所有的模块导入到当前namespace,这条语句还会帮你把os,sys等常用的系统库导入。

常规模块

  • asm : 汇编与反汇编,支持 x86/x64/arm/mips/powerpc 等基本上所有的主流平台
  • dynelf : 用于远程符号泄漏,需要提供leak方法
  • elf : 对elf文件进行操作
  • gdb : 配合gdb进行调试
  • memleak : 用于内存泄漏
  • shellcraft : shellcode的生成器
  • tubes : 包括tubes.sock, tubes.process, tubes.ssh, tubes.serialtube,分别适用于不同场景的PIPE
  • utils : 一些实用的小功能,例如CRC计算,cyclic pattern等

调试与汇编反汇编

调试

context.log_level = "debug" # 打印调试信息
context.log_level = "error" # 打印错误信息,此时很多回显看不到

在运行时使用 DEBUG 参数

python3 exp.py DEBUG

tmux中以分屏的形式启动 gdb

context.terminal = ['tmux', 'splitw', '-h'] # 横向
context.terminal = ['tmux', 'splitw', '-v'] # 纵向

gdb调试

gdb.attach(p, "b read") # "b read"为gdb开启后执行的命令

汇编

>>> asm('nop')
'\x90'
>>> asm('nop', arch='arm')
'\x00\xf0 \xe3'

contex指定CPU类型,操作系统类型,字节序,位数

context.arch      = 'i386'
context.os        = 'linux'
context.endian    = 'little'
context.word_size = 32

使用disasm进行反汇编## 连接与交互

>>> print disasm('6a0258cd80ebf9'.decode('hex'))0:   6a 02                   push   0x22:   58                      pop    eax3:   cd 80                   int    0x805:   eb f9                   jmp    0x0

注意,asm需要binutils中的as工具辅助,如果是不同于本机平台的其他平台的汇编,例如在我的x86机器上进行mips的汇编就会出现as工具未找到的情况,这时候需要安装其他平台的cross-binutils。

p = process("./pwn") # 本地
p = remote(ip, port) # e.g. p = remote("10.10.10.10", 23946)远程
sh.close() # 关闭

绑定libc

p = process(['./bin'], env={'LOAD_PRELOAD': './libc-2.23.so'})

IO 模块

发送信息

p.send(data) # 发送数据,不带回车
p.sendline(data) # 带回车,相当于在数据后面加\n
p.sendafter(delim, data, timeout = default) #  recvuntil(delim, timeout = timeout)和send(data)的组合。
p.sendlineafter(delim, data, timeout = default) #  recvuntil(delim, timeout = timeout)和sendline(data)的组合
sh.recv(numb = 2048, timeout = dufault)  接受数据,numb指定接收的字节,timeout指定超时
sh.recvline(keepends=True)  接受一行数据,keepends为是否保留行尾的\n
sh.recvuntil("Hello,World\n",drop=fasle)  接受数据直到我们设置的标志出现
sh.recvall()  一直接收直到EOF
sh.recvrepeat(timeout = default)  持续接受直到EOF或timeout
sh.interactive()  直接进行交互,相当于回到shell的模式,在取得shell之后使用

接收信息

p.recv(number) # 接收number个字节的信息, number可省略
p.recvline() # 接收一行信息
p.recvuntil(msg) # 接受信息直到msg出现

启动交互

p.interactive()

打印信息

log.success("msg")
log.info("msg")

Shellcode生成器

shellcraft.i386.linux.sh()

打印出来:

>>> print(shellcraft.i386.linux.sh())/* execve(path='/bin///sh', argv=['sh'], envp=0) *//* push b'/bin///sh\x00' */push 0x68push 0x732f2f2fpush 0x6e69622fmov ebx, esp/* push argument array ['sh\x00'] *//* push 'sh\x00\x00' */push 0x1010101xor dword ptr [esp], 0x1016972xor ecx, ecxpush ecx /* null terminate */push 4pop ecxadd ecx, esppush ecx /* 'sh\x00' */mov ecx, espxor edx, edx/* call execve() */push SYS_execve /* 0xb */pop eaxint 0x80

结合asm可以得到最终的payload

from pwn import *
context(os='linux',arch='amd64')
shellcode = asm(shellcraft.sh())from pwn import *
shellcode = asm(shellcraft.amd64.linux.sh())

除了直接执行 sh 之外,还可以进行其它的一些常用操作例如提权、反向连接等等。

pack与unpack

pack: p8, p16, p32, p64
unpack: u8, u16, u32, u64
就是打包解包
示例:

from pwn import *
elf = ELF('./level0')
sys_addr = elf.symbols['system']
payload = 'a' * (0x80 + 0x8) + p64(sys_addr)
...

ROP 链生成器

elf = ELF('ropasaurusrex')
rop = ROP(elf)
rop.read(0, elf.bss(0x80))
rop.dump()
# ['0x0000:        0x80482fc (read)',
#  '0x0004:       0xdeadbeef',
#  '0x0008:              0x0',
#  '0x000c:        0x80496a8']
str(rop)
# '\xfc\x82\x04\x08\xef\xbe\xad\xde\x00\x00\x00\x00\xa8\x96\x04\x08'

使用 ROP(elf) 来产生一个rop的对象,这时rop链还是空的,需要在其中添加函数。
因为ROP对象实现了getattr 的功能,可以直接通过func call的形式来添加函数,rop.read(0, elf.bss(0x80)) 实际相当于rop.call(‘read’, (0, elf.bss(0x80)))
通过多次添加函数调用,最后使用str将整个rop chain 给 dump出来就可以了。

call(resolvable, arguments=()) : 添加一个调用,resolvable可以是一个符号,也可以是一个int型地址,注意后面的参数必须是元组否则会报错,即使只有一个参数也要写成元组的形式(在后面加上一个逗号)

  • chain() : 返回当前的字节序列,即payload
  • dump(): 直观地展示出当前的rop chain
  • raw() : 在rop chain中加上一个整数或字符串
  • search(move=0, regs=None, order=’size’) : 按特定条件搜索gadget
  • unresolve(value) : 给出一个地址,反解析出符号

常用模板

这个例子我感觉很好

from pwn import *elf_name = "./filename"p = process([elf_name], env = {"LD_PRELOAD": "./libc.so.6"})elf = ELF(elf_name)
libc = ELF("./libc.so.6")context.log_level = "debug"
context.terminal = ['tmux', 'splitw', '-v']rv = p.recv
ru = p.recvuntil
sd = p.send
sa = p.sendafter
sl = p.sendline
sla = p.sendlineafter
ia = p.interactivedef dbg(breakpoint):gdb.attach(p, "b " + breakpoint)p.interactive()

这篇关于Pwntools_Study的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/171002

相关文章

Study Plan For Algorithms - Part24

1. 包含min函数的栈 定义栈的数据结构,要求在该类型中实现一个 min 函数,能够获取栈的最小元素。在该栈中,调用 min、push 以及 pop 函数的时间复杂度均为 O (1)。 方法: class MinStack:def __init__(self):self.stack = []self.min_stack = [float('inf')]def push(self, x):sel

Study Plan For Algorithms - Part21

1. 二叉树的镜像 输入一个二叉树,输出它的镜像。 方法一: class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef mirrorTree(root):if not root:return Nonetemp, left,

Self-study Python Fish-C Note20 P64to65

类和对象 (part 3) 本节主要介绍 类和对象的多态和鸭子类型、私有变量和 __slots__(原视频P64-65)\ 多态 多态是面向对象编程的三大特征之一,另外两个是封装和继承。多态是指同一个运算符、函数或对象,在不同场景下具有不同作用效果的情况。 Python 是一门动态语言,多态本来就是 Python的一种特性。 比如: 加号:两边都是数字的时候就是执行算术运算(相加),如果两边

study note of CCS

Notes of DSP learning 每个CCS的project工程都包括哪些东西: Src:每个Project里面会有一个src的文件夹,这个文件夹里面是一些.c和.asm的文件,个人理解就是一些函数的实现,自己写代码的时候调用的函数就是在这些.C的文件里面的,这些.C和.asm的文件可以在CCS的安装目录的\TI\controlSUITE\device_support\f2802x\v

codecademy python study

https://www.codecademy.com/learn 好像是之前,了解bash脚本的时候,感觉这个网站还不错哦!将Python学习了一下,主要是了解一下语法!其实我平时也是不用的!毕竟是Java开发的程序,虽然说,大学的时候有些课程了解过一些Python的语法,不过时间这个东西很难说,很久不适用慢慢的就忘记了…所以还是得没事的时候学一下,免得别人都说我在debug哈哈哈…,或者来一句

【AI】消融实验ablation study

消融实验是在科研论文中常见的一个术语,在深度学习中非常重要,用人话来说:就是消除研究过程的噪声,比如删掉一些模块或者用随机特征去替换训练好的一些特征。 作用:容易解释模型工作原理的因果性;便于理解;验证是否运行原理符合你的假设(移除系统中的特定的部分,来控制变量式的研究这个部分对于系统整体的影响。如果去除这一部分后系统的性能没有太大损失,那么说明这一部分对于整个系统而言并不具有太大的重要性;如果去

Comparative Study of Deep Learning Software Frameworks( caffe、Neon、TensorFlow、Theano、Torch 之比较)

reference:http://blog.csdn.net/u010167269/article/details/51810613 Preface 最近不少人问我哪个开源框架好用,我自己用过 caffe、TensorFlow、Theano、Torch,用过之后虽然有一定的感觉。但我想很多东西需要实验来具体的验证。 正好我看自己的 Mendeley 中有一篇这个文章:《Comp

hdu 4640 Island and study-sister(最短路+状压dp)

题目链接:hdu 4640 Island and study-sister 解题思路 用二进制数表示2~n的点是否移动过的状态, dp[s][i] dp[s][i]表示状态s上的点必须经过并且当前在i节点的最小代价, 这步用类似最短路的方式求出。 然后是 dp2[i][s] dp2[i][s]表示i个人移动过s状态的点的最小代价。 代码 #include <cstdio>#includ

Ubuntu18.04安装pwntools报错解决方案

报错1:ModuleNotFoundError: No module named ‘setuptools_rust’ 报错信息显示ModuleNotFoundError: No module named 'setuptools_rust',如下图所示 解决方案:pip install setuptools_rust 报错2:pip版本低 解决方案:pip install --upgrad

good good study day day up

好久没写英语博客了,先进来占个位吧,说一说最近的英语吧,由于工作项目紧,学习的时间少了,学习英语的时间就更加少了,一直坚持学英语说英语的胡boy给我们建了要给微信群,每天都教我们一两句很地道的英语,这个真心不错,在这里跟胡boy说声谢谢了, 三克油胡boy。哈哈,先说到这里吧,总的来说英语很重要,要坚持学英语哦,加油,小伙伴们!!!