본문 바로가기

Reversing/DreamHack

[DreamHack_wargame] rev_basic_2번

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

 

 

 

1. 메인 함수

메인 함수의 결과가 correct로 가기 위해서는 eax값이 0이 아니어야 하므로, eax를 비교하는

<chall2.sub_7FF65C2F1000>가 비교함수가 된다. 따라서 해당 함수로 들어간 결과는 아래와 같다.

 

 

2. 비교 함수

맨 위부터 아래로 각각 1,2번 블록 / 좌측 3번 블록 / 우측 4번 블록 

비교 함수는 위와 같다.

을 보면, [rsp]0이 저장되는 것을 알 수 있다. 그리고 번 코드으로 점프하면,

rsp0이었으므로, rax 값도 0이 된다.

jae는 비교 값이 크거나 같으면 점프하는데, rax의 값은 현재 0이고,

12보다 작으므로 점프하지 않고 번 코드로 진행한다.

 

번 블록을 보면, raxrsp 메모리에 들어있는 값을 저장하고, rcx에는 0x7FF635E23000을 저장한다.

그리고 rdx(rdx=0)rsp에 저장된 값을 저장하고, r8[rsp+20]에 저장된 값을 저장한다.

그 후, [rdx+r8]에 저장된 값을 edx에 저장하는데, 이때 movzx를 통해 입력된 첫번째 문자를 edx에 저장하고, 저장된 문자와 하나씩 비교한다는 것을 알 수 있다.

또한 cmp dword ptr ds:[rcx+rax*4],edx를 통해 4바이트씩 띄고 문자가 저장되어 있다는 것을 알 수 있다.

 

 

7FF635E23000에 해당하는 주소로 덤프해서 따라가면, 아래 사진의 좌측 하단과 같이 4바이트씩 문자가 떨어져서 저장되어 있는 것을 확인할 수 있다.

따라서 정답은 해당 문자들을 합친 "Comp4re_the_arr4y" 이다.

 

 

 

정답 : "Comp4re_the_arr4y"

'Reversing > DreamHack' 카테고리의 다른 글

[DreamHack_wargame] rev_basic_5번  (0) 2021.05.15
[DreamHack_wargame] rev_basic_4번  (0) 2021.04.13
[DreamHack_wargame] rev_basic_3번  (0) 2021.04.13
[DreamHack_wargame] rev_basic_1번  (0) 2021.04.12
[DreamHack_wargame] rev_basic_0번  (0) 2021.04.12