0.前言&说明
(本博客发布时间为北京时间2021年11月14日18:00后。)
这道题似乎是深育杯除了签到题最简单的一题了……
(暂不提供ELF文件下载。)
1.WP
首先还是查看保护:
发现保护全开。
试运行:
有两处输入的地方,目前还看不出什么。
丢到 IDA 里分析(改了函数名便于辨认):
发现有一个函数存在明显的格式化字符串漏洞且有明显的栈溢出漏洞。
并且发现程序中有一个后门函数:
那么目标就是绕过 canary 保护和 PIE 保护利用栈溢出覆盖返回地址为后门函数的地址。
canary的绕过方法如下:
用gdb动态分析程序,并在printf函数处下断点:
运行至此,查看canary和栈:
发现在栈上距离栈顶0088处有canary,计算偏移后为17。因此配合格式化字符串漏洞用%17$p即可泄露canary。
PIE的绕过方法如下:
从刚刚的图中可以看到0072处有一个endbr64的地址,其后三位为140,因此可以很快在IDA中找出它是偏移为0x1140处的。
(因为内存页存储以0x1000为单位,因此地址的后三位是不变的。)
计算偏移后为15,因此用%15$p即可泄露它的真实地址,再用这个地址减去它的偏移量0x1140得到程序基地址,再加上后门函数的偏移量0x1228即可得到后门函数的真实地址。
之后就是写脚本了。
完整的exp如下:
1 | from pwn import * |
运行后的效果如下图:
成功获得了flag。