※ 빌드 : 개발도구를 이용하여 소스코드를 실행파일로 만듦
- 사람이 이해하기 쉬운 고급언어를 기계가 이해하기 쉬운 기계어로 변환하는 과정
※ 디버거(Debugger) 유틸리티 : 디버거에 탑재된 디스어셈블러 모듈로 기계어를 어셈블리 언어로 변역함
- 디버거를 통해 어떤 실행 파일도 어셈블리 언어로 번역하여 볼 수 있음
- 어셈블리 언어는 CPU에 종속되어 있는데, PC에서 많이 사용되는 Intel x86 계열의 CPU와
모바일 제품에서 많이 사용되는 ARM 계열의 CPU는 서로 어셈블리 명령어의 형태가 다름
1. OllyDbg 기본 화면
1) Code window : 주소에 따른 CPU 명령, 어셈블리코드, 주석을 표시
2) Register window : CPU register 값을 실시간으로 표시하며 특정 register들 수정 가능
3) Dump window : 프로세스에서 원하는 메모리 주소 위치의 Hex, ASCII/유니코드 값으로 표시하고 수정 가능
4) Stack window : ESP register가 가리키는 프로세스 stack memory 실시간으로 표시하고 수정가능
1.1 OllyDbg 기본 명령어
1) Restart : [Ctrl+F2] 다시 처음부터 디버깅 시작
2) Step Into [F7] : 하나의 OP code 실행
3) Stop Over [F8] : 하나의 OP code 실행(CALL 명령을 만나면 따라 들어가지않고 함수 자체를 실행)
4) Execute till Return [Ctrl+F9] : 함수 코드 내에서 RETN 명령어까지 실행
2. 기본용어
EP(Entry Point) 코드 : Windows 실행 파일의 코드 시작점으로 프로그램이 실행될 때 CPU에 의해
가장 먼저 실행되는 코드 시작 위치
Stub Code : 컴파일러가 프로그램을 만들 때 집어넣는 코드로, 프로그램 실행에 필요한 정보를 얻어오는 코드로 구성
- 디버깅을 자주하다보면 Stub Code를 빠르게 스킵하고 EP를 찾을 수 있다.
베이스캠프 : 디버거를 재실행할 때마다 처음(EP 코드)부터 새로 시작하기 때문에 상당히 불편한데, 이를 해소하기위해
중요 포인트를지정해 놓은 후 디버깅 과정에서 목표 지점까지 빠르게 도달할 수 있게할 수 있다.
3. main 함수 찾는법
CALL하여 호출되는 함수들 중에서 프로그램 시작을 나타내는 동작을 수행하면 main 함수를 찾은것이다.
예로 main 함수에서 MessaageBox를 띄운다고 할 때, 코드들을 실행시키다가 MessageBox를 호출하는 함수에
들어선다면, 해당 함수가 main함수인 것이다.(프로그램 기능이 명확한 경우)
4. 원하는 코드를 빨리 찾아내는 방법
1) 코드 실행 방법
프로그램의 기능이 명확한 경우에 사용하는 방법으로 명령어를 하나하나 실행해가면서 원하는 위치를 찾아간다.
2) 문자열 검색 방법
Code window에서 마우스 우측 클릭 -> Search for -> All referenced text strings -> 검색하려고 한 문자열 찾음
3) 호출 코드에 BP 적용
Code window에서 마우스 우측 클릭 -> Search for -> All intermodular calls
-> 적용하려는 Win32 API를 더블클릭하고 BP를 적용시킨 다음 실행하여 코드를 찾아낸다.
4) API 코드에 직접 BP 적용
Code window에서 마우스 우측 클릭 -> Search for -> Name in all modules -> 해당 창에서 찾는 API명 입력
-> 더블클릭 후 해당코드에 BP 적용
(아래와 같은 파일인 경우에 호출코드가 아닌 API코드에 직접 BP를 적용해야 한다.)
- Packer(Run Time Packer) : 실행 압축 유틸리티. 실행 파일의 코드, 데이터, 리소스 등을 압축시킵니다.
일반 파일 압축과 다른 점은 실행 압축된 파일 그 자체도 실행파일 이라는 것이다.
- Protector : 실행 압축 기능 외에 파일과 그 프로세스를 보호하려는 목적으로 기능을 추가한 유틸리티
5. 문자열 패치 방법
※ 패치 : 기존 응용 프로그램의 버그를 수정하거나 또는 새로운기능을 추가하는 것
1) 문자열 버퍼를 직접 수정하는 방법
Dump window에서 Go to 명령[Ctrl+G]으로 문자열 버퍼 주소로 이동 -> [Ctrl+E] 단축키 입력 후 문자열수정
→ 주의점 : 원본 문자열보다 큰 문자열을 덮어쓸 때는 그 뒤의 데이터를 훼손하지 않도록 주의해야한다.
뒤에 중요한 데이터가 있다면, 프로그램에서 메모리 참조 에러가 발생할 수 있기 때문이다.
2) 다른 메모리 영역에 새로운 문자열을 생성하여 전달
Dump window에서 00으로만 구성된 밑줄의 NULL padding 영역에 원하는 문자열 입력[Ctrl+E]
-> Code window에서 불러오던 문자열 주소를 위에 문자열이 입력된 주소로 변경시킴
(space키 입력 시 어셈블리 코드 수정 가능 ex) PUSH 1111 -> PUSH 2222)