Section 1. 쉘코드 작성 원리
* 쉘코드 : 공격이 성공한 후 실행을 시킬 실질적인 실행코드
- Exploit을 총으로 비유한다면 쉘코드는 총알
- 공격이 성공해서 쉘코드가 실행되는 도중 잘못된 쉘코드 때문에 중단되면 아무 소용이 없으므로 쉘코드는 신뢰성이 있어야 하고 범용적일수록 좋다.
1. 쉘코드 기본
* 명령을 실행하는 함수 : WinExec, ShellExecute, CreateProcess 등 존재
- 인자값이 많을수록 쉘코드가 길어져서 활용성 측면에서 불리하므로 인자값수가 적은 WinExec가 좀 더 유리
* 인자값 2개를 역순으로 스택에 push한 뒤 함수 주소를 call 명령으로 호출
* 함수의 주소값은 DLL이 로드되는 주소에 따라 달라짐
- Windows7에서는 재부팅될 때마다 kernel32.dll이 로드되는 주소가 바뀌므로 함수의 주소값도 바뀌게 됌
* 데이터 실행 방지
- 스택, 힙 등의 메모리상에서 코드가 실행되는 것을 방지하는 것
- 버퍼오버플로우 등을 통한 공격을 방어하기 위해 운영체제에 적용된 방어 매커니즘
- [프로젝트] > [속성] > [링커] > [고급] > [DEP(데이터 실행 방지)]
* 쉘코드 작성 방법
1. 취약점을 공격하는 코드를 작성
2. 디버깅 모드로 진입하여 디스어셈블리로 이동 후 코드 바이트 표시를 선택하여 바이트 코드를 추출
3. 해당 바이트 코드를 이용하여 쉘 코드 작성
2. 널바이트 제거
- 쉘 코드 내에 널바이트(\x00)이 들어있으면 문자열 복사 계열 함수에서 발생하는 취약점에는 사용할 수 없다.
- C언어에서는 널바이트를 문자열의 마지막으로 인식하기 때문
- 공격의 안전성을 위하여 널바이트를 제거하는 작업이 필수
(1) 레지스터나 메모리를 0으로 만든 후 해당 레지스터를 이용
- xor를 이용하여 레지스터나 메모리를 0으로 만듦
- 가장 쉬운 해결방법
ex)
mov byte ptr [ebp-4], 63h xor ebx, ebx
mov byte ptr [ebp-3], 6Dh -> mov dword ptr [ebp-4], ebx
mov byte ptr [ebp-2], 64h mov byte ptr [ebp-4], 63h
mov byte ptr [ebp-1], 0 mov byte ptr [ebp-3], 6Dh
mov byte ptr [ebp-2], 64h
(2) 널바이트가 들어가지 않는 명령어로 대체
ex) mov eax, 12h -> push 12h, pop eax
(3) 32비트 레지스터가 아닌 16비트, 8비트 레지스터 사용
- 동일한 0x12라는 값을 표현할 때 32비트 레지스터는 0x00000012라고 표현되지만, 8비트로 표현하면 0x12
(4) add, sub 등의 연산 명령 사용
ex) mov eax, 12h -> add eax, 12h
'Hacking > System' 카테고리의 다른 글
PART3 쉘코드 원리와 작성(2) (1) | 2016.12.27 |
---|---|
16.12.19 공부일지 (0) | 2016.12.20 |
16.12.17 공부 (0) | 2016.12.18 |