6주차에는 유튜브 리버싱 강의를 18강 ~ 20강까지 학습하였다.
https://www.youtube.com/playlist?list=PLY12b4RRLcSdsxgVvTW3mnNzMjVrd8JhO
1. EAT
- 라이브러리 파일에서 제공하는 함수를 다른 프로그램에서 가져와 사용할 수 있도록 해주는 핵심 메커니즘
- 함수의 시작 주소 파악 가능 및 구조체가 있음
- EAT 내부에 저장되는 함수들의 정보는 PE 파일이 내보내는 함수의 개수와 해당 함수의 주소 뿐 → 한 개의 배열(IMAGE_EXPORT_DIRECTORY)
2. IMAGE_EXPORT_DIRECTORY(EAT의 구조체)– IMAGE_OPTIONAL_HEADER에 위치
- NumberOfFunctions: 실제 Export 함수의 개수
- NumberOfNames: Export 함수 중에서 이름을 가지는 함수
- AddressOfFunctions: Export 함수 주소 배열(배열의 원소 개수 = NumberOfFunctions)
- AddressOfNames: 함수 이름 주소 배열(배열의 원소 개수 = NumberOfNames)
- AddressOfNamesOrdinals Ordinal(고유 번호) 배열(배열 원소 개수 = NumberOfNames)
3. <GetProcAddress() 작동 원리> 예시) kernel32.dll
1) AddressOfNames 멤버를 이용하여 함수 이름 배열로 이동
2) 함수 이름 배열은 문자열 주소가 저장됨. 문자열 비교를 이용해서 원하는 함수의 이름을 찾음
(Array_Index == 인덱스)
3) AddressOfNamesOrdinals 멤버를 이용해 Ordinal 배열로 이동
4) Ordinal 배열에서 Array_Index로 해당 고유번호(Ordinal) 값을 찾음
5) AddressOfFunctions 멤버를 이용해 함수 주소 배열(EAT)로 이동
6) 함수 주소 배열(EAT)에서 전에 구한 Ordinal 값을 인덱스로 사용하여 원하는 함수의 시작주소를 얻음
Ordinal == Index → ordinal = 15, AddressOfFunctions[15]
만약 Ordinal != Index라면
AddressOfNamesOrdinals 배열의 값이 Ordinal == Index 가 아니더라도 GetProcAddress()를 사용.
Ordinal 값을 가져오는 방식이 조금 다름
4. 총정리
1) IAT
- PE 파일이 다른 DLL 파일에서 사용하는 함수를 참조할 때 사용.
- PE 파일 내에서 참조하려는 모든 함수들의 주소로 채워짐
- 프로그램이 해당 함수를 호출할 때 IAT에 저장된 함수 주소를 호출
2) EAT
- PE 파일이 제공하는 함수를 다른 프로세스에서 사용할 수 있도록 내보내기 위해 사용
- PE 파일이 로드될 때 EAT는 PE 파일이 내보내는 모든 함수의 주소를 저장
- 다른 프로세스에서 PE 파일 내의 함수를 호출할 때 EAT 주소를 찾아서 호출
3) INT(Import Name Table)
- PE 파일에서 참조하는 모든 DLL 파일과 함수 이름을 포함
5. 실행 압축
1) 데이터 압축: 컴퓨터 공학의 주요 분야. 어떤 형태의 파일이라도 내부 바이너리로 되어 있으며 이는 적절한 압축 알 고리즘을 이용하여 프로그램의 크기를 줄임 → 보관과 전송을 용이하게 만들어 줌
2) 압축의 종류
- 비손실 압축(Lossless Data Compression): 흔히 사용하는 압축(알집 등) - 모든 파일 압축 가능
- 손실 압축(Loss Data Compression): 파일을 손실시킨 후 데이터를 크게 압축시킴 - 모든 파일 압축 가능
- 실행 압축(Executable Compression): 압축 해제 프로그램 없이 내부적으로 패킹을 해제시킴 - EXE 파일만 압축
- 내부에 압축 해제 코드(decoding logic) 포함 → 취약점이 존재할 수 있음
3) decoding & encoding
- 인코딩: 원본 → 다른 형태를 변환
- 디코딩: 다른 형태 → 원본
6. 패커 & 프로텍터
1) PE 패커(Packer): 실행 파일 압축기, 정확한 명칭은 Run-Time 패커로 PE파일 전문 압축기(ex. UPX, ASPACK)
- 특징
- 파일 크기를 작게 만듦.
- 리버싱을 약간 어렵게 만듦
- 단점
- 메모리에서 디코딩 루프(언패킹)가 돌아 패킹이 풀림
- 덤프를 뜨면 풀림
2) 프로텍터(Protector): 리버싱을 어렵게 만드는 압축기(ex. Themida, VMP)
- 특징
- Anti-Reversing(코드를 꼬아놓기, 루프문을 넣기, 함수명 바꾸기, 디버깅 탐지기능 넣기) → 파일의 크기가 커짐
'2. Reversing (리버싱)' 카테고리의 다른 글
[2024.11.09]리버씽씽이_5주차 활동 (3) | 2024.11.15 |
---|---|
[2024.11.02]리버씽씽이_4주차 활동 (4) | 2024.11.08 |
[2024.10.26]리버씽씽이_3주차 활동 (0) | 2024.11.01 |
[2024.09.28] 리버씽씽이_2주차 활동 (3) | 2024.10.03 |
[2024.09.21] 리버씽씽이_1주차 활동 (5) | 2024.09.27 |