[dreamhack] rev-basic-4 문제풀이
[Reversing] rev-basic-4 문제풀이

문제를 확인해보자.

 

 

Correct를 출력하는 FLAG 값을 찾는 문제이다.

문제 파일을 x64dbg 프로그램으로 열어보자.

 

 

correct를 출력하는 flag 값을 찾아야하기 때문에 문자열 참조 찾기를 통해 correct 문자열을 찾아보자.

 

사용자가 FLAG를 입력하고 chall4.7FF7312B1000 함수에서 입력 값 비교를 한 뒤,

Correct/Wrong 메시지를 출력한다. 해당 함수를 따라가보자.

 

 

해당 함수에서 사용자 입력 값에 대해 수행하는 연산은 다음과 같다.

 

[cmp rax, 1C]                            // 사용자 입력 값을 0x1C=28번 반복하여 비교한다.

[movzx eax, byte ptr ds:[rcx+rax]]  // i번째 사용자 입력 값을 eax에 저장한다.

[sar eax, 4]                               // 부호가 있는 왼쪽 시프트 연산을 수행한다.

[movzx ecx, byte ptr ds:[rdx+rcx]]  // i번째 사용자 입력 값을 ecx에 저장한다.

[and ecx, F0]                             // ecx와 0xF0=240의 and 연산을 수행하여 ecx에 저장한다.

[or eax, ecx]                              // eax와 ecx의 or 연산을 수행하여 eax에 저장한다.

 

[lea rdx, qword ptr ds:[7FF7312B3000] // rdx에 7FF7312B3000 주소를 저장한다.

[movzx ecx, byte ptr ds:[rdx+rcx]]  // ecx에 7FF7312B3000 주소의 i번째 값을 저장한다.

 

[cmp eax, ecx]                           // eax와 ecx를 비교한다.

 

사용자 입력 값에 대한 연산을 수행하여 [7FF7312B3000] 주소의 값과 비교한다.

해당 주소의 값을 확인해보자.

 

00007FF7D6FB3000  24 27 13 C6 C6 13 16 E6 47 F5 26 96 47 F5 46 27  $'.ÆÆ..æGõ&.GõF'
00007FF7D6FB3010  13 26 26 C6 56 F5 C3 C3 F5 E3 E3 00 00 00 00 00  .&&ÆVõÃÃõãã..... 

 

해당 문제를 풀기 위해서 코딩을 사용했는데 로직은 다음과 같다.

 

1. 모든 사용자 입력 값에 대해 위 함수의 연산을 수행

2. 연산 결과와 [7FF7312B3000] 주소의 i번째 값을 비교

3. 비교 결과가 같으면 값을 저장한 후, 다음 문자열과 비교 (총 28번)

 

str='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','00' 
res='' 
i=0
j=0
 
while(j<28): 
    eax = i >> 4 
    ecx = i << 4 
    ecx = ecx & 0xF0 
    eax = eax | ecx 
 
    if eax == int(str[j],16):
        res+=chr(i)
        j+=1
        i=0
        continue
 
    i+=1
    
print(res)

 

위 코드를 수행하면 결과가 다음과 같이 출력된다.

 

 

그럼 프로그램에 위 값을 입력해보자.

 

 

문제풀이 끗