constWORLDant

[Basic] Tutorial Reversing - Controlled to printf 본문

0x02 Reverse Engineer/0x03. Etc

[Basic] Tutorial Reversing - Controlled to printf

data type ConS_tanT 2017.08.25 03:33

많은 사람들이 C언어를 처음 접했을 때 'hello world' 부터 경험하면서 우와 이거 정말 신기하다. 라고 느꼈을 것이다. 전 정말로 너무 신기했었습니다. 까만 창에 글이 적히는 행위가)

그때를 회상하며, 오늘은 리버스엔지니어링에서 'hello world'를 조작하는 방법에 대해 포스팅을 해볼까합니다. 

카카오톡 오픈채팅에서 어떤 분이 부탁하셔서 작성하게 되었는데, 은근히 글 쓰는게 재밌을 것 같아서 흔쾌히 동의하고 포스팅을 시작해봅니다. 


우선, 프로그램을 만들어야겠죠? 


VS IDE를 이용하도록 하겠습니다.  

IDE(Integrated development environment) 라고 하는데요. 코딩, 디버그, 컴파일, 배포 등 프로그램 개발에 관련된 모든 작업을 하나의 프로그램 안에서 처리하는 환경을 제공하는 소프트웨어이다라고 구글에서 친절하게 적어놨길래 복붙합니다. (히히) 


부가적인 설명을 더 해드리자면, 자바를 예로 들수가 있는데요. 저 같은 경우는 처음 자바를 접할 때 NOTEPAD에 작업을 하고 직접 javac로 컴파일을 하여 바이트코드를 생성했고, java 명령을 이용하여 프로그램을 실행시켰습니다. 하지만, 자바에 익숙해지고 난 후는 '이클립스'라는 프로그램을 이용하여 자바 코드를 작성하였었습니다. 이 이클립스라는 프로그램은 버튼 이벤트 하나만으로 컴파일 -> 빌드 까지 한방에 해결해줍니다. 상기에 기술해둔 말 처럼 코딩, 디버그, 컴파일, 빌드, 배포가 하나의 프로그램안에서 처리된다는 뜻이 되는거죠. IDE를 만들어준 사람들은 정말 대단한 사람들인 것 같죠?


우리가 열심히 노트에 밑바탕과 초안을 통해 멋진 그림이 생기듯이, 프로그래밍도 밑바탕인 헤더파일을 선언과 main함수를 그려주고 그 안에 원하는 그림을 끄적끄적 거린다고 생각하면 되겠습니다. 


하기의 코드는 .c 확장자를 가지는 파일입니다.


#include <stdio.h>


int main(void)

