본문 바로가기

모의해킹/Dreamhack

amocafe

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