본문 바로가기

DreamHack

[DreamHack] amocafe

https://dreamhack.io/wargame/challenges/899

 

amocafe

Description 아모카페에 오신 것을 환영합니다! 메뉴 번호를 입력하여 주문할 수 있는 웹 서비스가 작동하고 있습니다. 아모의 최애 메뉴를 대신 주문해 주면 아모가 플래그를 준다고 합니다. 첨부

dreamhack.io

난이도: Level 1

app.py 

#!/usr/bin/env python3
from flask import Flask, request, render_template

app = Flask(__name__)

try:
    FLAG = open("./flag.txt", "r").read()       # flag is here!
except:
    FLAG = "[**FLAG**]"

@app.route('/', methods=['GET', 'POST'])
def index():
    menu_str = ''
    org = FLAG[10:29]
    org = int(org)
    st = ['' for i in range(16)]

    for i in range (0, 16):
        res = (org >> (4 * i)) & 0xf
        if 0 < res < 12:
            if ~res & 0xf == 0x4:
                st[16-i-1] = '_'
            else:
                st[16-i-1] = str(res)
        else:
            st[16-i-1] = format(res, 'x')
    menu_str = menu_str.join(st)

    # POST
    if request.method == "POST":
        input_str =  request.form.get("menu_input", "")
        if input_str == str(org):
            return render_template('index.html', menu=menu_str, flag=FLAG)
        return render_template('index.html', menu=menu_str, flag='try again...')
    # GET
    return render_template('index.html', menu=menu_str)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)

app.py 코드를 보면, FLAG의 일부를 가져와 비트 연산을 수행하여 나온 결과를 st 배열에 넣고 menu_str에서 합치는 과정을 볼 수 있습니다. 이후, 유저 입력이 FLAG의 일부와 같은지 비교 후 동일하다면, FLAG를 띄워줍니다. 

홈페이지에 1_c_3_c_0__ff_3e라는 문자열이 표시되어 있습니다. menu_str 값으로 이 값을 역연산하여 org 값을 알아내면 됩니다. 

Exploit Code

# 1_c_3_c_0__ff_3e
def rev():
    menu_str = "1_c_3_c_0__ff_3e"
    # menu_str = "15_106810248c310f2"
    st = ['' for i in range(16)]
    org = 0
    a = 15
    for c in menu_str:
        if c == '_':
            res = 11
            org = ( res << (4 * a)) | org
        elif c in ['c','d','e','f']:
            res = int(c, base=16)
            org = ( res << (4 * a)) | org
        else:
            res = int(c)
            org = ( res << (4 * a)) | org
        #if k >= 12:
        a = a - 1
    return org

def func(org):
    menu_str = ''

    org = int(org)
    print(org)

    st = ['' for i in range(16)]

    for i in range (0, 16):
        res = (org >> (4 * i)) & 0xf
        if 0 < res < 12:
            if ~res & 0xf == 0x4:
                st[16-i-1] = '_'
            else:
                st[16-i-1] = str(res)
        else:
            st[16-i-1] = format(res, 'x')
    menu_str = menu_str.join(st)
    return menu_str

print("REV: ", rev())
print("ORG: ", func(rev()))

위 코드를 통해 나온 결과 값을 입력으로 주면 아래와 같이 플래그를 획득할 수 있습니다. 

'DreamHack' 카테고리의 다른 글

[DreamHack] phpreg  (0) 2023.08.08
[DreamHack] cg-simple_sqli  (0) 2023.08.08
[DreamHack] development-env  (0) 2023.08.07
[DreamHack] Format String Bug  (0) 2023.06.19
[DreamHack] Return to Library  (0) 2023.06.19