본문 바로가기
CTF/Dreamhack

[Dreamhack] Reversing Basic Challenge #4

by 8희 2024. 4. 10.

https://dreamhack.io/wargame/challenges/18/

 

rev-basic-4

Reversing Basic Challenge #4 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출

dreamhack.io

 

바이너리를 분석해서 correct를 출력하는 입력값을 알아내는 문제이다.

 


 

문제 파일을 실행해보면 rev-basic-3처럼 Input 입력을 받고

틀린 값을 입력하면 Wrong을 출력한다.

 

Correct를 출력해내기 위해서 문제 파일을 x64dbg로 열어봤다.

 

 

[마우스 우클릭 > 다음을 찾기 > 모든 모듈 > 문자열 참조]

문자열 참조를 통해 Correct 문자열을 찾았다.

 

 

해당 주소로 이동해봤다.

사용자가 Input 값을 입력하면 chall4.7FF7BACA1000 함수에서 입력 값을 비교한다.

그리고 비교 이후, 값이 맞으면 Correct로 틀리면 Wrong으로 점프한다.

 

 

chall4.7FF7BACA1000 함수로 이동해봤다.

해당 함수에서 수행하는 주요 연산을 분석해보자.

 

  • cmp rax, 1C                           
    • 사용자 입력 값을 0x1C=28번 반복하여 비교
  • movzx eax, byte ptr ds:[rcx+rax]
    • i번째 사용자 입력 값을 eax에 저장
  • movzx ecx, byte ptr ds:[rdx+rcx]
    • 위에서 sar 연산 후, i번째 사용자 입력 값을 ecx에 저장
  • and ecx, F0
    •  ecx와 0xF0=240의 and 연산을 수행하여 ecx에 저장
  • or eax, ecx
    • eax와 ecx의 or 연산을 수행하여 eax에 저장
  • lea rdx, qword ptr ds:[7FF6AFAA3000]
    • rdx에 7FF6AFAA3000 주소를 저장
  • movzx ecx, byte ptr ds:[rdx+rcx]
    • ecx에 7FF6AFAA3000 주소의 i번째 값을 저장
  • cmp eax, ecx
    • eax와 ecx를 비교

 

결과적으로 이러한 연산을 통해

사용자 입력 값(에 대한 연산을 수행한 값)과 7FF6AFAA3000 주소의 값을 비교한다.

 

따라서 해당 주소에 있는 값이 Correct를 출력할 수 있는 FLAG 값일 거라고 추측했다. 

 

 

덤프 창에서 해당 주소에 있는 값을 확인해봤다. 

지난 rev-basic-3 문제처럼 역산하는 코드를 통해서 풀어야 될 것 같다.

 

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

2. 연산 결과와 7FF6AFAA3000 주소의 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)

 

 

 

코드를 수행하면 이와 같은 값이 나온다. 

 

 

해당 값을 입력하면 Correct가 출력된다.

FLAG를 찾았다! 

 

 

정답: DH{Br1ll1ant_bit_dr1bble_<<_>>}

 


참고

https://mokpo.tistory.com/270

https://esyeonge.tistory.com/71

'CTF > Dreamhack' 카테고리의 다른 글

[Dreamhack] rev-basic-6  (0) 2024.04.28
[Dreamhack] rev-basic-5  (0) 2024.04.28
[Dreamhack] Reversing Basic Challenge #3  (0) 2024.04.06
[Dreamhack] Reversing Basic Challenge #2  (0) 2024.03.30
[Dreamhack] Reversing Basic Challenge #1  (0) 2024.03.23