발자취

[Reverse Engineering] #07-1. rev-basic-0 풀이 본문

Dreamhack Study/Reverse Engineering

[Reverse Engineering] #07-1. rev-basic-0 풀이

해린 2024. 6. 28. 05:09

본 게시물은 Dreamhack의 Reverse Engineering 로드맵 과정을 학습한 기록이다.

 

#01. 서론

1. 서론

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

위 링크의 워게임을 풀이한다.

 

 

#02. 실행

1. 파일 실행

VMWare 가상 머신 속 Windows10 환경에서 실행해 보도록 하겠다.

Windows PowerShell에서 문제에서 제공된 파일을 실행해보았다.

실행하면 "Input : "이라는 문자열이 출력되고, 이 뒤에 아무 문자열을 입력해 보면 "Wrong"이라는 문자열이 출력된다.

알맞은 문자열을 입력하면 "Correct", 알맞지 않은 문자열을 입력하면 "Wrong"을 출력하는 구조의 프로그램인 것으로 추측할 수 있다.

 

 

#03. 정적분석

1. IDA로 파일 열기

IDA에 처음 파일을 로드하면 위와 같은 창이 나타난다.

위 창을 통해 바이너리의 아키텍처는 AMD64 (x86-64) 이고, PE 파일 구조라는 것을 알 수 있다.

 

위와 같은 창이 뜨면 "No"를 클릭하면 된다.

 

 

2. 문자열 검색

앞선 과정들을 통해 "Input : ", "Wrong" 등의 문자열을 출력하는 것을 알 수 있었다.

"Input : ", "Wrong" 등의 문자열을 사용하는 곳이 입력한 문자열을 검증하는 곳과 가까이 있을 가능성이 높다.

단축키 Shift + F12 또는 View > Open subviews > Strings 과정을 통해 문자열을 검색해 보겠다.

 

문자열 검색 결과를 통해 "Input : ", "Wrong" 뿐만 아니라 처음에 예상한 대로 "Correct"라는 문자열까지 확인할 수 있었다.

 

 

3. 함수 분석

상호 참조 (Cross Reference, xref)를 통해 해당 문자열이 어떤 함수에서 참조되는지 확인할 수 있다.

해당 문자열을 더블클릭한 뒤, 단축키 x 또는 View > Open subviews > Cross References를 통해 문자열이 참조되는 함수를 확인해 보겠다.

 

main 함수에서 "Correct"를 참조하는 것을 확인할 수 있다.

"OK" 클릭 후, 단축키 F5 로 main 함수를 디컴파일 해보도록 하겠다.

 

파일을 실행했을 때, "Input : "이 먼저 출력되고, 그 뒤에 값을 입력했기 때문에 "Input : " 문자열 출력 이후에 입력값에 대한 검증 과정이 있을 것이다.

 

위 코드를 보고 추측해 보자면 sub_140001190 함수는 printf, sub_1400011F0 함수는 scanf 함수일 것으로 예상된다.

알맞게 추측했는지 확인하기 위해 각 함수를 분석해 보도록 하겠다.

 

sub_140001190

main 함수에서 해당 함수의 이름을 더블클릭하면 디컴파일된 함수의 내용을 확인할 수 있다.

 

앞서 6-2 게시물에서 봤던 익숙한 형태의 함수 모습이다. 이전 게시물의 함수 분석 부분의 내용을 가져왔다.

우선, va_start 함수는 가변 인수 리스트를 처리하는 대표적인 함수로, 이를 통해 sub_140001060 함수가 가변 인자를 처리하는 함수임을 알 수 있다.
__acrt_iob_func 함수는 스트림을 가져올 때 사용되는 함수로, 인자로 들어가는 1은 stdout을 의미한다. stdout은 출력을 위한 스트림이다.
→ 문자열 인자를 받고 stdout 스트림을 내부적으로 사용하는 가변 함수이다. 이를 통해 sub_140001060 함수는 printf() 함수일 것으로 추정할 수 있다.

 

 

sub_1400011F0

sub_1400011F0 함수도 마찬가지로 va_start 함수를 통해 가변 인자를 받는다.

그러나 _acrt_iob_func의 인자가 0이므로, stdin 스트림을 가져오고, 이는 printf의 반대되는 함수인 scanf 함수로 추측할 수 있다.

따라서 main 함수에서 sub_1400011F0 함수의 두 번째 인자인 v4에는 사용자로부터 입력받은 문자열이 저장될 것으로 예상된다.

 

이 입력값 v4을 검증하는 함수는 sub_140001000일 것이다!

sub_140001000 함수의 인자로 v4를 넣고 이 함수의 반환값에 따라 문자열 "Wrong", "Correct"를 출력하는 구조인 것이다.

 

해당 함수를 더블 클릭해 보면 위의 내용을 확인할 수 있다.

strcmp 함수를 통해 인자로 받은 a1을 "Compar3_the_str1ng"과 비교하며 둘이 같다면 1을 다르다면 0을 반환한다. 사용자의 입력이 "Compar3_the_str1ng"라면 1을 반환하는 것이다.

따라서 "Correct"라는 문자열을 출력받을 수 있는 올바른 문자열은 "Compar3_the_str1ng"이다!

 

 

4. 문제 해결

PowerShell에서 파일을 실행한 후, 해당 문자열을 넣어보면 "Correct"가 나온다!

 

Flag 입력 부분에 DH{Compar3_the_str1ng} 을 입력하면!

 

정답을 맞혔다는 문구가 뜬다~

 

 


 

간단한 문제 풀이었다

재밌다 ^_^