{

printf("Hello World\n");

return 0;


지금은 그냥 아무런 동작도 하지 않는 멍청이입니다. 


하지만, 컴파일이라는 친구를 만나게 되면 어린시절 봤던 만화영화의 캐릭터들이 진화하듯이 저 놈도 진화하게 됩니다. 하지만, 한가지 아쉬운 점은 고급스럽게 진화하는게 아니라 저급스럽게 진화하게 된다는 점입니다.


저기 녹색 표에 적힌 영어들은 영어로 보일지라도 영어가 아닌 컴퓨터에서의 고급언어입니다. 하지만, 이는 사람만 알아볼 수 있고, 컴퓨터 그 자체는 알아보지 못합니다. 우리는 컴퓨터와 친구가 되기위해 컴퓨터에 맞는 친구가 되도록 노력해야합니다. 괜히 유유상종이라는 말이 나온게 아니겠죠? 

컴퓨터는 0과 1(기계어)로만 대화를 할 수 있는 친구입니다. 그럼 우리는 컴퓨터와 대화를 하기 위해 0가 1로 변신을 해야합니다. 그 때 겪는 과정이 컴파일과정입니다.

즉, 컴파일은 고급언어에서 저급언어로 변환 후 마지막으로 기계어코드로까지 변환 될 수 있는 주문과도 같다고 보면 됩니다.


컴파일을 하게 되면 목적코드란 놈이 새로 태어납니다(어멋?) 


암튼 목적코드가 태어나게 되면 링커라는 놈을 또 만나러 갑니다. 프로그램이 하나 완성되기 까지 많은 친구들이 필요하네요. 링커는 함수 라이브러리를 목적코드에 연결 시켜주는 역할을 합니다. 이 과정은 '링킹'이라고 표현합니다. 

이제 모든 것들이 하나로 합쳐졌으니 힘은 어마어마해집니다. 이 과정을 다 거치게 되면 비로소 빌드라는 끝판왕이 됩니다. 


(사실, 리버싱을 접하기 전에 대부분 C언어를 배우기때문에 이 설명은 다소 지루할 수도 있지만,,,, 혹시나 혹시나 C언어 접하지 않고 리버싱에 호기심이 생긴분들이 있을 수도 있을 것 같은 판단에 글을 좀 더 쓰게 되었습니다.)


자 그렇다면 우리는 IDE를 통해 이 과정을 한방에 해결 해보죠. 





제대로 빌드가 되었는데, IDE에서 즉석으로 확인이 가능하다면, 문득 '직접 그 경로에 마우스로 들어가서 클릭해보고 싶다' 이런 생각이 들 수도 있습니다. (나만 그런가?)


우리가 IDE에서 프로그램을 빌드하면 그 프로그램은 어딘가에 분명히 저장이 될 겁니다.  그 경로는 저 같은 경우는 여기군요.

 F:\visual_studio작업본\리버스엔지니어링 강의\[1] Hello World\Debug


여기에 들어가게 되면 해당 프로그램이 있습니다. 

여기에서 그냥 클릭하게 되면 깜박 깜박 하고 그냥 바로 꺼져버립니다. 

개인적인 생각인데, 이것은 Debug모드로 컴파일이 되었기 때문이라고 생각합니다.

본래 Debug모드는 '테스트 혹은 에러를 해결하기 위해 디버깅을 시행하는 목적'으로 사용하기 때문이죠.


만약 Release모드로 컴파일 했다면, 이는 배포용으로 만들어 진 것이기 때문에 window창에 바로 해당 프로세스가 로드가 됩니다. 

그리고 Release모드는 Debug모드보다 용량도 확 줄어듭니다. 

그 이유는 불필요한 것들은 다 제거해버리는 최적화를 하기 때문이에요


Debug든 Release든 그게 무슨 의미가 있담... 지금은 단지 Hello World만 조작할긴데...



이제 우리는 기다리고 기다리던 프로그램 조작을 해볼거에요. 

프로그램 조작을 하기 위해서는 OllyDbg라는 놈을 데리고 와야합니다.

OllyDbg는 디버거 툴이고, 특이하게도 고급언어에서 한단계 내려간 저급언어(어셈블리어)로 번역해서 보여줍니다. 그리고 아까전에 빌드시킨 그 프로그램의 메모리 속 까지 들여다 볼 수 있고요. 또 한가지 스택이란 놈과 값들을 잠시 저장해두는 레지스터라는 놈까지 볼 수 있습니다. 어마어마한 기능을 가진 놈이네요.


자 그럼 OllyDbg를 한번 켜 보겠습니다.


OllyDbg설치 같은 경우  http://www.ollydbg.de/ 여기에서 설치하시면 됩니다.



실행을 시키면 이러한 화면이 나옵니다. (저 같은 경우는 아는 형이 이쁜 인터페이스를 만들어 줘서 이렇지만 저 경로에서 다운받으신 분이라면 허연 화면이 나올거에요) 


대부분의 윈도우 환경에서의 프로그램은 저런 폴더 모양이 다 있죠. 아이콘의 통일성 정말 마음에 드는 구석중의 하나입니다. 


저 폴더를 눌러서 word 파일 열듯이 상기에서 알려준 경로로 가셔서 열면 됩니다.


클릭 ! 하면 이제 한번도 보지못한 신세계가 펼쳐집니다.



여기에 대한 설명은 다음에 날 잡고 한방에 할까합니다. 


오늘의 목적은 맛보기 이기 때문에~ 


C언어에서 봤던 MAIN함수 접근 법도 별도로 한 챕터로 설명할 예정입니다.


자 그렇다면, 이제 원하시던 '조작'을 하러 가보겠습니다.


OllyDbg에는 좋은 기능이 있습니다. 아래의 사진을 함께 보시죠.




ASCII "Hello World" 라는게 보입니다. 


더블클릭하면 다음과 같은 사진이 보입니다.



자 이제, C언어에서 배운 내용을 생각해봅시다. 

프로그램이 실행될 때 모든 값은 메모리에 저장이 되게 됩니다.

그럼 메모리는 위치를 알려주는 '주소'가 존재하게 되겠죠.


printf라는 함수도 모든 값에 포함이 되기 때문에 반드시 주소가 있겠죠? 

주소를 알아보기 위해 push 위치에 더블클릭을 합니다. 주소를 복사한 후 그 후 ctrl+g 단축키를 이용해서 붙여넣기를 할텐데 이때 유의사항은 메모리덤프 위치에 마우스 커서를 가져다 놓아야 합니다. 




저기 보이는 아스키코드와 Hex Dump는 똑같은 값입니다. 우리는 Hex Dump에 블록 지정을 할겁니다. 따라해주세요.



이제 이 부분을 조작하는 일만 남았는데 ctrl+e 라는 단축키를 이용할 거에요.


Edit Data라는 뜻입니다. 




이제 변환 한 값을 저장하기 위해 작업을 두번 거쳐야 해요. 

그림이 흐리네요. Copy to executable File , Save File





저장을 했으니 이제 실행을 해보죠.



이상으로 세상에서 가장 쉬운 리버싱 튜토리얼을 마치겠습니다.


알려줬으면 좋겠다는 내용이 있다면 댓글 달아주세요. 

최대한 이해하기 쉽게 설명해보겠습니다. ^0^ 

좋은하루되세요~ 

'0x02 Reverse Engineer > 0x03. Etc' 카테고리의 다른 글

[RENA] 1번 Do you know CreateFile?  (0) 2017.10.23
[파일 자동 삭제]  (0) 2017.09.19
[Basic] Tutorial Reversing - Controlled to printf  (0) 2017.08.25
인증 값 비교 문제 [gdb 적응용]  (0) 2017.07.07
[피카츄 시연]  (0) 2017.07.03
피카츄 리버싱 5부...  (0) 2017.06.05
0 Comments
댓글쓰기 폼