Season 1/워게임

[dreamhack] rev-basic-5 문제풀이

작성자 - S1ON
[Reversing] rev-basic-5 문제풀이

문제를 확인해보자.

 

 

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

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

 


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

 

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

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

 

 

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

 

[cmp rax, 18]                                   // 24번 반복

[mov eax, byte ptr ds:[rcx+rax]]           // 첫번째 입력 값 eax에 저장

[inc ecx]                                         // ecx 값 증가

[movzx ecx, byte ptr ds:[rdx+rcx]]        // 두번째 입력 값 ecx에 저장

[add eax, ecx]                                 // eax+ecx

[lea rdx, qword ptr ds:[7FF662833000] // rdx에 [7FF662833000] 주소 저장

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

[cmp eax, ecx]                                // eax와 ecx를 비교

 

위 함수는 i번째 입력 값과 i+1번째 입력 값에 더하기 연산을 하여 [7FF662833000] 주소의 i번째 값을 비교한다.

[7FF662833000] 주소에 저장된 값을 확인해보자.

 

00007FF662833000  AD D8 CB CB 9D 97 CB C4 92 A1 D2 D7 D2 D6 A8 A5  .ØËË..ËÄ.¡Ò×ÒÖ¨¥  
00007FF662833010  DC C7 AD A3 A1 98 4C 00 00 00 00 00 00 00 00 00  ÜÇ.£¡.L.........  

 

해당 문제를 쉽게 풀기 위해서 코드를 짰는데 로직은 다음과 같다.

1. [7FF662833000] 주소에 마지막 위치에 저장된 값은 23번째(0x4C), 24번째(0x00)2. 23번째 문자열+24번째 문자열=0x4C 이므로 FLAG의 23번째 문자열은 0x4C3. 23번째 문자열에서 22번째 문자열을 뺀 나머지가 FLAG의 22번째 문자열4. 뒤에서부터 차례로 연산하여 값을 리스트에 저장5. 리스트를 뒤집어서 FLAG를 출력

 

str = 'AD','D8','CB','CB','9D','97','CB','C4','92','A1','D2','D7','D2','D6','A8','A5','DC','C7','AD','A3','A1','98','4C','00'
 
res=[]
tmp=76
 
for i in range(2,24):
    tmp=int(str[23-i],16)-tmp
    res.append(chr(tmp))
    
res.reverse()
flag=''.join(res)
 
print(flag)

[

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

 


위 코드에서 23번째 문자열 0x4C='L'가 리스트에 저장되지 않았으므로 마지막에 'L'을 추가하여 

프로그램에 해당 FLAG를 입력해보자.

 

 

문제풀이 끗

Contents

이 글이 도움이 되었다면, 응원의 댓글 부탁드립니다.