一道2022国赛华南赛区的格式化字符串题。
首先看一下保护
程序没有canary。
看一下程序逻辑:
函数很简单,只有一个main。
程序提供两个选项对应两个输出函数,分别为printf和__printf_chk。均有格式化字符串漏洞。两者不同之处在于__printf_chk对格式化字符串的任意地址写%x$n这种有保护,x$必须是连着的即想要用%4$n必须先用%3$n。且注意到,__printf_chk输出一次之后会关闭标准输出,即我们只有一次泄露信息的机会。且printf调用完会直接exit。
看到这其实有一个基本思路了,首先__printf_chk肯定是给我们一次机会泄露信息用的。
然后一次printf用于getshell,要不然程序直接exit了就没有后续了。
攻击思路如下:
1、利用一次__printf_chk同时泄露栈地址和libc地址
2、一次printf向printf的返回地址写入ogg直接getshell
完整攻击脚本如下:
程序执行结果如下:
成功getshell。值得注意的是因为之前的__printf_chk调用完关闭了程序的标准输出,则我们拿到shell之后通过exec 1>&2将其重定向即可恢复输出。然后直接cat flag即可。
【笔者在打栈之前也尝试了exit_hook,但是没有劫持成功,知道什么原因的师傅也可在评论区解释下或跟我私聊】
By Del0n1x
Keyboard
风车库 2023-01-04
实在智能RPA 2024-08-02