1. 개요
HTTP Range Requests 문제
2. 분석
코드를 보면, 2GB 크기의의 랜덤한 문자열을 생성 후 2gb.txt로 저장하고, flag.txt 파일의 내용을 2gb.txt 파일 끝에 추가했습니다
FROM nginx:1.23.3-alpine-slim
COPY nginx.conf /etc/nginx/nginx.conf
COPY flag.txt /usr/share/nginx/html/flag.txt
RUN cd /usr/share/nginx/html && \
dd if=/dev/random of=2gb.txt bs=1M count=2048 && \
cat flag.txt >> 2gb.txt && \
rm flag.txt
다만, nginx 설정을 보면, limit_rate가 8bytes여서 2GB 크기의 파일을 전부 받는데는 정말 오랜 시간이 걸립니다.
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
gzip off;
limit_rate 8; # 8 bytes/s = 64 bps
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
8bytes를 받는데 대략, 34초가 걸리는데, 2GB은 약 2535223 시간이 걸립니다.
병렬처리를 한다고 해도 불가능한 시간입니다.
다시 생각해보면, 2GB를 모두 받을 필요가 없습니다.
flag.txt 파일의 내용을 2gb.txt 파일 끝에 추가했기 때문에 range-request로 파일의 끝부부만 받아오면됩니다.
3. 코드
import requests
def get_data_by_range(start: int, end: int) -> bytes:
headers = {
"Range": f"bytes={start}-{end}"
}
r = requests.get("https://64bps-web.wanictf.org/2gb.txt", headers=headers)
return r.content
if "__main__" == __name__:
start_byte = 2 ** 31
end_byte = start_byte + 64
data = get_data_by_range(start_byte, end_byte)
print(data) # FLAG{m@ke_use_0f_r@n0e_reques7s_f0r_l@r9e_f1les}
다른 풀이를 보고 알았는데, Range를 지정할 때 -60과 같이 음수를 지정해서 뒤에서 해당 바이트 길이 만큼의 데이터만 요청할 수 도 있습니다.
'CTF' 카테고리의 다른 글
[WaniCTF 2023] Extract Service 1 (0) | 2023.05.06 |
---|---|
[WaniCTF 2023] netcat (0) | 2023.05.06 |
[angstromCTF 2023] brokenlogin (0) | 2023.04.29 |
[angstromCTF 2023] hallmark (0) | 2023.04.29 |
[angstromCTF 2023] Celeste Speedrunning Association (0) | 2023.04.29 |