Dreamhack 문제 풀이 - rev-basic-4

Dreamhack - rev-basic-4

 

기본적인 구조 설명은 생략하고 키를 찾는 부분만 설명합니다.

 

어셈블리 코드

입력값을 받아서 한바이트씩 연산하여 아래의 메모리에 있는 값과 비교한다.

 

연산 1) sar eax, 4

  -> 입력값을 오른쪽으로 4칸 비트 밀기

  -> 연산 결과가 저장된 eax는 건드리지 않음

 

연산 2) shl ecx, 4 및 and ecx, F0

 -> 입력값에 왼쪽으로 4칸 비트 밀기

 -> 그리고 다시 ecx를 F0과 and 연산

 

연산 3) or eax, ecx

 -> 연산1과 연산2의 결과에 OR 연산 사용 -> eax에 저장됨

 

연산 4) lea ~ 부터 cmp eax, ecx

 -> 연산3의 결과와 메모리 [7FF7FCAE3000]에 저장된 값을 비교한다

 

 

중간에 적용된 OR 연산은 역원이 존재하지 않으므로, 방정식 형태로 답을 찾는 것은 불가능함. 따라서 입력을 받는 ASCII 값의 범위가 정해져있다는 점에 착안하여 반복문으로 해당 연산을 수행하여 메모리에 저장된 문자열과 일치하는 입력값을 찾는다.

 

 

파이썬 풀이 코드

string = "24 27 13 C6 C6 13 16 E6 47 F5 26 96 47 F5 46 27 13 26 26 C6 56 F5 C3 C3 F5 E3 E3".split(" ")
answer = ""

for char in string:
    for num in range(127):
        result = (num>>4)^((num<<4) & int("F0",16))
        if result == int(char,16):
            answer += chr(num)

print(answer)

실행 결과

Br1ll1ant_bit_dr1bble_<<_>>

 

 

 

댓글

Designed by JB FACTORY