羊城杯2024 - logger
文件属性
| 属性 | 值 |
|---|---|
| Arch | amd64 |
| RELRO | Full |
| Canary | on |
| NX | on |
| PIE | off |
| strip | yes |
解题思路
在warn函数中如果栈溢出会抛出"Buffer Overflow",以char *丢出来。查看got,
发现有system函数,看到有catch块调用了system,catch类型是const char *。
由于char *可以cast到const char *,因此我们如果能跳转到这个地方,就有机会执行命令。
在warn函数中,通过栈溢出,我们能够控制rbp和ret addr,而C++正是利用了返回地址来判断被谁catch,
具体可以看这篇文章。因此,
如果我们能把返回地址修改为0x401bc2 + 1,就可以被0x401bc7块catch。经调试,
跳转过去后,rdx为1,会跳过_Unwind_Resume,并且rdi为"Buffer Overflow"的地址。
最后我们只需要把这个字符串改成"/bin/sh"就可以拿shell了。
trace函数可以修改record字符串数组,只要字符串首字符为'\0'就能覆写字符串,
并且存在off-by-null,而"Buffer Overflow"是最后一个字符串,因此写满倒数第二个字符串,
就可以覆写最后一个字符串。
EXPLOIT
1 | from pwn import * |

参考
- 标题: 羊城杯2024 - logger
- 作者: RocketDev
- 创建于 : 2024-10-21 01:28:00
- 更新于 : 2024-10-27 11:38:00
- 链接: https://rocketma.dev/2024/10/20/logger/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论