Shellcode(쉘코드) 정의

- Shellcode란 시스템의 특정 명령을 실행할 수 있는 기계어 코드이다

- 아래에서 제작한 Shellcode는 쉘을 떨어뜨리기 위한 쉘코드이다

 

Shellcode(쉘코드) 제작 순서

  1. c언어로 구현

  2. gdb로 역 어셈블링하여 필요한 부분 찾기

  3. 시스템 콜에 필요한 필수 부분만으로 어셈블리어 구현

  4. 컴파일 후 objdump로 기계어를 출력

  5. null이 존재할 시 null값을 변환 처리하여 없앤다

  6. 기계어 코드들을 하나의 문장으로 완성

 

1. c언어로 구현

 

vi를 사용하여 shellcode.c라는 파일로 쉘을 떨어뜨리기 위한 위 코드를 작성해준다                 #execve(const char *path, char*const argv[], char envp[]);
static 옵션을 꼭 사용하여 컴파일을 해준다

 

2. gdb로 역 어셈블링하여 필요한 부분 찾기

 

gdb를 이용하여 execve함수의 동작 내용을 확인하고 int 0x80 부분에 브레이크를 걸어준다

 

run으로 프로그램을 시작한뒤 명령어로 변수의 값들을 확인해준다

eax ebx ecx edx
execve(11번)
16진수 - 0b
/bin/sh 배열의 시작 주소
(/bin/sh의 주소)
0
함수 호출 번호 첫 번째 인자 자리  두 번째 인자 자리  세 번째 인자 자리

 

3. 시스템 콜에 필요한 필수 부분만으로 어셈블리어 구현

 

shellcode.asm 파일로 필수요소만 어셈블리어로 작성해준다

 

컴파일을하고 잘 실행이되나 한번 실행시켜 본다

 

4. 컴파일 후 objdump로 기계어를 출력

 

objdump로 열어서 기계어 코드에 null 값이 있나 확인해준다

 

5. null이 존재할 시 null값을 변환 처리하여 없앤다

null 값 이후에 값들을 복사하지않아 정상적으로 동작하지 않는다는 문제점이 있기 때문에 null값을 다 지워준다

- 레지스터 너비 수정 ( 8비트, 16비트 레지스터 사용)

ex) 32bit : eax, 16bit : ax, 8bit : al 

- XOR ( 자기 자신을 XOR하여 0삽입)

ex) xor eax, eax 

 

위에서 작성 shellcode.asm 코드를 오른쪽과 같이 수정하고 다시 한번 컴파일해준다

 

컴파일 후 다시 objdump로 shellcode를 열어보면 null 값이 사라진걸 확인할 수 있다

 

6. 기계어 코드들을 하나의 문장으로 완성

추출 명령어

for i in $(objdump -d ./shellcode | grep "^ "|cut -f2);do echo -n \\x$i;done

 

명령어를 사용하여 objdump 안에서 기계어 코드만 \x를 붙여서 뽑아낸다

 

7. 6번에서 추출해낸 기계어 코드를 테스트해 본다

 

위에 code 배열 안에 추출한 기계어 코드를 넣어주고 test.c로 저장후 컴파일해준다

 

test 파일을 실행해보면 쉘코드가 잘 작동하는걸 확인할 수 있다

 

 

'시스템 해킹' 카테고리의 다른 글

ASCII Armor  (0) 2020.11.10
ASLR ( Address Space Layout Randomization )  (0) 2020.11.10
RTL ( Return to Libc )  (0) 2020.11.06
DEP (Data Execution Prevention)  (0) 2020.11.06
Stack Buffer Overflow (스택 버퍼 오버플로우)  (0) 2020.11.06

+ Recent posts