워게임/Root Me

[Root Me] PE x86 - 0 protection - 리버싱 / Ollydbg

SecurityMan 2022. 6. 22. 11:00


Root Me 에서 제공하는 세번째 리버싱 문제

이번 문제는 greHack CTF 2012 해킹대회에서 실제 출제되었던 문제라고 한다.

앞에서 풀었던 두 문제는 ELF 파일이었는데, 이번에는 PE 파일이 주어진다.

PE 파일은 Portable Executable의 약자로 그냥 우리가 흔히 보는 윈도우에서 실행 가능한 EXE 파일이다.

반응형


문제의 목적은 주어지는 프로그램의 password를 알아내는 것이다.


이것이 문제에서 주어지는 ch15.exe 파일이다.


해당 프로그램은 윈도우의 cmd 창을 이용해서 실행시킬 수 있다.

프로그램이 저장된 경로에서 ch15.exe 라고 입력해봤더니

Usage : ch15.exe pass 라면서 사용법을 알려준다.

pass 자리에 비밀번호를 넣으면 되는것이다.

알려준 사용법대로 ch15.exe hello 라고 입력해봤더니

당연하겠지만 틀렸기때문에 Wrong password 라는 문자가 출력된다.

사실 이문제는 IDA 라는 아주 유용한 디스어셈블러를 이용하면 1분컷 할 수 있다.
(5점짜리 생기초 문제이기 때문)

하지만 쉬운 문제이고, 앞선 두 문제를 IDA를 이용해서 풀었으니

살짝 하드모드로 Ollydbg 라는 디버거를 이용해 문제를 풀어보려고 한다.
(사실 그렇게 어렵지도 않다.)


이것이 Ollydbg 라는 프로그램이다.

리버스 엔지니어링 할때, 바이너리를 분석할때 많이 사용하는 프로그램이다.


처음 실행하면 이런 화면이 나온다.

4개 화면으로 나누어져 있는데

왼쪽 상단부터 시계방향으로

바이트 코드, 레지스터, 스택, 메모리 정보를 확인할 수 있다.


Ollydbg에 문제파일은 ch15.exe 파일을 드래그 앤 드롭 했을때 모습이다.

이 상태에서 스택, 레지스터, 메모리 값을 보면서 실행파일을 분석하는 것이다.

분석을 시작할때, 이미 알고있는 정보부터 접근을 시작하면 아주 수월하다.

지금 알고있는 정보는 아까 프로그램을 직접 실행시켜 보면서,

입력값이 없으면 Usage가 출력되고, 비밀번호가 틀리면 Wrong password 가 출력된다는 것이다.


Ollydbg 화면에서 마우스 우클릭을 한 뒤,

Search for - All referenced text strings 버튼을 눌러준다.


그럼 이렇게 PE 파일 내에서 식별 가능한 string을 찾아서 보여준다.

아까 봤던 Usage와 Wrong password가 보이고, 중간에 Gratz man :) 이라는 문자열도 보이는데

아마도 이런 비밀번호를 맞췄을때 출력하는 문장인것 같다.

이 문자열들의 주소(address)를 잘 기억해 둔다.(형광펜)

  • 입력이 없을때 : 401706
  • 비밀번호가 맞았을 때 : 401791
  • 비밀번호가 틀렸을 때 : 4017AA


아까 봤던 Wrong password를 더블클릭하면 이런 화면으로 넘어간다.

아래쪽을 보면 Jumps from 00401737, 00401741 ~ 이런 내용이 보이는데

이것은 뒤에 나열되어있는 주소부분에서 Wrong password로 프로그램 흐름이 흘러간다(점프)는 것이다.


스크롤을 살짝만 위로 올려보면 해당 주소를 확인할 수 있다.

예를들어 맨 처음 00401737 주소의 경우

JNZ SHORT ch15.004017AA 라고 적혀있는데

JNZ는 Jump Not Zero 의 약자로

비교값이 0이 아닌 경우 004017AA로 Jump 하라는 의미이다.

형광펜친 부분의 주소들이 모두 뭔가를 비교한 뒤에 비교결과에 따라서

프로그램 흐름을 004017AA(Wrong password)로 이동시키고 있는 모습이다.


무엇을 비교하는지는 바로 위를 보면 알 수 있다.

CMP는 Compare의 약자로 두 값을 비교하는 것이다.

여기서 비교 대상은 뒤쪽에 적혀있다.

첫번째 CMP는 [ARG.2]의 값이 7과 같은지 비교하고,

두번째 CMP는 AL의 값이 50과 같은지 비교하고 ... 이런 방식이다.

만약 비교했을때 두 값이 다르다면?

004017AA 주소로 Jump 시켜 Wrong password를 출력시키는 것이다.


뒷부분도 이어서 몇번 더 CMP로 비교를 한 뒤에,

모든 조건이 다 맞으면 Gratz man :) 을 출력하게 된다.

비교하는 값들을 모두 모아보면,

7, 53, 50, 61, 43, 49, 6F, 53 인데 이건 16진수로 표현한 것이고

이걸 ASCII 값으로 바꿔주면 된다.


CyberChef(https://gchq.github.io/CyberChef)에서 From Hex를 이용해 바꿀 수 있고,

해당 16진수를 ASCII 코드로 바꿔주면 SPaCIoS 라는 단어가 나온다.
(맨 앞에있던 7은 글자수 인것같다.)


다시한번 프로그램을 실행시키고

ch15.exe SPaCIoS 라고 입력해주면

Gratz man :) 이라고 출력되는것을 볼 수 있다.


사실 이렇게 고생할 필요없이

IDA 프로그램으로 열어보면 바로 확인할 수 있다.

반응형