본문 바로가기

리버싱

[리버싱] Exercise: rev-basic-0

드림핵 워게임 중 하나인 rev-basic-0문제에 대한 

풀이를 진행해 보도록 하겠습니다.

 

우선 파일을 다운 받고 windows PowerShell로 실행을 해보았습니다.

AAA라는 문자열을 넣었을때 Wrong이 출력됩니다.

사용자에게 문자열을 입력받고 

프로그램 내부의 어떤 검증과정을 거쳐

입력한 문자열이 검증을 통과했다면 Correct, 통과하지 못했다면 Wrong을 출력하는 

방식으로 동작한다는 것을 알 수 있습니다.

 

 

그다음 IDA로 파일을 열어줍니다.

 

파일 실행과정을 통해 입력한 문자열을 검증한 후

 Wrong이나 Correct문자열을 출력하는 것을 알 수 있었습니다.

따라서 검증하는 위치를 찾기 위해서 파일이 실행될 때 출력되던 문자열을 먼저 검색해 보겠습니다. 

 

Shirt+F12 를 이용하여 String을 확인해 보았을 때

Input : , Correct, Wrong과 같이 실행시켰던 프로그램에서 출력되었던

문자열들을 찾을 수 있었습니다.

 

 

이제 단축키 X를 이용하여 Correct 문자열이 어디에서 참조되는지

알아보도록 하겠습니다.

확인해 보았을 때 main에서 해당 문자열을 참조하는 것을 알 수 있습니다.

 

이제 F5단축키를 이용하여 문자열을 사용하는 곳을 디컴파일 해보겠습니다.

디컴파일한 결과를 보면

sub_140001190과 sub_1400011F0함수를 찾아 볼 수 있습니다.

 

va_start 함수와 _acrt_iob_func(1); 함수가 사용되는 것으로 보아

printf 함수임을 알 수 있습니다.

즉, printf 함수를 사용해 Input : 문자열을 출력하는 것입니다.

 

sub_1400011F0함수도 va_start 함수를 통해 가변 인자를 받습니다.

하지만 __acrt_iob_func함수의 인자가 0으로, stdin 스트림을 가져오게 되고

따라서 이는 printf의 반대되는 함수인 scanf 함수로 추측할 수 있습니다.

따라서 sub_1400011F0 함수를 통해

2번째 인자인 v4에는 사용자로부터 입력된 문자열이 저장될 것 입니다.

sub_140001000함수는 우리가 찾고있는 입력값을 검증하는 함수입니다.

함수는 strcmp로 특정 문자열과 비교합니다.

특정문자열은 Compar3_the_str1ng입니다. 

따라서 이 문제의 답은

Compar3_the_str1ng 입니다.