문제 링크
https://dreamhack.io/wargame/challenges/15
rev-basic-1
Reversing Basic Challenge #1 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출
dreamhack.io
풀이
해당 제공 파일 실행 시, 이전 rev-basic-0 문제와 동일하게 오답을 입력할 경우 Wrong이 출력 되어진다.
IDA를 사용해 해당 바이너리 파일을 열었을 때, 위와 같은 로직을 확인할 수 있었다. 사용자 입력 값을 받은 후, sub_140001000 함수 내에서 처리 후 이후 ZF 플래그 설정에 따라 Correct 혹은 Wrong으로 분기되어진다.
먼저 해당 함수(sub_140001000)에 진입해 살펴보도록 한다 .
여러 조건에 의해 계속해서 분기가 되는데, 이를 디컴파일(F5)하여 보도록 한다.
위 그림3에서 여러 if문이 존재함을 확인했고, 해당 조건들이 모두 참일 때, 아래와 같이 값이 세팅되어진다.
eax값이 1로 세팅되어 위의 함수가 끝이나 리턴되어진다.
그 후 test eax, eax 시 ZF플래그가 설정되어지지 않으므로, jz 분기문에서 왼쪽으로 분기되어진다.
추가적으로, 아래 그림 6에서 byte ptr [rcx+rax] 로 해당 메모리 주소에 있는 값을 가져와 eax에 할당하고, 아래 cmp로직에 따라 eax와 주어진 값을 비교하게 된다.
byte ptr [rcx+rax] 에서 byte ptr [rcx+1] 이면, byte ptr [rcx+ 0] 보다 1바이트 뒤의 값 참조를 의미한다.