羊城杯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://rocketmadev.github.io/2024/10/20/logger/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论