문제인 01.exe 파일을 debug 파일을 이용해서 실행을 시켜보기로 했다.
이를 봤을 때 "0040101D" 부터 "00401023" 까지의 작업을 실행했을 때 성공하면 밑에 있는 "00401048" 부분에서 "Ok, I really think that your HD is a CD-ROM! :p"를 실행시키는 것 같다. 우린 저 중앙의 의미를 한번 분석해보자.
이 부분을 실행했을 때 esi와 eax 부분이 각각 증과와 감소를 한 것을 확인할 수 있었다.
이를 통하여 레지스터의 앞에 연산과 관련된 기능이 적혀있으므로 레지스터의 값이 실행을 하면서 변경이 되어지고 있는 것을 알 수 있다.
inc와 dec는 각각 더하고 빼는 기능인데 cmp는 무엇일까? cmp는 compare 이라는 단어의 줄임말으로 "비교하다"라는 뜻을 가지고 있다. 이로 인하여 "00401024"부분에서 eax와 esi 가 동일한 값이어야 넘어간다는 사실을 알 수 있었다.
여기서 우리는 2개의 방법을 생각해 볼 수 있다.
첫번째 방법 eax와 esi 값을 조작하여 같은 값으로 만들어버린다.
esi 의 값을 eax와 같은 1로 고쳤다. 한번 실행을 해서 메세지가 뜨는지 확인해보자.
성공했다.
두번째 방법 eax와 esi가 다를 경우 실행을 하도록 만들어버린다.
"je 0x0040103D"에서 j와 e사이에 not이라는 의미인 n을 넣어서 부정문을 만들어줬다. 이번에도 실행을 해서 메세지가 뜨는지 확인해보자.
성공했다.
이제 "GetDriveTypeA"의 리턴값을 찾아보자. 함수가 끝난 부분의 GetDriveTypeA에선
인 값을 찾을 수 있었다.따라서 CMP문에서 EAX가 401003이 되려면 GetDriveTypeA 함수의 리턴값은 401005가 되어야 한다. 앞의 401000은 코드부분의 주소이므로 답은 5이다.
받은 02.exe 파일을 실행해 보면
이러한 화면이 나오게 된다. 문제에서 '실행파일이 손상'되어져 있는 파일이라고 했기 때문에 "HxD"라는 프로그램을 이용해서 분석을 해보기로 하였다.
파일을 프로그램에 넣었을 때 이러한 값들이 존재 한다는 사실을 알게되었다.
아래로 내리다보면 익숙한 단어들이 보이기 시작하는 것을 알 수 있다. "MessageBoxA"라던지 "DialogBoxParamA"과 같은 디버그 프로그램에서 봤던 단어들을 찾았다. 메세지 박스가 있으면 어딘가엔 메세지가 있지 않을까? 조금만 더 내리면서 찾아보자. 이 부분에서 상당히 수상한 단어가 존재한다. "JK3FJZh"라는 단어가 있다. 한번 이것이 맞는지 코드엔진 사이트에서 실험해보자
실행시켜보겠다.
실수로 스크린샷 하는것을 까먹어서 Duplicate 가 떴다. 처음엔 Success가 뜨는것을 볼 수 있을 것이다.
받은 03.exe을 실행해보자
요구하는 저 친구를 다운받아서 실행을 시켜보자.
아이콘이 달라지면서 비밀번호를 칠 수 있도록 기능이 돌아(?)왔다. 그치만 난 비밀번호를 모른다. 아무거나 쳤을 때 어떠한 결과가 나오는지 확인해보자.
에러메세지가 나오는 것을 알 수 있다. 이 에러메세지를 이용해서 디버깅을 한번 시도해보자
문자열을 이용해서 에러메세지를 통해서 패스워드를 비교하는 부분에서 위로 올리다 보면
이 부분을 보게 된다. 여기서 vbaStrCmp라는 함수가 시리얼을 비교하는 함수라고 볼 수 있다. 함수의 이름과 함수를 불러오기 바로전에 스택에 내가 입력한 값과 2G83G35Hs2라는 값을 쌓은 것을 확인할수 있기 때문이다. 즉 12345와 2G83G35Hs2라는 값을 vbaStrCmp라는 함수를 사용하여 비교한것을 알 수 있다. 다시 실행하여 2G83G35Hs2라는 값을 넣어보니 성공구문을 확인할 수 있다.
받은 04.exe을 실행해보자이러한 문구가 계속해서 반복되는 것을 볼 수 있다. 이번에서 한번 디버깅 프로그램을 이용해서 분석해보자
이번에 실행을 시키면 아무것도 나오지 않는 것을 알 수 있다. 이번 문제는 "디버거를 탐지하는 함수"를 찾는 문제이다. 디버깅을 위해 실행을 시키는 순간
"디버깅 당함"이라는 문자를 반복해서 출력하는 것을 볼 수 있다. 저 문자열을 이용해서 탐색을 진행해서 함수의 이름을 알아보자.
찾았다. 이제 이 친구의 함수 이름을 찾아보자.
성공적으로 함수를 찾아내는데 성공했다. "IsDebuggerPresent"라는 이름의 함수이다. 이번 문제는 디버깅을 할 때 이러한 함수를 우회해라라는 것을 알려주기 위한 문제인 것 같다