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.pswp.cn/news/386759.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386759.shtml
英文地址,請注明出處:http://en.pswp.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…