pwntool

r0xy / 2024-11-13 / 原文

基本使用

首先需要 from pwn import * 把 pwntools 导入进来,它同时会把一些系统库给导入进来

本地打的话 p=process('./filename'),远程的话 p=remote('192.168.1.103',10001)

p.close() 关闭

发送 payload

p.send(payload) 发送 payload

p.sendline(payload) 发送 payload,并进行换行(末尾\n)

p.sendafter(some_string, payload) 接收到 some_string 后, 发送你的 payload

p.sendlineafter(some_string, payload) 接收到 some_string 后, 发送你的 payload,加个换行

接收返回内容

p.recvn(N) 接受 N(数字) 字符

p.recvline() 接收一行输出

p.recvlines(N) 接收 N(数字) 行输出

p.recvuntil(some_string) 接收到 some_string 为止

p.interactive() 直接进行交互,相当于回到shell的模式,一般在取得shell之后使用

io.recvuntil("\n", drop = True) 会接收数据直到遇到换行符,并返回换行符之前的所有字符。

生成 shellcode

asm(shellcraft.sh())

elf.sym['main']

elf.sym['main'] 用于获取ELF文件中名为main的符号的地址。sym属性提供了访问ELF文件中符号表的功能。通过elf.sym['main'],可以获取到main函数在内存中的地址。

当开启了PIE(Position Independent Executable)和ASLR(Address Space Layout Randomization)之后,ELF文件在内存中的加载地址将不再是固定的。

在这种情况下,elf.sym['main']返回的地址将不再是程序运行时的实际内存地址。相反,它返回的是一个相对地址,通常是基于ELF文件的基地址(base address)的偏移量。

ELF

首先需要 elf=ELF('./filename') 来产生一个对象

elf.symbols['a_function'] 找到 a_function 的地址

elf.got['a_function'] 找到 a_function的 got

elf.plt['a_function'] 找到 a_function 的 plt

elf.next(e.search("some_characters")) 找到包含 some_characters 可以是字符串,汇编代码或者某个数值的地址

debug信息

context(log_level='debug',arch='arm64',os='linux')

gdb调试

def dbg(io)

​ gdb.attach(io)

​ pause()

checksec

PWN-最新checksec的安装和使用_pwn checksec-CSDN博客