새소식

개발/어셈블리

Shell Code 제작 - x86_64

  • -

Shell Code 제작 - x86_64


[사진 1] - 대표 사진

Shell Code란?


Shell Code란 Shell(/bin/sh 등)을 실행시키는 일련의 어셈블리 코드라고 할 수 있다. 보통 Shell Code는 해당 아키텍쳐 환경에서 사용되는 함수 호출 규약을 따르기 때문에 찾아보고 직접 어셈블리 코드를 작성하며 만들어 보았다. 필자는 linux x86_64 환경이고 cdecl방식으로 c언어 컴파일을 진행 했다.

 

myshell 바이너리 제작


우선 본격적인 Shell Code를 제작하기 전에 해당 사이트에서 execve System Call의 인자값들을 살펴보았다.

x86_64 환경에서 리눅스 4.14 기준으로 System Call의 종류와 인자 값을 확인 할 수 있었다.

우리가 사용할 execve는 rax, rdi, rsi, rdx이 4가지를 사용한다.

[사진 2] - System Call Table

 

확인을 위해 직접 shell.c 파일을 작성하여 아래 명령어를 통해 컴파일을 진행한다.

이때 static 옵션은 공유 라이브러리들을 모두 한파일에 묶어 컴파일 하는 옵션이다.

gcc -m64 -o shell shell.c -static

[사진 3] - Vi

 

warning과 함께 파일이 컴파일 되었고 실행해보니 성공적으로 쉘이 실행되어 동작함을 알 수 있다.

[사진 4] - Shell 실행 모습

 

PwnGDB를 통해 디버깅을 진행해보았다.

[사진 5] - PwnGDB 디버깅

 

execve를 call 하는 부분에서 멈춰 현재 스택상태와 레지스터 상태를 기억하고 이렇게 되도록 asm파일을 만들어 컴파일 하도록해야 한다.

[사진 6] - call execve

 

필자는 다음과 같이 스택에 직접 넣음으로써 인자값을 전달하고 shell을 실행하도록 어셈블리어를 작성했다.

처음 작성해보는거라 많이 부족하지만 계속 작성하다보면 실력이 늘지 않을까..?

여기서 mov al, 0xb는 mov eax, 0xb로 할시 Null Byte(공백)이 들어가게 되어 문제를 풀때 입력 시 중간에 입력이 끊기게된다 그래서 al로 하였다.
또한 /bin/sh도 /bin//sh로 하였는데 위와 동일한 이슈로 이렇게 작성했다. 
syscall은 Call을 뜻한다.

global _start
  
_start:
        xor rax, rax
        xor rcx, rcx
        xor rsi, rsi

        push rax
        mov rdx, rsp
        mov rdi, 0x68732f2f6e69622f
        push rdi
        mov rdi, rsp
        push rax
        push rdi
        mov rcx, rsp
        mov rsi, rsp
        mov al, 0x3b
        syscall

 

myshell.asm을 컴파일 하기 위해서는 nasm이 필요하다 아래 명령어로 설치 할 수 있다.(우분투 기준)

apt-get update && apt-get install nasm

 

아래 명령어를 통해 만든 myshell.asm 파일을 바이너리 파일로 컴파일한다.

nasm -f elf64 -o myshell.o myshell.asm
ld -m elf_x86_64 -o myshell myshell.o

 

정확하게 어셈블리어를 작성하고 컴파일에 성공했다면 실행 했을 때 다음과 같이 쉘이 실행 된다.

[사진 7] - 쉘 실행

 

성공적으로 쉘이 동작한다면 myshell 파일을 objdump로 어셈블리어를 확인해본다.

이때 Null Byte(00)이 있는지 확인해 보고 있다면 없도록 다시 수정해서 컴파일 하면 된다.

일일히 옮겨서 적기 보단 필자는 아래 명령어를 통해 편하게 Shell Code를 얻었다.

 

for i in $(objdump -d ./myshell | grep "^ "|cut -f2);do echo -n \\x$i;done;echo

[사진 8] - Shell Code

후기


처음엔 막막 했었는데 계속 하다보니 이제 조금은 익숙해진 것 같다 효율적으로 최적화 하여 작성할때 까지 화이팅!!

'개발 > 어셈블리' 카테고리의 다른 글

Shell Code 제작 - x86,i386  (2) 2023.03.29
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.