본문 바로가기

2. Reversing (리버싱)

[2024.10.26]리버씽씽이_3주차 활동

3주차에는 유튜브 리버싱 강의를 8강~11강까지 학습하였다.

https://youtube.com/playlist?list=PLY12b4RRLcSdsxgVvTW3mnNzMjVrd8JhO&si=_-ulXwpWPqYW6NVt

 

리버싱 강의

리버싱에 대해 공부합시다.

www.youtube.com

 

 

1. 함수 호출 규약: 함수를 호출할 때 매개변수를 어떤식으로 정리하고 스택을 어떻게 정리할 것인지에 대한 약속

   1) 용어

      A. caller(호출자): 함수 호출자

      B. callee(피호출자): 함수 호출 당한 자

      C. cdecl

         i. C언어에서 사용되는 방식으로 caller(main함수)가 스택을 정리함

         ii. 오른쪽에서 왼쪽 인자 순으로 스택에 저장됨

 

 

mov edx, 2

mov ecx, 1 ; return add(1, 2) 역순으로 저장

call project3.7FF7B6BC1357 ; add 함수 호출

sub rsp, E8 ; 값을 빼줌으로써 메인함수 내에서 스택 정리

 

      D. stdcall

         i. window 32에서 사용됨, callee(함수)가 스택을 정리함, dll에서 사용

         ii. 오른쪽에서 왼쪽 인자 순으로 스택에 저장됨

         iii. c언어로 쓰고 싶으면 _stdcall 붙여주면 됨 (예시: int _stdcall add(←함수명))

   

     E. fastcall

         i. x64 아키텍처에서 사용, callee가 스택 정리

         ii. 최대 2개까지 ecx,edx,rdx,rcx로 이동하여 값을 보내고 나머지 값은 스택으로 보냄

         iii. 레지스터를 이용해서 호출이 더 빠름

 

 

2. PE file format

   A. pe 파일: windows os에서 실행 가능한 파일을 의미, 32bit임(64bit는 pe+, pe32+)

   B. 종류

      i. 실행 계열: exe, scr

      ii. 드라이브 계열: sys, vxd

      iii. library 계열: dll, ocx, cpl, drv

      iv. obj 계열: obj(예외로, obj(목적파일)는 실행 불가능한 파일임)

   C. Pe file 헤더(구조체)= dos header+dos stub+ntheader+section header

 

 

3. DOS header

어떤 파일이 메모리에 로드되었을 때의 모습

 

   A. 기본 지식

      i. va: virtual address

         1) 절대 주소(고유한 경로): 프로그램이 메모리에 로딩 됐을 때의 주소, 변경하기 어려움(상수)

         2) rva + imagebase = va

     ii. rva: relative virtual address

         1) 상대 주소: 현재 위치를 기준으로 파일의 상대적인 경로를 입력하는 방식(변수), 현재위치(imagebase)에 따라                            변함

     iii. 재배치(relocation): 파일 위치에 문제가 있을 때 다른 주소로 변경하는 것 (rva일 때 재배치가 가능해서 rva를 많                                   이씀)

   B. DOS HEADER

      i. image_dos_header는 모든 프로그램의 맨 앞에 있음(없으면 실행 불가(윈도우 기준)) -> ** 시그니처인 4D 5A는            코드 실행 파일에도 존재함 → 이 시그니처를 담고 있는 곳이 image_dos_header이기 때문에 없으면 안된다는 것          임 **

 

   ii. e_magic: dos header의 맨 앞 주소로 dos signature(4D 5A: MZ)

   iii. e_lfanew: dos header의 맨 뒷 주소로 nt header의 오프셋을 표시함

 

C. 참고사항

   i. 메모리에 로드될 때와 그냥 파일로 존재할 때 형식이 다름

   ii. WINDOWS는 빈공간은 null로 채움

 

4. DOS STUB

   A. dos header와 달리 옵션 사항임(없어도 실행 가능)

   B. ms-dos 환경에서만 실행되는 코드(windows os에서는 실행 x)

   C. dos stub을 잘 이용한다면 windows, dos 둘 다 실행되는 파일을 만들 수 있음