문제 링크
https://dreamhack.io/wargame/challenges/14
rev-basic-0
Reversing Basic Challenge #0 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출
dreamhack.io
풀이
해당 문제의 exe 파일을 실행 시키면, 사용자 입력 값을 받는 "Input :" 창이 생성되며, 랜덤한 값을 입력하면 곧바로 종료가 됨을 확인했다. (Powershell 실행 시, wrong이 출력되어짐)
해당 exe 파일을 ida로 열었을 때, 위와 같이 View 기능을 통해 어떻게 분기가 이뤄지는지 확인할 수 있다.
동적 분석을 해보니, 사용자 값을 입력 받고, sub_7FF7ED761000 함수에서 처리한 후, jz 일 때, Wrong으로 분기됨을 알 수 있었다.
해당 함수(sub_7FF7ED761000)로 들어가보니, 위 그림 4와 같았고, strcmp로 사용자 입력 값 Str1과 Str2를 비교함을 확인할 수 있었다
Str1이 사용자 입력 값인지는 아래 과정에서 확인이 가능하다.
레지스터 RCX 에 스택 관련 주소 값(0x000000407E0FF8F0)이 담겨져 있음을 위 그림 5에서 확인할 수 있다.
실제 동적 디버깅 과정에서 입력 했던 사용자 입력 값을 위 그림 6에서 확인할 수 있다.
Str2 변수에 Compar3_the_str1ng 가 담겨있는 것은 이전 과정과 위 그림 7에서 확인이 가능하다.
위 그림 8은 sub_7FF7ED761000 함수 안으로 F7했을 때, 볼 수 있는 흐름인데, test eax, eax를 통해 레지스터 값이 0인지 확인한다. 0이면 test eax, eax 에 의해 ZF가 1로 세팅이된다. 만약 사용자 입력 값 Str1을 Str2에 맞는 값을 입력했다면, 위 strcmp에 의해 0의 결과가 나온다.
이때, 0의 결과가 RAX 레지스터에 저장되므로 jnz 분기문에 의해 왼쪽으로 분기된다. dword ptr [rsp+0x20] 주소에 1 값이 세팅되고, 아래 loc_7FF7ED761030 과정이 진행되어 진다.
loc_7FF7ED761030 에서는 eax 값에 [rsp+32]([rsp+0x20]) 1이 세팅되어진 채, 해당 sub_7FF7ED761000 함수가 끝이 나게된다.
그럼 해당 함수 밖을 나왔을 때, eax 레지스터가 0이 아닐 것이므로, 위 그림 9에서 왼쪽으로 분기되게 된다. 그래서 correct가 나오게 된다.