C 문법과 디스어셈블링
월간 마이크로소프트웨어 2008년 4월호
[실전강의실 | Reverse Engineering의 정석]
C 문법과 디스어셈블링
------------------------------------------------------
강병탁 window31@empal.com, www.window31.com | 바이너리 취약점 분석 업무를 하고 있다. 안티 크래킹/안티 디버깅 엔진 개발을 다년간 해왔으며 시스템 프로그래밍과 리버스 엔지니어링에 관심이 많다. 악성 코드나 해킹툴이 내부에 담고 있는 천재적인 알고리즘에 감탄하며 오늘도 IDA를 돌린다.
------------------------------------------------------
C 소스가 컴파일되어 바이너리로 변경된 이후 갖춰진 어셈 코드는 어떻게 해석해야 할까? C 코드에서의 반복문은 어셈 구문으로 어떻게 변환되는 것일까? 이런 어셈 코드는 C 로 보았을 때 과연 어떤 루틴에 해당하는 부분일까? 수학의 기본을 키우기 위해 정석 책을 섭렵하듯이, 어셈블리어로 역분석된 코드를 파악하기 위해 필수적으로 갖추고 있어야 리버스 엔지니어링의 정석에 대해 연구해 보자.
------------------------------------------------------
연재 순서
1회 | 2008. 4 | C 문법과 디스어셈블링
2회 | 2008. 5 | C++ 클래스와 디스어셈블링
3회 | 2008. 6 | DLL, MFC 실전 모듈 리버싱
4회 | 2008. 7 | 4GL 고급 언어 역분석
5회 | 2008. 8 | 안티 디버깅과 리버스 엔지니어링
------------------------------------------------------
연재 가이드
운영체제| 윈도우2000/XP
사용도구| Visual Studio, IDA, OllyDBG
기초지식| C, ASM, Win32 API
응용분야| 리버스 엔지니어링/시스템 프로그래밍/해킹/보안
리버스 엔지니어링은 패턴이 있다.
대부분의 사람들은 어셈블리어보다 C 소스에 강한 법이다. 문법 사용이 제한적이며, 언제나 하나의 명령어로 수많은 문장을 조합해서 코딩해야 하는 어셈블리어는 확실히 보통 사람들에게 친숙해지기 어려운 면이 있다. 하지만 이렇게 어려운 어셈블리 판독 능력이 리버스 엔지니어링을 위해서는 필수적인 부분이다. 특히 C 문법을 먼저 공부한 사람들에게는 C 코딩의 스타일대로만 생각하도록 굳어져 있기 때문에 어셈 방식으로 생각하는 작업이 쉽지가 않은 편이다. 하지만 어셈블리어는 생각 외로 간단한 언어이며 접근하는 방식에 따라 오히려 쉽게 더 읽어내려갈 수도 있다. 예를 들어 C 코드에서 자주 사용되는 코드가 항상 비슷하듯이 어셈블리어 역시 코드들의 일정한 패턴이 있다. 따라서 그런 유형과 패턴을 잘 알아놓는다면 어셈 코드를 역분석하는 리버스 엔지니어링 작업도 아주 어려운 작업만은 아니다. 따라서 C 문법 뿐만 아니라 어떤 언어에서든 가장 기본으로 등장하는 조건문, 반복문 등에 대해서 어셈블리어로 어떻게 표현되는지 파악하고, 더불어 함수 규약, 구조체 등에 대해서도 그 구조를 알아둔다면 코드 역분석은 훨씬 용이해지리라 생각된다.
필수 숙지 사항
이 글은 리버스 엔지니어링의 기본에 대해 이야기 하는 내용이 되겠지만, C 문법과 어셈블리어에 대해 기본적으로 파악하고 있다는 가정하에 출발한다. 두가지 언어에 대한 기본 문법을 설명하는 것은 지면상 부족하기도 하고, 이 글의 범위도 벗어난다. 그러므로 별도의 어셈블리 문법에 대한 설명은 생략할 것이다. 따라서 아직 어셈 구문에 대한 지식이 부족한 사람들은 인터넷의 정보들이나 좋은 서적들이 많으니 그쪽을 참고하면 좋을 것 같다.
목차)
1. 리버스 엔지니어링은 패턴이 있다.
2. 필수 숙지 사항
3. 함수의 기본 구조
4. 함수의 호출 규약
5. if 문
6. 반복문
7. 구조체와 API Call
8. 다음 호 예고
http://www.imaso.co.kr
