System Hacking/Basics

[시스템 해킹] 셸코드(Shellcode) 3- execve 셸코드/ execve shellcode와 orw shellcode 차이점

hanbunny 2025. 3. 10. 17:43

execve 셸코드?

임의의 프로그램을 실행하는 셸코드이다.

execve를 이용하면 서버의 셸을 획득할 수 있음.특징으론 execve 시스템 콜만으로 구성이 됨.

syscall
rax
arg0 (rdi)
arg1 (rsi)
arg2 (rdx)
execve
0x3b
const char *filename
const char *const *argv
const char *const *envp

*argv: 실행파일에 넘겨줄 인자, envp: 환경변수

우리는 sh만 실행하면 되기 때문에 execve("/bin/sh", null, null)을 실행하는 것을 목표로 셸코드를 작성해볼거임.

 

# execve.c 파일 생성
nano execve.c

# execve.c 파일 컴파일
gcc -o execve execve.c -masm=intel

 

execve.c 파일 내용

 

#컴파일 후 실행
bash$ ./execve
sh$ id 
uid=1000(실행중인 사용자 계정) gid=1000(실행중인 사용자 계정) groups=1000(실행중인 사용자 계정)

execve Shellcodeorw Shellcode 어케 다름

execve는 shell을 여는 코드이다. 파일을 읽거나 쓰지는 않고, shell을 실행한 뒤에 공격자가 직접 명령을 입력할 수 있도록 한다.반면에, orw Shellcode는 파일을 열고, 읽고, 출력하는 shell코드임. 즉, 파일을 직접 조작하는 것을 목표로 한다.


objdump 로 assembly code -> byte code 형태로 추출

Assembly code → Byte Code(Opcode) 변환은 어셈블리 코드(Assembly Code)를 기계어(바이너리) 코드로 변환하는 과정을 의미한다.

즉, 사람이 이해할 수 있는 어셈블리 코드를  *CPU가 실행할 수 있는 16진수 코드로 변환 하는 것임.

 

objdump를 사용해 추출해볼거임.

 

# shellcode.asm 파일 생성 
nano shellcode.asm

먼저 shellcode( Assembly code )가 들어있는 파일을 생성해준다.

shellcode.asm 파일 내용

 

$ sudo apt-get install nasm  # NASM(어셈블러) 패키지 설치
$ nasm -f elf shellcode.asm  # shellcode.asm 파일을 ELF 오브젝트 파일로 변환
$ objdump -d shellcode.o  # 오브젝트 파일에서 디스어셈블 실행

* NASM(넷와이드 어셈블러)은 x86 및 x86-64용 어셈블리 코드를 작성할 때 사용하는 어셈블러.

* objdump : ELF 파일의 기계어 코드를 분석하는 유틸리티.

 

 

위에 명령어를 실행해서  바이트 코드로 추출해줌.

objdump 사용 후 출력 결과

 

 

추출 후에 objcopy 명령어를 이용하면 shellcode.bin 파일을 얻을 수 있다.

그리고 xxd 명령어로 shellcode.bin 파일의 내용의 바이트 값들을 16진수 형태로 확인.

 # .text 섹션의 기계어 코드만 추출하여 shellcode.bin 파일로 저장
$ objcopy --dump-section .text=shellcode.bin shellcode.o  # .text 섹션의 기계어 코드만 추출하여 shellcode.bin 파일로 저장
# shellcode.bin 파일의 내용을 16진수(Hex)로 출력하여 바이트 코드(Opcode) 확인
$ xxd shellcode.bin