본문 바로가기
CTF

[WaniCTF 2023] 64bps

by skyepodium 2023. 5. 5.

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