python的pwntools工具的日常使用

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

 

转载于:https://www.cnblogs.com/lqrbk/p/10904412.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kibana可视化管理页面详细使用说明

Kibana可视化管理页面详细使用说明 使用浏览器访问 ip:5601 默认端口,进入首页 Discover:日志管理视图 主要进行搜索和查询 Visualize:统计视图 构建可视化的图表 Dashboard:仪表视图 将构…

OO_BLOG3_规格化设计(JML学习)

目录 JML语言学习笔记理论基础应用工具链情况JMLUnit/JMLUnitNGUNIT3 作业分析作业 3-1 实现两个容器类Path和PathContainer作业 3-2 实现容器类Path和数据结构类Graph作业 3-3 实现容器类Path,地铁系统类RailwaySystem规格撰写的心得与体会最后,衷心感谢…

JAVA获取JVM内存空间和物理内存空间

一、获取JVM内存空间 系统环境:WIN JDK版本:1.8re 直接调用Runtime中相应的方法即可: public long maxMemory() Returns the maximum amount of memory that the Java virtual machine will attempt to use. If there is no inherent lim…

CMU Database Systems - Sorting,Aggregation,Join

Sorting 排序如果可在内存里面排,用经典的排序算法就ok,比如快排 问题在于,数据表中的的数据是很多的,没法一下都放到内存里面进行排序 所以就需要用到,外排,多路并归排序 看下最简单的,2路并归…

springboot线程池的使用和扩展

实战环境 windowns10;jdk1.8;springboot 1.5.9.RELEASE;开发工具:IntelliJ IDEA; 实战源码 本次实战的源码可以在我的GitHub下载,地址:gitgithub.com:zq2599/blog_demos.git,项目主…

统计单词个数

我是抄题解狂魔 /* 1.s.substr(x,len) 在s中取出从x位置开始,长度为len的字符串,并返回string类型的字符串。 2.s.find(a) 在s中查找字符串a,并返回起始下标(从0开始),若不存在,返回1844674407370955161&am…

通过Rancher安装K8s

说明 我们用kubernetes去管理Docker集群,即可以将Docker看成Kubernetes内部使用的低级别组件。另外,kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。希望我这篇文章中简单的描述能让你对两者有所理解和认识。 机…

35. 搜索插入位置-LeetCode

心得:这个题也是二分查找,但是有个小技巧:当left>right的时候 left就是要插入的位置。 代码: 1 class Solution {2 public int searchInsert(int[] nums, int target) {3 if(numsnull||nums.length0)4 …

Kubectl指令集

1 Kubectl指令集 1.1 Master查询节点信息 [rootmaster1 kubernetes-1.10]# kubectl get nodes 1.2 查询所有Pod信息 [rootmaster1 ~]# kubectl get pods --namespacekube-system 1.3 查询故障的Pod信息 [rootmaster1 ~]# kubectl get pods -n kube-sys…

SQL基础培训实战教程[全套]

学习简介:林枫山根据网上搜索资料进行参考,编写制作的SQL Server实操学习教程,欢迎下载学习。 下载链接目录如下: 进度0-SQL基础语法 下载学习文档 进度1-建数据表-美化版-2018-6-12 下载学习文档 进度2-关于主键-美化…

K8S仪表板Service unavailable故障的解决办法

K8S仪表板Service unavailable故障的解决办法 (使用Rancher部署Kubernetes后访问仪表板提示Service unavailable的问题) 一、逐项检查: 1、操作系统Kernel版本(3.10以上) 2、检查OS版本(Ubuntu16.04.x、…

实验五报告

一、实验结论&#xff1a; 1. 二分查找&#xff1a;补足程序ex1_1.cpp// 练习&#xff1a;使用二分查找&#xff0c;在一组有序元素中查找数据项 // 形参是数组&#xff0c;实参是数组名 #include <stdio.h> const int N5; int binarySearch(int x[], int n, int item…

关于浏览器内核

介绍一下对浏览器内核的理解主要分成两个部分&#xff1a;渲染引擎(Render Engine)和JS引擎。常见的浏览器内核有哪些&#xff1f;Trident内核&#xff1a;IE&#xff0c;360&#xff0c;搜过浏览器&#xff1b;Gecko内核&#xff1a;Netscape6及以上版本&#xff0c;Presto内核…

docker 全部杀掉

杀死所有正在运行的容器 docker kill $(docker ps -a -q) 删除所有已经停止的容器 docker rm $(docker ps -a -q) 删除所有未打 dangling 标签的镜像 docker rmi $(docker images -q -f danglingtrue) 删除所有镜像 docker rmi $(docker images -q) 强制删除镜像名称中包含“do…

实验五 网络编程与安全-----实验报告

一、实验五 网络编程与安全-1 1.实验要求&#xff1a; 两人一组结对编程&#xff1a; &#xff08;1&#xff09;参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA &#xff1b; &#xff08;2&#xff09;结对实现中缀表达式转后缀表达式的功能 MyBC.java&#xff1b…

K8S的HelloWorld之旅

安装kubectl。使用Google提供商&#xff08;如Google Container Engine或Amazon Web Services&#xff09;创建Kubernetes群集。本教程创建一个 外部负载均衡器&#xff0c;它需要一个云提供商。配置kubectl与Kubernetes API服务器通信。有关说明&#xff0c;请参阅云提供商的文…

思维构造——cf1090D

/* 只要找到两个没有关系的点即可 */ #include<bits/stdc.h> using namespace std; #define maxn 100005 long long n,m; int a[maxn],b[maxn]; vector<int>G[maxn]; int main(){cin>>n>>m;if(n1){puts("NO");return 0;}if(n*(n-1)/2<m)…

误删docker0网桥之后怎么办呢?

误删docker0网桥之后怎么办呢&#xff1f; 今天&#xff0c;在搭建k8s node节点环境的时候&#xff0c;好巧不巧&#xff0c;执行了如下命令&#xff1a; 1 2 [roothxin221 ~]# ifconfig docker0 down &>/dev/null [roothxin221 ~]# brctl delbr docker0 &>/de…

boost.asio学习

https://mmoaay.gitbooks.io/boost-asio-cpp-network-programming-chinese/content/Chapter1.html转载于:https://www.cnblogs.com/hshy/p/10930398.html

Harbor:私有企业级Registry仓库--快速搭建

前言 Harbor可以通过Docker Composer的方式来部署&#xff0c;如果有正常运行的k8s环境&#xff0c;也可以使用k8s来部署Harbor&#xff0c;本文采用 Docker Composer的方式。 准备 假定Linux系统为Centos 7。 docker &#xff0c;默认安装即可 yum -y install docker 1 dock…