반응형

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
블로그 이미지

rootable

,