SMALL
※ Release 모드로 빌드하면, 코드가 좀 더 간결해져서 디버깅하기 편하다.
OllyDbg 사용법/단축키
(1)Code Window - Disassembly Code를 표시하여 Comment/Label 등을 보여주며 코드를 분석하여 Loop, Jump 위치 등의 정보를 표시
(2)Register Window - CPU 레지스터 값을 실시간으로 표시하며 특정 레지스터들은 수정까지 가능
(3)Dump Window - 프로세스에서 원하는 메모리 주소 위치의 Hex값과 ASCII/유니코드 값으로 표시하고 수정도 가능
(4)Stack Window - ESP 레지스터가 가리키는 프로세스 Stack메모리를 실시간으로 표시하고 수정도 가능
- 기본 명령어
- 디버거 동작 명령(Code Window에서 동작)
EP (Entry Point)
- EP란 Winodws 실행 파일(EXE, DLL, SYS 등)의 코드 시작점을 의미
- 프로그램이 실행될때 CPU에 의해 가장 먼저 실행되는 코드 시작 위치
HelloWorld 의 소스코드를 이용해 Reversing하기
각 컴파일러별로 Stub Code 를 익혀 놓으면 좋다고한다. 아직 초보이기 때문에 차차 알아 가도록 하자!
주소가 맞지 않는 느낌? 그래서 그냥 main()함수 찾기에 들어갔다.
먼저 Release모드로 컴파일을 한 HelloWorld 소스코드를 빌드를 통해 exe파일을 생성해내고 찾아보았다.
내려보다보니 이것이 main 함수를 호출 하는 느낌이다. F2를 이용해 break point를 똭 걸어주었고 F7을 이용해 내부로 들어가 보았다.
MessageBoxW() API를 호출하는 코드가 나타났다. 이 API의 파라미터가 "www.reversecore.com" , "Hello World!!" 문자열이다.
리턴을 시전해 보니
따라서 401000 함수가 바로 main() 함수이다.
베이스 캠프 설치하는 방법이다.
1)Goto명령
베이스캠프 주소를 잘 기억해 두었다가 Go to[Ctrl+G] 명령으로 가는 것이다. 그런다음 F4를 이용해 그곳까지 실행해 디버깅을 시작하는 것.
2)BP 설치이다.
BP(Break Point)를 F2로 설정해 두고 , F9 로 실행한다. (매우 자주쓰는 방법)
그리고 Alt+B 를 이용하면 Break Points 목록이 나타난다.
3)주석
위와 같이 메인을 콜하는 부분에 나는 주석을 달아서 쉽게 찾아가는 방법도 있다. (매우 편함)
처음 알았던 건데 교재에서는 다른 위치를 두고 (이미지는 좀 다름) 마우스 우측해서 타고타고 들어가면
요런식으로 사용자가 입력한 주석들이 표시된다. (빨간 글씨로 표시된 부분이 커서 위치, 주석위치와 겹쳐지면 빨간 글씨만 나타난다)
4)레이블
레이블은 원하는 주소에 특정 이름을 붙여주는 아주 유용한 기능이다.
주석을 다는 단축키 [;] 에서 쉬프트키로 이용해 [:] 를 이용해 레이블을 입력하면된다.
이런식으로 되는것 같다.
레이블도 주석과 비슷한 방식으로 검색이 가능하다. 더 연습을 해봐서 레이블이 어떻게 쓰이는지 봐봐야 겠다.
원하는 코드를 빨리 찾아내는 4가지 방법
디버깅을 시작하면 EP주소에 바로 main()함수가 나타는것이 아니고 개발 도구 의 Stub Code가 나타나는 것을 알았다.
main()함수는 EP코드에서 한참 떨어져있었는데 빨리 찾는 방법을 알면 더 좋을것 같다!
- 코드 실행 방법
- 간단하게 말하자면 F8(Step Over)를 이용해 한줄한줄 실행해 보면서 언젠가 main()함수의 MessageBox()를 실행시키는 것이다. 찾아낸다면 재실행 하여 F7(Step Into)를 이용해 확인한다!
- 참고부분 : Win32 응용 프로그램에서는 API 함수의 파라미터를 스택을 이용해서 전달한다. VC++을 사용하면, 기본 문자열은 유니코드가 되고, 문자열 처리 API 함수들도 전부 유니코드 계열의 함수로 변경된다.
문자열 검색 방법
- 마우스 우측 - Search for - All referenced text strings
- 근데 보호기법이 걸려있는 것 같다. 교재와 다른 Disassembley , 이 주소를 이용해 덤프창에서 찾아 문자열을 패치한다고 한다.
API 검색 방법(1) - 호출 코드에 BP
- Windows 프로그래밍에서 모니터 화면에 무엇을 출력하려면 Win32 API를 사용해 OS에게 화면 출력을 하므로
- 프로그램의 기능을 보고 사용되었을 법한 Win32 API 호출을 예상해 찾는다!
- 코드에서 사용된 API호출목록 보기 : 'All intermodular calls'
- OllyDbg가 어떻게 프로그램에서 호출되는 API의 이름을 정확히 뽑아올까? PE File Format의 IAT 공부하기!
API 검색 방법(2) - API 코드에 직접 BP
- 모든 실행 파일에 대해 API 함수 목록을 추출 X
- Packer / Protector를 사용하여 실행 파일을 압축(또는 보호)하면, 파일 구조가 변경되어 API 호출 목록 안보인다.
- Packer(Run Time Packer)
- 실행 압축 유틸리티. 실행 파일의 코드, 데이터, 리소스 등을 압축시킨다. 일반 압축 파일과 다른 점은 실행 압축된 파일 그 자체도 실행 파일이라는 것
- Protector
- 실행 압축 기능 외에 파일과 그 프로세스를 보호하려는 목적으로 anti-debugging, anti-emulating, anti-dump 등의 기능을 추가한 유틸리티이다. Protector를 상세 분석하려면 높은 리버싱 지식 요구
- 이런 경우에는 프로세스 메모리에 로딩된 라이브러리(DLL코드) 에 직접 BP를 걸어 보는 것.
- API는 C:\Windows\system32 폴더에 *.dll 파일 내부에 구현되어있다.(ex:kernel32.dll,user32.dll 등)
- 프로그램이 일을 하려면 반드시 OS에서 제공된 API를 사용해 OS에 요청하고, 그 API가 실제 구현된 시스템 DLL 파일들은 우리 프로그램의 프로세스 메모리에 로딩되어야한다.
- 로딩된 시스템 DLL 파일이 제공하는 모든 API 목록을 보여주는 : 'Name in all modules' 명령 사용
- 더블클릭해 USER32.dll에 구현된 실제 MessageBoxW 함수로 가기
- BP 설치후 실행하여 보니 ESP 값이 19FF18인데, 이게 프로세스 스택의 주소이다.
- 스택 윈도우를 보니 ESP의 값 19FF18에 있는 리턴 주소 401014는 HelloWorld.exe의 main 함수 내의 MessageBoxW 함수 호출 바로 다음 코드다.
- 실행 Ctrl+F9 한담에 빠져나가면 401014로 갈 수 있다.
- 이런식으로 찾아 갈수도 있다(조금 복잡하지만 괜찮은듯..?)
문자열 패치
패치!
리버싱에서 패치는 빼놓을 수 없는 아주 중요한 주제이다.
패치 대상은 파일 혹은 메모리가 될수 있으며, 프로그램의 코드와 데이터 모두 패치가 가능하다.
문자열을 패치해보기
- 패치하는 두가지 방법
- 문자열 버퍼를 직접 수정
- 덤프 창이 어디에있는지 찾아가고 해당영역 선택후 Ctrl+E 를 통해 Edit창으로 이동!
- 유니코드 항목에 'Hello Reversing' 입력한다. (유니크도 문자열은 2바이트 크기의 NULL로 끝나야 한다는 것,HEX에서!)
- 변경되었다.
- 장점은 간단하다. 단점은 기존 문자열 버퍼 크기 이상의 문자를 입력하기 어렵다(제약조건)
- 이것은 임시적으로 한것이니 파일로 생성하기를 하면된다. dump창 -> 해당 문자열 선택 -> 우클릭 Copy to executable file 메뉴 선택 -> 다시 우클릭 Save file 선택해서 -> 원하는 파일이름으로 저장!
- 다른 메모리 영역에 새로운 문자열을 생성하여 전달
- 원본 문자열 보다 더 긴 문자열로 패치해야 한다면 앞의 방법은 맞지 않다.
- 기존의 HelloWorld의 dump창의 스크롤을 내려 NULL padding 영역으로 끝나는 것을 볼수 있는데 이곳에 "Hello Rervesing!!!"을 입력해 줍니다.
- 이제 새로운 버퍼 주소를 파라미터로 전달해줘야 하는데 code 창에 스페이스바를 이용해 주소를 바꿔주면
- 이렇게 변경될 수 있다.
- 정확히 이해하려면 PE File Format을 공부해야한다고 한다.
'Reversing > 리버싱_핵심원리' 카테고리의 다른 글
6장 abex' crackme #1 분석 (0) | 2019.07.25 |
---|---|
5장 스택 (0) | 2019.07.25 |
4장 IA-32 Register 기본 설명 (0) | 2019.07.25 |
3장 리틀 엔디언 표기법 (0) | 2019.07.25 |
1장 리버싱 스토리 (0) | 2019.07.25 |