biny
[LEVEL 1] amocafe 본문

#!/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)
주어진 코드는 다음과 같다.
FLAG의 일부를 가져와 비트 연산을 수행하여 나온 결과를 st 배열에 넣고 menu_str에서 합치는 과정
이후, 유저 입력이 FLAG의 일부와 같은지 비교 후 동일하다면, FLAG출력
# 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_' 카테고리의 다른 글
| [LEVEL 1] baby-union (0) | 2023.11.16 |
|---|---|
| [LEVEL 1] simple_sqli_chatgpt (0) | 2023.11.14 |
| [Beginner] phpreg (1) | 2023.11.14 |
| [LEVEL 2] xss-2 (0) | 2023.11.06 |
| [LEVEL 1] session-basic (0) | 2023.11.06 |