저번 포스팅에서는 리버싱이 무엇인지와 분석 방법 및 분석 도구들을 알아보았습니다.

그래서 이번에는 직접 프로그램을 분석해보는 시간을 가져보도록 하겠습니다.

(이번 포스팅에 사용된 리버싱도구(디버거)는 x64dbg 입니다.) 참고하시면 될 거 같습니다.

 

일단 그럼 먼저 분석을하기 위해서는 hello world 프로그램이 있어야 분석을 할 수 있겠죠?

#include <windows.h>
#include <tchar.h> 

int main(int argc, TCHAR *argv[])
{
	MessageBox(NULL, L"Hello world",L"Reverse start", MB_OK);
}

 

위와 같이 hello world를 출력하는 프로그램을 한번 작성을 해보았습니다.(win32API를 사용했습니다.)

그럼 빌드를하고 실행을 하면 아래와 같이 나오게 됩니다. 

 

빌드의 과정은 아래의 글을 참고하시면 좋을 것 같습니다. (설명이 많기에..)

https://st-lab.tistory.com/176

 

프로그래밍 언어와 빌드 과정 [Build Process]

안녕하세요. 제가 이 시리즈를 작성할 때 처음 계획했던 것이 있습니다. 최소한의 프로그래밍언어에 대한 작성 방법은 알고 있다는 전제하에 프로그래밍 전반에 관한 내용을 다뤄본다고 했죠.

st-lab.tistory.com

 

자,  빌드의 과정을 알았다면, 이전해도 이야기 했듯이 리버싱은 빌드의 과정을 반대로 하는 것 입니다. 

코드를 작성하였으니 실행을 해봅시다.

 

이렇게 제목은 Reverse start 고  Hello world라는 메세지가 메세지 박스에서 출력되는 프로그램을 제작하였습니다.

이 프로그램을 한번 분석해보겠습니다.

 

x64dbg 를 실행하고 파일을 열어주면 이러한 화면이 나오게 되는데, 아직은 초보단계이니,

자세한건 나중에 설명드리도록 하겠습니다. (우리가 알아야 할것은 메인함수를 찾는 것 입니다.)

메인함수에 코드를 작성했으니 메인함수를 찾으면 프로그램의 동작원리를 알 수 있을것 입니다.

 

1. 어셈블리 (기계어) 코드가 나와있고 직접 코드를 따라가보면서 디버깅을 할 수 있는 창입니다

2. 디버깅을 하면서 현재 레지스터에 무슨 값이 들어가있는지 볼 수 있는 레지스터를 표시해주는 창입니다.

3. Hex 값을 볼 수 있는 Hex dump 창 입니다.

4. 현재 스택이 어떻게 쌓이는지 볼 수 있는 스택 창 입니다.

 

지금부터 분석을 해 볼 것인데.. 제일 처음알아야 하는것은 EP - Entry Point가 될 것입니다 .

쉽게 말해서 처음시작하는 메모리의 주소라고 보시면 됩니다.

 

그렇다면 00007FFB0F572B785가 Entrypoint가 되겠네요 분석을 한번 시작해 봅시다. 

혹시나 만약에 궁금증이 생길 수도 있으니 (아님 말고) 한번 설명을 해드리도록 하겠습니다.

작성한 코드는 몇개 없지만  왜 이렇게 많은 어셈블리어 코드들이 있는것인가 라고 생각하신다면 그것은

프로그램의 빌드과정에서 일어난 일이라고 생각하시면 됩니다. 

 

그럼 한번 분석을 해봅시다.

F8을 누르게되면 함수를 한줄 한줄 실행 할 수 있습니다. 

일단 프로그램의 의도대로 메세지 박스가 나올때 까지 실행을 해보겠습니다.

r

계속 실행을 하던 중 작성했던 코드대로 메세지 박스를 띄어주는 부분을 찾았습니다.

call hello_world ( 00007FF6AFB71D09)부분에서 F8을 눌러 실행했더니 메세지 박스가 나왔습니다.

그럼 해당 주소가 아직은 잘 모르겠지만 메인함수와 관련이 있다는 것을 짐작 해볼 수 있을것입니다.

그래서 F2를 눌러 가까운 지점에 브레이크 포인트(중단점)을 설정해뒀습니다. (00007FF6AFB71D00)

