본문 바로가기

01. Hello_World.exe 실습 환경 : Windows XP 32bit 가상머신 + 이뮤니티 디버거 main 함수를 찾은 후에,Title 부분은 문자열을 직접 수정하고message 부분은 빈공간에 문자열을 쓴 후, 문자열이 있는 주소로 주소를 수정함 p.s. 수정된 코드로 파일을 만들면 제대로 작동하지 않는다. message 부분이 문제실행 파일이 메모리에 로딩되어 프로세스로 실행될 때 파일이 그대로 메모리로 로딩되는 것이 아니라,어떤 규칙(메모리 관리기법.. 세그먼테이션+페이징 -> 가상메모리)에 의해 올라가게 되는데프로세스 메모리는 존재하지만, 그에 해당하는 파일 오프셋이 존재하지 않기 때문이라고함 (p.44) PE File Format 공부 후에 이부분 다시 확인 필요.. 더보기
PE 파일 포맷 ( PE File Format ) 요약 PE File Format PE(Portable Executable)파일 - Windows 운영체제에서 사용되는 실행 파일 형식 종류 - 실행 계열 : exe, scr - 라이브러리 계열 : dll, ocx, cpl, drv - 드라이버 계열 : sys, vxd - 오브젝트 파일 계열 : obj 구조 PE Header : DOS Header ~ Section Header PE Body : PE헤더 이후 Section들 파일을 실행하기 위한 모든 정보는 구조체 형식으로 PE 헤더에 저장되어 있다.섹션 헤더에 각 섹션에 대한 크기/위치/속성이 정의되어 있고,파일의 내용은 코드(.text), 데이터(.data), 리소스(.rsrc) 섹션에 나누어 저장한다. 파일에서는 offset으로 메모리에서는 VA로 위치 .. 더보기
함수 호출 규약(Calling Convention) 함수 호출 규약(Calling Convention) 함수 호출 시 전달 되었던 파라미터들에 대하여함수 호출이 끝난 후 스택을 정리하는 방법에 대한 약속( ESP를 정리하는 방법 ) caller : 함수를 호출한 쪽callee : 호출 당한 함수 1. cdcel- 주로 C언어에서 사용 됨- caller에서 스택을 정리한다.- 장점 : 가변 길이 파라미터를 전달할 수 있다.2. stdcall- Win32 API에서 사용됨- callee에서 스택을 정리- c언어에서 stdcall 방식을 사용하고 싶을 때는 함수이름 앞에 '_stdcall' 옵션 추가3. fastcall- stdcall 방식과 기본적으로 같지만, 전달하는 파라미터의 일부(2개)를 레지스터(ECX, EDX)를 이용해 전달한다. 나머지는 스택을 통.. 더보기
레지스터 ( Register )의 이해 IA-32(Intel Architecture 32bit)의 레지스터에 대해 정리하겠습니다. ( 리버싱 핵심원리 ) 레지스터란 CPU 내부에 존재하는 다목적 저장 공간입니다. 일반적으로 메모리라고 얘기하는 RAM(Random Access Memory)과는 성격이 조금 다릅니다. CPU가 RAM에 있는 데이터에 접근하기 위해서는 물리적으로 돌아가야하기 때문에 오래걸리지만, 레지스터는 CPU 내부에 존재하므로 고속으로 데이터를 처리할 수 있습니다. IA-32 레지스터의 종류는 다양하지만초급 단계에서는 Basic program execution registers에 대해 알아두어야 합니다.(중/고급 단계에 올라가면 Control registers, Memory management registers, Debug r.. 더보기
바이트 오더링( 빅 엔디언, 리틀 엔디언 ) 바이트 오더링이란 데이터를 저장하는 방식을 말합니다.빅 엔디언 표기법과 리틀 엔디언표기법 2가지 방식이 있습니다 1. 빅 엔디언 표기법대형 UNIX 서버에 사용되는 RSIC 계열의 CPU에 많이 사용되고, 네트워크프로토콜에 사용됩니다.데이터를 저장할 때 사람이 보는 방식과 동일하게 순차적으로 저장합니다.ex) 0x12345678 -> (빅 에디언 표기법) 0x12345678 2. 리틀 엔디언 표기법리틀 엔디언은 Intel x86 CPU에서 사용되므로 Windows계열 리버싱을 위해 리틀 엔디언 방식을 잘 알아야 합니다. 데이터를 저장할 때 역순으로 저장합니다.ex) 0x12345678 -> (리틀 에디언 표기법) 0x78563412데이터를 역순으로 저장시키기므로 산술 연산과 데이터의 타입이 확장/축소될 .. 더보기
리버싱 ( Reversing ) Reverse Engineering 의 줄임말입니다. 제작된 프로그램의 동작방식을 관찰하며 원래 소스 코드를 복원해내는 작업입니다. 리버싱을 통해 프로그램의 흐름이나 구조, 취약점을 찾아낼 수 있고 패치나 크랙도 가능합니다ㅎㅎ 더보기