재배치의 핵심은 ImageBase 기준으로 하드코딩된 포인트를 찾는 것!! 무슨말이냐 ? ImageBase가 0x400000 이라고 하면 코드내에서 "Call [ 0x401200 ]" 와 같이 0x400000를 사용된 부분을 하드코딩되었다고 표현한다. 이러한 부분들을 Relocation 되었을 때 새로 바뀐 ImageBase로 수정해주는 작업을 거쳐야한다. 때문에 재배치의 핵심은 이런 하드코딩된 포인트를 찾는 것이라 할 수 있다. PE File Format에는 이러한 포인트들이 기록된 Table이 존재한다. 위 사진에서 보이는 IMAGE_BASE_RELOCATION이 해당 Table이다. 해당 테이블의 Offset 및 Size는 Optional Header의 BASE_RELOCATION Table을 통해..
DLL ? Windows에서 사용하는 동적 라이브러리파일이다. ( Linux계열에서 so파일정도..? ) 일단 한번 로드된 DLL의 코드 및 리소스는 Memory Mapping기술로 여러 Process에서 다같이 쓰자 ! 1. 프로그램이 사용되는 순간 Loading, 사용이 끝나면 UnLoading - Explict Linking 2. 프로그램이 실행되는 순간 Loading, 프로그램이 종료되면 UnLoading - Implict Linking ( 이제 나올 IAT는 2번 항목에 해당하는 매커니즘을 제공한다. ) IAT & EAT ( Import Address Table, Export Address Table ) 한다리 건너서 호출된다. 예를 들어 "Call [0x101104]"을 하게되면 0x7C010..
PE 파일을 메모리에 로딩할 때 각 섹션에서 메모리주소(RVA)와 File Offset을 매핑하는 과정이다. 왜냐하면 FileAlignment, SectionAlignment가 서로 다르기 때문에 Memory상에서의 Section의 크기와, File상에서의 Section의 크기가 서로 다르다. (남는 부분은 Null Padding값으로 채워진다.) 1. 내가 찾으려는 RVA 주소가 포함된 Section을 찾는다. 2. 계산을 통해 File Offset을 찾는다. ( 생각보다 간단하다... ) Memory쪽 섹션시작 Base를 빼고, File쪽 시작 Base를 더한다. 다음에 못하면 비융신 ~~~ 결국 이게 필요한 순간은 OllyDBG등의 디버거상에서 내가 찾으려는 주소를 발견했을 때, 그 주소를 File..
PE32, PE+, PE32+ 라고 불리는 PE File Format은 실행파일형식이다. Linux의 ELF File Format과 같다. 이 파일형식을 가지는 확장자는 EXE, DLL, OCX, SYS 등등이 있다. DOS Header DOS Stub --- 여기까지는 DOS와의 호환성을 위해 존재하는 Header이다. NT Header Section Header (.text) Section Header (.data) Section Header (.rsrc) --- 여기까지가 PE Header이다. Section (.text) Section (.data) Section (.rsrc) PE File Format은 대표적으로 위와같은 구성을 가진다. 여기서 당연하게도 Section은 늘어날수도 줄어들수도 ..
이번 포스팅에서는 Visual Basic이라는 언어를 사용해 만들어진 프로그램들을 리버싱을 통해 분석할 때 주의해야할 점과 차이점에 대해서 설명한다. - VB 전용엔진을 사용한다. (MSUBUM60.dll 파일) 결과적으로 MSUBUM60.dll의 API를 우리가 호출하게되면 내부적으로 그 API에서 필요로하는 Windows API들을 다시한번 호출해주는 과정을 거친다. JAVA의 JVM과 비스무리한 느낌이기는 하다..? - N code, P code가 존재한다. N code는 Nature Code의 약자로 우리가 평상시에 사용하던 VC++에서 사용하던 코드이다. 반면에 P code는 VB 전용엔진에서만 해석이 가능한 코드를 말한다. (이식성이 증가한다.) - Event Handler 사용. Window..
여기서 소개하는 Register와 Stack은 모두 32bit 운영체제의 CPU를 기준으로 작성된다. General Purpose Register (범용 레지스터) EAX : Accumulator for operands and Result data. EBX : Pointer to data in the DS Segment. ECX : Counter for string and loop operations. EDX : I/O Pointer. EBP : Pointer to data on the Stack. ( SS Segment ) - 이게 맞나..? ( Stack Base Pointer 아닌가..? ) ESI : Source pointer for string operations. EDI : Destinatio..