본문 바로가기
Hacking/DreamHack

[DreamHack] 드림핵 amocafe

by st-og 2023. 11. 17.


소스코드


풀이

해당 문제는 비트연산을 통해 나온 결괏값을 다시 초기 상태로 되돌렸을 때의 값을 찾는 문제다.

위의 그림의 값을 초기 상태로 되돌려 input박스에 입력해야 한다.

 

코드 설명

menu_str = '' # 결과값이 저장될 변수
org = FLAG[10:29] #초기 상태 값
org = int(org) 
st = ['' for i in range(16)] #문자열 저장공간 16자리를 만들어 둠

변수 생성과 초기 값을 형변환 하여 비트 연산을 준비한다.

 

for i in range (0, 16):
    res = (org >> (4 * i)) & 0xf #4바이트씩 왼쪽으로 비트를 이동한 후 마지막 4바이트를 res에 저장
    if 0 < res < 12:   
        if ~res & 0xf == 0x4: #NOT을 했을 때 0x4가 되는 비트는 1011이므로 해당 조건문은 if res==11 과 동일하다.
            st[16-i-1] = '_' #11일 경우 _로 변경
        else:
            st[16-i-1] = str(res) #나머지 경우 문자열로 변환 후 저장
    else:
        st[16-i-1] = format(res, 'x') # format(x)를 통해 16진수로 변환
menu_str = menu_str.join(st) #리스트의 값을 전부 가져와 차례대로 문자열로 변환

16번의 반복을 통해 4비트씩 움직이게 한다.(==64비트)

비트의 마지막 4비트를 res에 저장하고 해당 값을 각 조건에 맞게 리스트에 저장한다.

 

# 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)

post로 받은 입력 중 org와 같은 값이 입력될 경우 flag를 출력한다.


 

만약 org의 값이 54라면 54를 이진수로 변환 시 0011 0110이 되는데 

첫 번째 for문에서 i가 0일 때 0만큼 시프트 연산이 적용되면 0011 0110이 된다

( >> x : x의 수만큼 비트를 화살표 방향 따라 이동, 이동 후 비는 공간은 0으로 대체)

 

그 후 & 0xf를 통해 16진수 f(==이진수 1111)와 and연산을 하게 되면 st리스트에는 0110이 저장이 된다.

(and연산은 두 값이 모두 1일 경우 1이 되는 연산이다)

 

두 번째 for문이 시작되면 i가 1이 되고 시프트 연산을 4만큼 해야 한다.

0011 0110에서 4만큼 옆으로 이동하게 되면 0000 0011의 모습이 되고 and 연산을 통해 마지막 4비트만 확인하게 되므로

st리스트에는 0011이 저장이 된다.

 

해당 문제는 이러한 연산을 거쳐서 나온 값이 1_c_3_c_0__ff_3e  임을 알려준다. 

그럼 이 16진수 문자열을 다시 비트로 변경 후 10진수로 바꿔준다면 올바른 input이 될 것이다.

 

문자열 2진수
1 0001
_(=B) 1011
3 0011
c 1100
0 0000
f 1111
e 1110

 

해당 표를 통해 각 문자열에 맞는 2에 맞게 2진수를 입력해 준다면 

0001101111001011001110111100101100001011101111111111101100111110 이라는 2진수가 나온다

해당 2진수를 10진수로 변경하게 되면 2002760202557848382라는 숫자가 나온다

 

값을 입력하면

 

flag를 획득할 수 있다.