본문 바로가기

Reverse Engineering/Wargame

Dreamhack : rev-basic-1

문제 링크

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

 

rev-basic-1

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

dreamhack.io

 

 

풀이

 

해당 제공 파일 실행 시, 이전 rev-basic-0 문제와 동일하게 오답을 입력할 경우 Wrong이 출력 되어진다. 

 

그림 1

 

IDA를 사용해 해당 바이너리 파일을 열었을 때, 위와 같은 로직을 확인할 수 있었다. 사용자 입력 값을 받은 후, sub_140001000 함수 내에서 처리 후 이후 ZF 플래그 설정에 따라 Correct 혹은 Wrong으로 분기되어진다. 

 

먼저 해당 함수(sub_140001000)에 진입해 살펴보도록 한다 .

 

그림 2

 

여러 조건에 의해 계속해서 분기가 되는데, 이를 디컴파일(F5)하여 보도록 한다. 

 

그림 3

 

위 그림3에서 여러 if문이 존재함을 확인했고, 해당 조건들이 모두 참일 때, 아래와 같이 값이 세팅되어진다. 

 

그림 4

 

eax값이 1로 세팅되어 위의 함수가 끝이나 리턴되어진다. 

 

그림 5

 

그 후 test eax, eax 시 ZF플래그가 설정되어지지 않으므로, jz 분기문에서 왼쪽으로 분기되어진다. 

 

추가적으로, 아래 그림 6에서 byte ptr [rcx+rax] 로 해당 메모리 주소에 있는 값을 가져와 eax에 할당하고, 아래 cmp로직에 따라 eax와 주어진 값을 비교하게 된다. 

 

그림 6

 

byte ptr [rcx+rax] 에서 byte ptr [rcx+1] 이면, byte ptr [rcx+ 0] 보다 1바이트 뒤의 값 참조를 의미한다.