Posted by bonggang | 2019. 11. 9. 04:23
* 본 문서는 리버싱 핵심 원리책(일명 나뭇잎 책)과 인터넷 자료들을 바탕으로 학습한 기록입니다.
* 개인의 학습을 위한 자료이기 때문에 정확하지 않은 정보가 포함되어 있을 수 있습니다.
리버스 코드 엔지니어링이란 구조, 기능, 동작 등을 분석하여 그 원리를 이해하며 단점을 보완하고 새로운 아이디어를 추가하는 일련의 작업이다. 리버싱 방법은 크게 두 개, 정적 분석과 동적 분석으로 나눠진다.
- 정적 분석: 파일의 겉모습을 관찰하여 분석하는 방법. 파일의 종류, 크기, 헤더 정보, Import/Export API, 내부 문자열, 실행 압축 여부, 등록 정보, 디버깅 정보 등의 다양한 내용을 확인하는 것이다.
- 동적 분석: 파일을 직접 실행시켜서 행위를 분석하고 디버깅을 통해 흐름과 메모리 상태 등을 살펴보는 방법. 파일, 레지스트리, 네트워크 등을 관찰하며 행위를 분석한다.
패치와 크랙
- 패치: 프로그램의 파일 혹은 실행 중인 프로세스 메모리의 내용을 변경하는 작업, 취약점 수정과 기능 개선을 목적
- 크랙: 패치와 같은 개념이지만 비합법적이고 비도덕적인 경우
기초 프로그램 디버깅
기본 명령어(xdbg)
- Restart: Ctrl+F2
- Step into: F7
- Step Over: F8
- Execute till Return: Ctrl+F9
- Break Point(BP): F2
- Comment(주석): ;
- Goto: Ctrl+G
- Run: F9
- Assemble: Space
문자열 검색 - Main 함수 찾기
[마우스 우클릭 - Search for - All Modules - String references]를 한 뒤 Hello world!를 더블클릭하면 main 함수로 올 수 있다.(main 함수에서 message box를 이용해 hello world!를 출력하기 때문)
다음에 찾기 쉽도록 브레이크 포인트를 걸어두고, Hello wolrd!(오타 무엇,,)가 있는 주소를 확인한 후 dump window에서 Ctrl+G를 눌러 확인해보니 Hello wolrd! 글자가 잘 보이는 것을 확인했다.
API 검색 - Main 함수 찾기
이번에는 API를 이용할 것이기 때문에 [마우스 우클릭 - Search for - All Modules - Intermodular calls]를 클릭한다.
코드에서 메세지박스를 호출하기 때문에 MessageBoxA를 확인할 수 있다.
패치
나는 지금 오타간 난 Hello wolrd!를 수정하고 싶다. 그래서 이번 실습 목표를 Hello World!가 출력되도록 만드는 것이다.
문자열 패치를 위해서는 문자열 버퍼를 직접 수정하는 방법, 다른 메모리 영역에서 새로운 문자열을 생성하여 전달하는 2가지 방법을 생각할 수 있다.
문자열 버퍼를 직접 수정
dump window에서 Goto 명령(Ctrl+G)으로 문자열 주소로 이동한 뒤 (Ctrl+E)로 다이얼로그를 띄워준 후 바꿀 문자열을 입력해준다.
하지만 이 방법은 원래 할당된 버퍼 크기 이상의 문자열을 수정할 시 BOF(버퍼 오버플로우)가 발생할 수 있기에 추천하지 않는 방법이다.
메모리 영역에 새로운 문자열 생성 후 전달
이번에 활용할 영역은 NULL padding 영역이다. 먼저 비어있는 NULL padding 영역에 새로운 문자열을 생성해준다.
이후 MessageBoxA에게 새로운 버퍼 주소를 파라미터로 전달하기 위해 Code Window에서 어셈블리 명령을 수정해야한다. 원래 문자열 버퍼 주소를 push 하는 어셈블리 명령어에서 (space)키를 누르면 Assemble 창이 나타난다.
이 부분을 내가 생성한 문자열의 주소로 바꿔준다.(push 문자열 주소) 이후 실행(F9) 해보면 변경된 문자열이 출력되는 것을 확인할 수 있다.
수정된 exe 파일 추출
성공적으로 수정된 것을 확인했으니 이제 이 파일을 저장해야할 차례다.
[File-Patches]로 들어가면 다음과 같은 창을 확인할 수 있다.
Patch File을 누른 후 내가 원하는 이름으로 다시 저장을 해주면 수정된 exe 파일을 획득할 수 있다.
EP(Entry Point): 실행 시작 주소.
'Security > Reversing' 카테고리의 다른 글
Reversing Study - day 6(PE File) (0) | 2020.03.12 |
---|---|
Reversing Study - day 5(함수 호출 규약) (0) | 2020.03.12 |
Reversing Study - day 4 (0) | 2019.11.28 |
Reversing Study - day 3(스택 프레임) (0) | 2019.11.27 |
Reversing Study - day 2(레지스터) (0) | 2019.11.09 |
코드엔진 Basic RCE L02 (0) | 2019.10.14 |
코드엔진 Basic RCE L01 (1) | 2019.10.14 |
packing과 unpacking (0) | 2019.09.11 |