728x90
@app.route('/', methods=['GET', 'POST'])
def index():
menu_str = '' # 빈문자열
org = FLAG[10:29] # FLAG의 인덱스 10위치에서부터 29까지의 길이을 org에 저장
org = int(org) # org에 저장된 문자을 int형으로 변형
st = ['' for i in range(16)] # 16개의 빈 문자열을 가지는 리스트 st를 생성
# 반복문....으로 연산.. 여기가 중요할듯,,,
for i in range (0, 16):
# res값은 org에서 4 * i 비트 오른쪽으로 쉬프트 하고 그다음 0xf와 AND 연산을 함
# 즉, org에서 i번째 4비트를 추출함
res = (org >> (4 * i)) & 0xf
# res가 1부터 11사이인 경우
if 0 < res < 12:
# ~res는 비트 반전이다
# ex) res가 7이면 비트는 0111 이고, 반전은 1000 이다.
if ~res & 0xf == 0x4: # 0x4 는 0100 가 같는지 검사
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)
한줄한줄 소스코드를 분석해보자~!
즉, menu_str와 비트연산을 실행해서 나온 결과 값인 st 배열과 합친다.
** 입력한 값이랑 org 값이랑 같으면 FLAG를 출력한다.
def index(org):
menu_str = "" # 빈 문자열
st = ["_" for _ in range(16)] # 16개의 밑줄 문자열을 가지는 리스트 st를 생성
for i in range(16):
res = (org >> (4 * i)) & 0xF
if 0 < res < 12:
if (~res & 0xF) == 0x4:
st[15 - i] = "_"
else:
st[15 - i] = str(res)
else:
st[15 - i] = format(res, "x")
menu_str = "".join(st)
return menu_str
def reverse_menu(menu_str):
org = 0
# 0부터 15까지 나타내기 위해
a = 15
for c in menu_str:
if c == "_":
# base 인코딩을 하면 _ 이 0xB로 되기때문에 11로 설정
res = 11
org = (res << (4 * a)) | org
elif c in ["c", "e", "f"]:
res = int(c, base=16)
org = (res << (4 * a)) | org
else:
res = int(c)
org = (res << (4 * a)) | org
a = a - 1
return org
if __name__ == "__main__":
menu_str = "1_c_3_c_0__ff_3e"
rev_str = reverse_menu(menu_str)
print("Reverse:", rev_str)
print("Original:", index(rev_str))
해당 FLAG 값을 출력할 수 있다.
'모의해킹 > Dreamhack' 카테고리의 다른 글
Broken Buffalo Wings (0) | 2023.11.05 |
---|---|
random-test (0) | 2023.11.04 |
command-injection-chatgpt (0) | 2023.11.01 |
XS-Search [WEB LEVEL1] (0) | 2023.05.23 |
simple-web-request [WEB LEVEL1] (2) | 2023.05.22 |