본문 바로가기
Reversing/드림핵

[Dreamhack] rev-basic-0

by L3m0n S0ju 2021. 3. 24.


 

문제 파일을 x64dbg 디버거로 열어준다. main 함수를 찾기 위해 메뉴에 빨간 네모 안에 있는 Az 메뉴를 클릭한다.

 

 


 

"Input :" 문자열을 클릭하여 main 함수를 찾아준다.

 

 


 

main 함수는 다음과 같다. push rdi로 스택에 복귀 주소를 저장하고 sub rsp,130으로 0x130만큼의 공간을 할당하고 main 함수가 시작된다. 문제의 핵심은 00007FF6321D112C 주소에서 호출하는 chall0.7FF6321D1000 함수이다. 해당 함수가 0을 반환하면 7FF6321D1166으로 점프하여 Wrong을 반환하고 다른 값을 반환하면 Correct를 반환한다. 따라서 해당 함수가 참을 반환해야 한다.

 

 


 

해당 함수로 들어가면 위 그림과 같은 어셈블리어가 출력된다.

 

mov qword ptr ss:[rsp+8],rcx    ->    rcx에 있는 값을 rsp+8에 저장한다. 해당 값은 main 함수에서 scanf로 입력받은 문자열의 주소이다.

 

sub rsp, 38    ->    0x38 만큼의 공간을 할당하고 함수가 시작된다.

 

lea rdx,qword ptr ds:[7FF6321D2220]    ->     7FF6321D2220를 rdx에 저장한다. 해당 주소에는 Compar3_the_str1ng 문자열이 존재한다.

 

mov rcv,qword ptr ss:[rsp+40]    ->    rsp+40에 있는 값을 rcv에 저장한다. rsp+40은 0x38 만큼의 공간을 할당하기 전에는 [rsp+8]이었다. 따라서 rcv에는 main 함수에서 입력받은 문자열이 저장된다.

 

다음으로 strcmp 함수를 사용하여 입력받은 문자열과 Compar3_the_str1ng 문자열을 비교한다. 해당 문자열이 같으면 eax에는 0이 저장된다.

 

test eax, eax    ->    eax가 0이면 ZF 라는 레지스터가 1이 된다.

 

jne chall0.7FF6321D1028    ->    ZF=0이면 점프한다.

 

mov dword ptr ss:[rsp+20],1    ->    rsp+20에 1을 저장한다. 이는 return 1을 의미한다. 따라서 이전 점프 명령어에서 점프를 하지 않아야 지금 명령어로 올 수 있으므로 ZF가 1이면 return 1 을 반환한다.

 

지금까지 코드를 종합하면 main 함수에서 입력받은 문자열이 Compar3_the_str1ng과 같아야 chall0.7FF6321D1000 함수가 return 1을 반환하여 main 함수에서 Correct를 반환한다.

 

 


 

 

cmd 창에서 프로그램을 실행하여 해당 문자열을 입력하면 Correct를 얻을 수 있다. 드림핵 문제 사이트에서 해당 문자열을 DH{} 포맷에 넣어 입력하면 플래그를 획득할 수 있다.

 


플래그: DH{Compar3_the_str1ng}

'Reversing > 드림핵' 카테고리의 다른 글

[Dreamhack] rev-basic-8  (0) 2021.04.12
[Dreamhack] rev-basic-7  (0) 2021.03.30
[Dreamhack] rev-basic-5  (0) 2021.03.30
[Dreamhack] rev-basic-4  (0) 2021.03.30
[Dreamhack] rev-basic-3  (0) 2021.03.30

댓글