>>> context.arch= 'i386'>>> context.os= 'linux'>>> context.endian= 'little'>>> context.word_size = 32當然 , 你也可以一次性設置好這些變量:
>>> asm('nop')'\x90'>>> context(arch='arm', os='linux', endian='big', word_size=32)>>> asm('nop')'\xe3 \xf0\x00'
send(data): 發(fā)送數據sendline(data) : 發(fā)送一行數據 , 相當于在末尾加\nrecv(numb=4096, timeout=default) : 給出接收字節(jié)數,timeout指定超時recvuntil(delims, drop=False) : 接收到delims的pattern(以下可以看作until的特例)recvline(keepends=True) : 接收到\n , keepends指定保留\nrecvall() : 接收到EOFrecvrepeat(timeout=default) : 接收到EOF或timeoutinteractive() : 與shell交互- ELF模塊:獲取基地址、獲取函數地址(基于符號)、獲取函數got地址、獲取函數plt地址
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的地址- 在編寫exp時 , 最常見的工作就是在整數之間轉換 , 而且轉換后 , 它們的表現形式就是一個字節(jié)序列 , pwntools提供了打包函數 。
p32/p64: 打包一個整數 , 分別打包為32位或64位u32/u64: 解包一個字符串 , 得到整數# 比如將0xdeadbeef進行32位的打包 , 將會得到'\xef\xbe\xad\xde'(小端序)payload = p32(0xdeadbeef)#pack 32 bits numberpayload = p64(0xdeadbeef)#pack 64 bits number- 匯編和反匯編
# 匯編:>>> asm('nop')'\x90'>>> asm('nop', arch='arm')'\x00\xf0 \xe3'# 可以使用context來指定cpu類型以及操作系統(tǒng)>>> context.arch= 'i386'>>> context.os= 'linux'>>> context.endian= 'little'>>> context.word_size = 32# 反匯編>>> print disasm('6a0258cd80ebf9'.decode('hex'))0:6a 02push0x22:58popeax3:cd 80int0x805:eb f9jmp0x0注意 , asm需要binutils中的as工具輔助 , 如果是不同于本機平臺的其他平臺的匯編 , 例如在我的x86機器上進行mips的匯編就會出現as工具未找到的情況 , 這時候需要安裝其他平臺的cross-binutils 。
- Shellcode生成器
>>> print shellcraft.i386.nop().strip('\n')nop>>> print shellcraft.i386.linux.sh()/* push '/bin///sh\x00' */push 0x68push 0x732f2f2fpush 0x6e69622f...結合asm可以可以得到最終的pyaload
from pwn import *context(os='linux',arch='amd64')shellcode = asm(shellcraft.sh())或者from pwn import *shellcode = asm(shellcraft.amd64.linux.sh()) - 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.read(0, elf.bss(0x80))實際相當于rop.call('read', (0,elf.bss(0x80))) 。通過多次添加函數調用 , 最后使用str將整個rop chain dump出來就可以了 。call(resolvable, arguments=()): 添加一個調用 , resolvable可以是一個符號 , 也可以是一個int型地址 , 注意后面的參數必須是元組否則會報錯 , 即使只有一個參數也要寫成元組的形式(在后面加上一個逗號)經驗總結擴展閱讀
- 四十一 增刪查改分頁 Java開發(fā)學習----MyBatisPlus標準數據層開發(fā)
- 中 學習ASP.NET Core Blazor編程系列十——路由
- CC1,3,6回顧
- 圖學習【參考資料2】-知識補充與node2vec代碼注解
- 二十四 設計模式學習:Spring 中使用到的設計模式
- Java安全之CC3
- TensorFlow深度學習!構建神經網絡預測股票價格!?
- JUC學習筆記——共享模型之管程
- Seata Server 1.5.2 源碼學習
- 2022極端高溫!機器學習如何預測森林火災?? 萬物AI