브레이크 포인트를 설정하게 되면 나중에 한번에 이동 할 수 도 있고 내가 원하는 지점에서 일시정지를 할 수 있습니다.

확인을 누르면 프로그램이 종료가 되니 확인을 누른 뒤에 다시한번 실행해보겠습니다.

 

다시 실행한 뒤에 빨간색으로 표시된 부분을 클릭하면 설정해둔 브레이크 포인트로 바로 이동이 가능합니다.

아니면 아래에있는 빨간점으로 표시된 부분을 클릭하면 현재 설정해둔 모든 브레이크 포인트 지점을 볼 수 있습니다.

보고 클릭하여 이동하시면 됩니다. 그렇게 이동을 하고 나서 보면 call hello_world라는 부분에서 실행을 하면 메세지박스가

실행이되서 화면에 나왔었는데, 세부적인 부분을 확인하기 위해서 call 하는 부분에 F7을 눌러서 함수의 내부로 들어가 

보도록 하겠습니다. 

 

들어왔는데 계속 한번 실행해 보겠습니다.

 

내부에서 계속 실행해보니 메세지 박스를 띄어주는 부분을 찾았습니다. 

그럼 이 부분도 내부적으로 한번 들어가 보도록 하겠습니다. 

 

한번더 내부로 들어왔는데 계속 실행해 보겠습니다.

 

다시한번 메세지 박스를 띄우는 곳을 찾았고, 브레이크 포인트를 걸어뒀는데, 계속해서 살펴보겠습니다.

 

실행을 계속 하던 중 전에 작성했던 코드와 비슷한 부분을 발견했습니다. 아마도 여기가 메인함수 인 것 같습니다. 

문자열을 보면 코드에서 작성했던 부분이랑 일치 하는 것을 볼 수 있습니다.  마지막에 call이라는 부분을 살펴보면

메세지 박스를 호출하는 부분이 있습니다. 그렇다는 것은 지금 보이는 문자열대로 메세지 박스를 띄어준다는 의미가

됩니다. 이렇게 프로그램의 흐름을 한번 따라가 보았습니다.

 

자, 여기서 한번 시도해볼 것이 있는데  코드를 보면 call 부분에 메세지 박스를 띄어주는 함수가 있습니다.

하지만 이부분을 제거해준다면? -> 더이상 메세지 박스가 화면에 나오지 않을것입니다. 

그리고 위에 문자열을 받아오는 부분에서 문자열을 바꿔준다면??  -> 메세지 박스의 문자가 바뀔것 입니다. 

 

한번 해보겠습니다. 

메세지 박스의 제목인 Reverse Start 와 같은 문구로 메세지를 변경 해보도록 하겠습니다.

 

Reverse start 문자열을 받아오는 곳의 주소를 복사한 다음, Hello world 부분에 덮어씌워서 변경을 해보았습니다.

커서를 올린다음, 스페이스바를 누르면 위의 사진처럼 수정이 가능합니다. (주소 부분의 복사를 진행하였습니다.)

 

표시된 부분을 보면 Helloworld 부분에 복사한 주소값을 넣어주니까 문자열이 변경된 것을 볼 수 있습니다.

 

실행을 하면 Helloword 부분이 완전히 Reverse start로 변경이 되었고, 문자열이 메세지박스로 출력이 되었습니다.

이런식으로 프로그램을 분석하는데 그치지 않고 메모리의 주소 값을 이용해서 원하는 값으로 변조를 해보았습니다.

 

이것으로 이번에는 Helloworld를 한번 분석해보고 변조를 해보면서 리버싱의 기본적인 원리를 한번 알아보았습니다.

포너블이라는 카테고리에도  GDB를 이용해서 분석하는 글이 포스팅 되어있는데 궁금하거나 자세한 사항을 알고 싶은 

분들은 한번 참고해봐도 좋을 것 같습니다.

https://nuker3.tistory.com/76

 

찬희의 Pwn 포너블 기초 2주차 1차시 GDB를 사용해보자 1

일단 시작하기 앞서서 GCC와 GDB 설치가 필요하겠죠? apt install GDB apt install GCC 해당 코드를 작성을 해두었습니다 #include void a(char * name, int age){ printf("%s %d\n",name,age); } int main(void){ char name[10] = "shj"; in

nuker3.tistory.com

 

+ Recent posts