1.安装

操作系统:

ubuntu16.04

环境准备:

python

pip

libssl-dev

libffi-dev

pwntools安装:

sudo apt-get install libffi-dev

sudo apt-get install libssl-dev

sudo apt-get install python

sudo apt-get install python-pip

sudo pip install pwntools

peda安装:

$ git clone https://github.com/longld/peda.git ~/peda

$ echo "source ~/peda/peda.py" >> ~/.gdbinit

Ubuntu 32位库的安装:

ubuntu64位默认没有32位的库,所以32位的ELF文件无法执行,会提示找不到文件或者文件夹,所以需要手动安装32位的库。

sudo apt install libc6-dev-i386

sudo apt-get install lib32z1

2.模块介绍

使用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等

3.连接

本地 :sh = porcess("./level0")

远程:sh = remote("127.0.0.1",10001)

关闭连接:sh.close()

4.IO模块

sh.send(data) 发送数据

sh.sendline(data) 发送一行数据,相当于在数据后面加\n

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之后使用

5. 汇编和反汇编

汇编:

>>> asm('nop')

'\x90'

>>> asm('nop', arch='arm')

'\x00\xf0 \xe3'

可以使用context来指定cpu类型以及操作系统

>>> context.arch     = 'i386'

>>> context.os       = 'linux'

>>> context.endian   = 'little'

>>> context.word_size = 32

使用disasm进行反汇编

>>> print disasm('6a0258cd80ebf9'.decode('hex'))

0:   6a 02                   push   0x2

2:   58                     pop   eax

3:   cd 80                   int   0x80

5:   eb f9                   jmp   0x0

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

6.Shellcode生成器

>>> print shellcraft.i386.nop().strip('\n')

nop

>>> print shellcraft.i386.linux.sh()

/* push '/bin///sh\x00' */

push 0x68

push 0x732f2f2f

push 0x6e69622f

...

结合asm可以可以得到最终的pyaload。

from pwn import *

context(os='linux',arch='amd64')

shellcode = asm(shellcraft.sh())

或者

from pwn import *

shellcode = asm(shellcraft.amd64.linux.sh())

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

7.ELF文件操作

>>> e = ELF('/bin/cat')

>>> print hex(e.address) # 文件装载的基地址

0x400000

>>> print hex(e.symbols['write']) # 函数地址

0x401680

>>> print hex(e.got['write']) # GOT表的地址

0x60b070

>>> print hex(e.plt['write']) # PLT的地址

0x401680

>>> print hex(e.search('/bin/sh').next())# 字符串/bin/sh的地址

8.整数pack与数据unpack

pack:p32,p64unpack:u32,u64

from pwn import *

elf = ELF('./level0')

sys_addr = elf.symbols['system']

payload = 'a' * (0x80 + 0x8) + p64(sys_addr)

...

9.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) : 给出一个地址,反解析出符号

python3-pwntools教程_python的pwntools工具的日常使用相关推荐

  1. cpython教程_python高性能扩展工具-cython教程1快速入门

    Cython不仅仅是一种编程语言.它的起源可以追溯到SAGE数学软件包,它用于提高数学计算性能,例如涉及矩阵的计算.更一般地说,我倾向于将Cython视为SWIG的替代品,为本机代码生成非常好的Pyt ...

  2. python自动化教程_Python 任务自动化工具 tox 教程

    1.tox 能做什么? 细分的用途包括: 创建开发环境 运行静态代码分析与测试工具 自动化构建包 针对 tox 构建的软件包运行测试 检查软件包是否能在不同的 Python 版本/解释器中顺利安装 统 ...

  3. python3中文教程_Python视频教程:Python3入门+进阶让你快速掌握Python3

    全网最热Python3入门+进阶 更快上手实际开发 无论是大数据.人工智能还是机器学习,Python都是最热门的首选语言 ,这次课程,就将带你从基础入门Python3,掌握Python3.x 版本语法 ...

  4. python3.4教程_Python教程(四)

    6 函数(一) 前面写的程序都是很小的,假设我们要编写一个很大的程序,并且要重复使用很多遍相同的代码,直观的想法,自然就是把这些代码装到一个"箱子"里,给这个"箱子&qu ...

  5. python3教程-终于清楚python3详细教程

    跟Java语言一样,python语言也有类的概念,直接使用class关键字定义python类.在python类,定义类的方法.然后直接使用类的初始化调用自身,获取相应的属性.以下是小编为你整理的pyt ...

  6. python语言视频-Python语言之Python3 实现简易局域网视频聊天工具

    本文主要向大家介绍了Python语言之Python3 实现简易局域网视频聊天工具,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 操作系统为 Ubuntu 16.04,OpenCV ...

  7. Python3 简明教程

    课程简介:简明易懂的 Python3 课程,不仅适用于那些有其它语言基础的同学,对没有编程经验的同学也非常友好.本课程不仅讲解了 Python3 基础知识,还介绍了 PEP8.Virtualenv.测 ...

  8. python基础教程博客_Python基础教程_Python入门知识

    Python基础教程频道为编程初学者提供入门前的所有基础知识,必须要掌握的一些PYTHON基础语法语句,基本的数据类型. 让大家可以更快速.更容易理解的的方式掌握Python编程所需要的基础知识,灵活 ...

  9. ArcGIS Pro 简明教程(4)工具和模型构建器

    ArcGIS Pro 简明教程(4)工具和模型构建器 by 李远祥 工具箱中的工具 ArcGIS Pro 在1.3版本基本上已经继承了ArcMap的所有工具,而且会不断加入一些它自身才有的工具,例如适 ...

最新文章

  1. 【面向工业界】推荐算法工程师培养计划
  2. 2018-2020年Gartner战略科技发展趋势一览!
  3. 生成大小写字母加数字混合ID与自定义进制转换
  4. 文档管理套包Aspose.Total 5月更新 | 附下载
  5. php python插件安装,小弟我的vim配置和插件 小型 python php IDE
  6. ​linux中使用文本工具截取ip 的几种方法
  7. 老大,我就想加个索引,怎么就这么难?
  8. kmeans中的k的含义_聚类的Python实现(二):确定分群数K
  9. cron表达式 每隔8小时_cron表达式详解
  10. mysql bootstrap pxc_Mysql高可用之PXC
  11. 数字图像处理之图像几何变换
  12. 戴尔服务器显示e1810,戴尔服务器提示: PowerEdge2950 E1810 HDD 1 Fault该如何解决?求帮助!!!...
  13. Python eval 与 exec 函数 - Python零基础入门教程
  14. 在Android中查看和管理sqlite数据库
  15. 绿城中国的数字化转型之大中台实践
  16. 小米路由器显示无法连接服务器错误代码,小米路由器:路由器无法上网怎么办...
  17. vs安装以及简单使用教程
  18. java 上传文件接口_Java接口实现文件上传
  19. 简单好听的id_这些女生王者id简单干净名字,不信你不心动!
  20. 用python将doc文件转换成docx文件

热门文章

  1. kali2020进入单模式_蚂蚁集团技术专家山丘:性能优化的常见模式及趋势
  2. 2022-2028年中国抽油烟机行业投资分析及前景预测报告
  3. c++中的auto关键字
  4. 人要懂得放下已经发生,却又无法改变的事情
  5. 【Sql Server】数据库的安全机制
  6. 机房收费系统【VB版】——添加和删除用户
  7. 生成树计数Matrix-Tree定理-数学
  8. AI 芯片的分类及技术
  9. 用NumPy genfromtxt导入数据
  10. PyTorch 数据并行处理