2025CISCN&长城杯半决赛 PWN typo详细题解
LonTan0 二进制安全 163浏览 · 2025-03-26 13:15

typo

代码审计及思路

有三个功能add,free,edit,没有uaf,漏洞在edit中。

图片加载失败


可以读入0x100个字节在栈上,然后snprintf函数会把栈上的这些数据复制给堆块里,造成堆溢出,但是snprintf会被\x00截断,那就是说只能覆盖size位了吗?当然不是,可以通过一些格式化字符绕过,把payload里的\x00替换为%n$p,去找偏移为n,数据为0的,这样可以通过snprintf输出给堆块,并且不影响payload。

这样写,snprintf在解析format时不会遇到\x00,而是去解析这个%n$p,但是解析到为0,依然会输出给原来\x00的位置,这样绕过\x00截断问题。

还有一个点就是add中会保存size在fd位,同时edit是根据这个size读入数据的,如果通过溢出修改这个size,就是常见的堆溢出,改tcache bins中堆块的fd为free_hook等操作。

这样的话,这道题肯定还是要先泄露libc,那么没有show且保护全开,结合上面的漏洞。

1先利用堆溢出合并一个可以进入unsorted bins的堆块,同时合并前的一个小堆块留在tcachebins,改main_arena这个libc地址最后两位为stdout,远程需要爆破,得到libc地址。

2然后把合并的堆块恢复回去,通过修改其中一个堆块的fd的size,利用两次修改后面堆块的fd分别为free_hook,和/bin/sh,即可getshell

gdb调试

首先是堆块合并,

图片加载失败


然后令2号堆块同时位于tcache bins和unsorted bins中,

图片加载失败


改为stdout-8,因为edit的读入在bk位,

图片加载失败


get_libc_base

图片加载失败


之后就是改一个size,然后改tcache bins内堆块的fd,同样是free_hook-8,

图片加载失败


getshell

图片加载失败


exp


附件:
0 条评论
某人
表情
可输入 255

没有评论