【逆向学习记录】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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章