axb_2019_fmt64(格式化单字节修改–\x00 截断)
格式化字符串漏洞,第一步是测偏移:aaaa%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
发现偏移为 8,我们可以通过 puts 表泄露 libc 基地址
1 | payload = p64(puts_got) + b"%8$s" |
这里我们发现我们本来应该泄露的地址为%8$s,但由于小端排序,Sent 的内容被 printf 接收之后会被 00 截断
导致无法泄露 Rececive%8$s 的地址。那就想办法把格式化字符串放在 p64(puts_got)前面:
1 | payload = b"%9$s" + b'AAAA' + p64(puts_got) |
由于%8$sAAAA 一共是 8 个字符,正好是一个内存单元,所以偏移需要加 1 编成%9$s,再看一下 DEBUG:
之后我们继续看,我们最终是想要把 printf 表修改成 system 表,从而执行 system(‘/bin/sh’);
发现他们只有最低的五位是不一样的,我们就只需要改这些就可以了。
1 | %xc$n -> 对应的是一个int,四字节的修改 |
1 | high_s = (system_addr >> 16) & 0xff # 单字节修改 |
看一下 payload0:
- 首先是%nc 表示输出 n 个字符,-9 表示除去前面 payload 的 9 个字符
- %12$hhn 表示修改到栈上的第 12 个参数,仅写一个字节
- c%13$hn 表示修改到栈上的第 13 个参数,修改两个字节
- .encode()把字符串转化为 bytes 类型数据
- 填充 32 个字节
- p64(printf_got + 2)说的是高 2 字节
1 | from pwn import * |
更新: 2026-04-05 10:32:31
原文: https://www.yuque.com/idcm/wnemg9/ze7xrabkotpg7lvk