「PWN」【西湖论剑2022】Writeup WP 复现
· 阅读需 2 分钟
坐大牢比赛 +1
吃饭前写的,剩下的还没复现
babycalc
首先要绕过这个解密。可以用 Z3 Prover 求解(那么有没有人是手算的呢,哈哈,原来是我啊)
在这里,可以注意到 buf 能够溢出修改 i 的值,从而修改一个字节的值。同时,buf[(int)read]
这里,填满 0x100 字节也可以将 rbp 的最高位覆写为 0。
因此,我们可以修改返回地址最后一字节从而返回到另一个 leave; ret
,配合上修改的最后一字节来形成栈迁移。
因为迁移的地址是不确定的,我们可以填充 ret
的地址作为 slide code,增加成功率(就和 shellcode 填充 \x90
一样的效果)
第一次利用 puts 泄露 libc,第二次打 one_gadget 或者返回 system 都可以。
写 exp 的时候还写挺复杂。