외로운 Nova의 작업실

리버싱 입문 - 6(rena 15강) 본문

Computer App Penetesting/Reversing

리버싱 입문 - 6(rena 15강)

Nova_ 2022. 12. 16. 16:22

rena의 강의는 리버싱 관련해서 유명한 강의 입니다. 이에따른 자료들은 아래 링크에 들어가시면 다운 받으실 수 있습니다.

https://forum.tuts4you.com/files/file/1307-lenas-reversing-for-newbies/

 

Lenas Reversing for Newbies

A collection of tutorials aimed particularly for newbie reverse engineers. 01. Olly + assembler + patching a basic reverseme 02. Keyfiling the reverseme + assembler 03. Basic nag removal + header problems 04. Basic + aesthetic patching 05. Comparing on cha

forum.tuts4you.com

리버싱 입문 책에서는 crackme 시리즈를 다하지않았기 때문에, 책을 끝내고 crackme 시리즈를 따로 이어나갈 예정입니다. 또한 rena의 강의도 몇개의 예제만 다루기때문에 책을따라서 간다음 rena 시리즈도 따로 이어가보도록 하겠습니다. 일단 먼저 책에서 나온대로 15강을 다룰 예정입니다.  아래는 15강 exe 파일입니다.

ReverseMe. NAGs.exe
0.29MB

 

 

- 문제 인식

해당 문제는 nag를 없애는 문제라고합니다. 일단 먼저 실행시켜보도록 하겠습니다.

첫번째 화면이 뜨고 몇초있다가 다른 화면이 뜹니다.

이화면에서 exit 버튼을 눌러보겠습니다.

위 화면을 마지막으로 프로그램은 종료됩니다. 두번째 화면에 보게되면 "your task is to remove both nags in the code!!"라는 부분이 있고 첫번째 화면과 세번째 화면에 remove me 라는 글자가 있기때문에 첫번째 화면과 세번째 화면을 없애고 두번째 화면만 표시하도록 프로그램을 크랙해야하는 문제인 것으로 확인됩니다. 아무래도 이번문제를 통해서 광고나 이런것들을 없앨 수 가 있겠죠?

 

- 리버싱

이제 실제로 리버싱을 해보도록하겠습니다. 

해당 프로그램은 함수가 너무많고 프로시저도 많기때문에 하나하나 분석하는 것은 힘듭니다. 이러한 상황에서 분석할 수 있는 방법이 강제 멈춤(F12)를 이용해 멈춘다음 call stack을 보고 실행된 함수에대해서만 분석해보는 기법을 사용해보겠습니다. 일단 먼저 첫번째  nag가 뜬후에 코드영역을 누르고 F12를 눌러 강제 멈춤을 해보겠습니다.

이후 call stack을 따로 보려면 상단에 K 버튼을 누르거나 cntl+k를 누르면됩니다.

보통 화면을 출력하는 함수를 부르는 것은파일 자체인 reverseme.NAGs입니다. 하지만 called from 항목을 보게되면 reverseme.NAGs가 없는 것을 확인할 수 있습니다. ollydbg가 모든 callstack을 보여주는 것은 아니라고 합니다. 그렇다면 call stack을 따로 보는 것이 아니라 진짜 stack 부분을 확인하면서 return 값을 확인해보면 됩니다.

위 스택의 현재 부분부터 밑으로 천천히 내려가면서 reverseme.NAGs로 돌아가는 return value가 있는지 확인해보겠습니다.

위 사진처럼 딱 한개 발견할 수 있습니다. 저 주소로 가서 바로 위 call 주소에 f2를 눌러 bp를 건다음 한번 f8을 누르면서 어떤 함수인지 확인해보겠습니다.

bp를 걸었으니 이제 다시 시작하면서 bp에서 멈추면 f8로 어떻게 되는지 확인해보겠습니다.

바로 팝업창이 뜨는 것으로 확인되며 0042039A 주소의 call 함수는 팝업창을 띄우는 procedure 인것으로 확인할 수 있습니다. 이 함수가 실행되기전 위 함수를 한번 살펴보겠습니다.

TEST EAX, EAX로 값을 비교한다음 EAX가 0이라면 004203BA로 점프하는 것을 볼 수 있습니다. 아니라면 그냥 지나가는데 nags를 출력하려면 그냥 지나가야합니다. 그렇다면 004203BA로 가면 nags를 출력하지않을까요? 한번 JZ 명령어에 pb를 걸고 z플래그를 1로 설정해서 점프문으로 분기해보겠습니다.

이후 f9를 눌러 실행시켜보면 nags 창을 띄우는 것을 넘어갈 수가 있는 것으로 확인됩니다. 그러면 첫번째와 세번째 nags 화면은 004203BA로 점프시켜서 출력하지않고 두번째 화면만 점프시키지 않고 출력하게하는 코드를 집어넣어야할 것 같습니다. 하지만 이 코드는 적어도 4~5줄이 될것이기때문에 미리 만들어져있는 코드사이에 넣기 어렵습니다. 이때 사용하는 기법은 코드 케이브라는 기법으로 코드사이에 JMP문으로 사용하지않는 코드 부분으로 분기시키고 사용하지 않는 코드에 우리가 원하는 코드를 넣어서 실행시키는 기법입니다. crack을 하면서 자세히 해보겠습니다.

 

- CRACK

일단 코드 케이브를 하기전에 우리가 사용할 코드 주소부분과 데이터를 저장할 부분을 정해야합니다. 메모리 맵을 보게되면

00401000~438000 까지는 코드부분이고, 00442000~00447000까지는 data 부분으로 우리가 사용할 수 있습니다. 코드부분에 아무것도 없는 부분을 확인해보겠습니다.

00437D8A 주소부분부터는 아무것도 없는 코드부분으로 우리가 사용할 수 있습니다. 저는 00437D8A부분에 원하는 코드를 삽입시키겠습니다. 이제 메모리부분을 확인해보겠습니다.

00445E90 주소부터는 아무것도 없는 부분으로 우리가 사용할 수 있습니다. 저는 00445E90에 첫번째 화면인지 두번째화면인지를 담는 변수를 저장하겠습니다. 이제 실제로 코드를 작성해보겠습니다. 먼저 원하는 코드 위치에 JMP문을 삽입해줍시다.

이렇게되면 코드 크기때문에 분기문 이후 코드인 LEA ECX, [ESP+4C]가 삭제되는데 이는 코드 케이브부분에서 추가해줘야합니다. 이제 코드 케이브문을 작성해보겠습니다. 아래 코드를 한줄씩 어셈블해주면 됩니다.

ADD BYTE PTR DS:[445E90], 1
CMP BYTE pTR DS:[445E90], 2
JNE 004203BA
LEA ECX, [ESP+4C]
JMP 0042037F

이후 저장한 후에 실행시켜보도록 하겠습니다.

바로 두번째 화면만 띄워지는 것을 확인할 수 있습니다.

Comments