【逆向學習記錄】Pwntool常用的數據處理方式

1 概述

偶爾在pwn的題目中,使用pwntool工具,由於不熟練,經常性遺忘,尤其是接收地址的時候,會卡在數據處理上,因此單獨起一篇文章,用來記錄日常用到的各種語句,後面如果發現了心得,可以繼續補充。
參考文章:
PwnTools常見用法
Pwntool 官方文檔

2 數據處理方式

2.1 發送數據

send(payload) 發送payload
sendline(payload) 發送payload,並進行換行(末尾\n)
sendafter(some_string, payload) 接收到 some_string 後, 發送你的 payload
sendlineafter(some_string, payload) 接收到 some_string 後, 發送你的 payload(末尾\n)
# 後面兩個經常用,相當於recvuntil

2.2 接收數據

recvn(N) 接受 N(數字) 字符
recvline() 接收一行輸出
recvlines(N) 接收 N(數字) 行輸出
recvuntil(some_string) 接收到 some_string 爲止

2.3 接收到數據之後

##如果接受到的是地址,可以使用recv之後,直接進行int強轉
data = p.recv("10")
libc_start_main_addr = int(data,16) - 247
##如果接受到的是地址,但是是反向的\x10\x00\x40,可以使用recv之後,直接進行int強轉
data = p.recv("10")
libc.address = int(data[:6][::-1].encode("hex"), 16) - libc.symbols["read"]
libc.address = u64(data[:6].ljust(8,"\x00")) - libc.symbols["read"]
#這兩種寫法都行,其中[::-1]的意思是逆序取字符串,可以使用u64 強制轉換

p32/p64: 打包一個整數,分別打包爲3264,主要是發送的時候需要打包
u32/u64: 解包一個字符串,得到整數,接收的時候需要解包

2.4 針對elf的處理

symbols['a_function'] 找到 a_function 的地址
##libc.symbols['read']
got['a_function'] 找到 a_function的 got
##elf.got["read"]
plt['a_function'] 找到 a_function 的 plt
##elf.plt["read"]
next(e.search("some_characters")) 找到包含 some_characters(字符串,彙編代碼或者某個數值)的地址
##libc.next(e.search("/bin/sh"))
#

2.5 關於context,調試log

context.log_level = 'DEBUG'
context(arch='amd64', os='linux')
context(os='linux', arch='amd64', log_level='debug')

2.6 關於gdb,當執行到此時,會彈出一個terminal

gdb.attach(process)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章