-
[스피어피싱] 8강 쉘코드 분석 절차보안/스피어피싱 2024. 8. 31. 20:13
1. 쉘 코드의 셀프 바인딩
1.1 바인딩
- 스토리지에 있는 실행파일이 메모리에 매핑됨
- 이 매핑은 로더가 해줌
- 로더는 실행파일에 있는 Import 정보를 분석함
- 이 Import 정보 안에는 실제 DLL 이름과 함수의 이름들이 존재
- 이러한 정보를 이용해 실행 파일이 필요한 라이브러리들을 같이 로드
- 라이브러리에 대한 정보가 뭔지 알려면 Import 정보 분석을 해야함
- 실행 파일이 일을 하기 위해선 함수를 호출해야 하는데 실행 파일도 처음에는 필요한 함수의 위치를 모름
- 그렇기에 실행 파일이 스토리지에 존재할때 IAT(Import Address Table)에 함수의 이름을 포인팅하는 주소값을 넣어놓음
- 메모리에 매핑이 된 후 로더에 의해서 실제 IAT가 재구성이 됨(오버라이트)
- 함수의 이름을 포인팅 -> 실제 API 주소를 포인팅
위 작업을 바인딩이라고 한다.
= 바인딩이라는 작업을 통해 IAT를 오버라이트 한다
이러한 바인딩 작업을 위해서는 두개의 함수가 필요함
- LoadLibrary("DLL 이름")
- GetProcAddress(DLL 핸들, "함수 이름")
- DLL 핸들 = 메모리에 로딩된 이미지 주소
쉘코드도 결국에는 운영체제에 서비스를 부탁하는 입장이지만 운영체제 입장에서는 쉘코드는 끼어든 존재이기에 로더가 바인딩 안도와줌
- 그렇기에 쉘코드는 스스로 바인딩을 진행 = 셀프 바인딩
- 셀프 바인딩을 통해 함수 주소를 파악해 별도의 테이블에 유지
- DLL 이름, 함수의 이름 알아야 함
위의 셀프 바인딩 문제로 인해 두가지 문제에 봉착함(공격자 입장)
- 쉘코드의 경량화(함수, 라이브러리의 문자열 길이)
- 가벼울수록 메모리에 올라갈 확률 높아지고 탐지될 확률 적어짐
- 문자열 분석으로 인한 정보 노출
해결법 = API 해시 이용
API 해시
- 예 : InternetConnect() 함수가 존재할 시 그대로 사용하는게 아닌 HASH()의 Input 값으로 전달
- 거기서 나온 결과값의 일부분을 사용
1.2 API 해시 분석을 이용한 쉘코드 기능 파악
- 함수의 API 이름을 계산해 미리 해쉬값으로 만들어놈
- 이러한 값들을 쉘코드에 매핑시켜서 비교
- 매핑 시 yara rule 사용
- 약간 딕셔너리 어택 같은 느낌
- 매핑 시 yara rule 사용
'보안 > 스피어피싱' 카테고리의 다른 글
[스피어피싱] 11강 쉘코드 디버깅 분석 - 쉘코드 문자열 (0) 2024.09.03 [스피어피싱] 9강 쉘코드 API 해시 패턴매칭_YARA 룰셋 (0) 2024.08.31 [스피어피싱] 7강 쉘코드 개요 및 구성요소 (0) 2024.08.31 [스피어피싱] 6강 악성 문서파일의 구성요소 (0) 2024.08.31 [스피어피싱] 5강 스피어피싱 이메일 분석 실습 (0) 2024.08.31 - 스토리지에 있는 실행파일이 메모리에 매핑됨