[Dreamhack] shell_basic

2023. 7. 20. 19:21·Pwnable/Dreamhack
 

shell_basic

Description 입력한 셸코드를 실행하는 프로그램이 서비스로 등록되어 작동하고 있습니다. main 함수가 아닌 다른 함수들은 execve, execveat 시스템 콜을 사용하지 못하도록 하며, 풀이와 관련이 없는

dreamhack.io


shell_basic.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// 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();
}
Colored by Color Scripter
cs
  1. main 함수에서 shellcode 를 stdin 에서 읽고 실행한다.
  2. orw 쉘 코드를 작성하고 shellcode 로 전달한다.

문제 해석

  • execve 를 제외한 다른 syscall 을 사용하여 flag 값을 구하는 것이 핵심이다.
  • flag 값의 위치는 /home/shell_basic/flag_name_is_loooooong 에 존재한다.
  • 이는 문제에서 요구하는 바는 execve 계열 syscall 말고 open, read, write syscall 을 활용하여 flag 값을 읽도록 한다.

익스플로잇

pwntools 방법 (shellcraft)

  • 주소와 포트를 사용해서 원격 서버를 열어준다.
  • x64 아키텍쳐(바이너리)를 사용한다.
  • 플래그가 있는 경로를 flagname 에 문자열로 대입한다.
  • 쉘 코드를 작성한다.
  • 어셈블 된 코드를 입력해준다.

flagname 에 문자열로 대입하는 이유는 shellcraft에서 바꿔주기 때문이다.

  • fd 가 rax 인 이유는 open 의 함수 반환 값이 rax 에 저장되기 때문이다.
  • 1 은 stdout 표준 출력을 의미한다.
저작자표시 비영리 동일조건 (새창열림)

'Pwnable > Dreamhack' 카테고리의 다른 글

[Dreamhack] Return to Shellcode  (0) 2023.08.25
[Dreamhack] basic_exploitation_000  (0) 2023.08.24
[Dreamhack] basic_exploitation_001  (0) 2023.08.24
[Dreamhack] Return Address Overwrite  (0) 2023.07.21
'Pwnable/Dreamhack' 카테고리의 다른 글
  • [Dreamhack] Return to Shellcode
  • [Dreamhack] basic_exploitation_000
  • [Dreamhack] basic_exploitation_001
  • [Dreamhack] Return Address Overwrite
배움이 머무는 곳
배움이 머무는 곳
  • 배움이 머무는 곳
    wlgus
    배움이 머무는 곳
  • 전체
    오늘
    어제
    • 분류 전체보기 (68) N
      • 이것저것.zip (7)
      • CVE (6)
      • CTF (2)
      • Wargame (23) N
      • Webhacking (19)
        • WebGoat (2)
        • Dreamhack (15)
      • Web (5)
      • Pwnable (5)
        • Dreamhack (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • hELLO· Designed By정상우.v4.10.5
배움이 머무는 곳
[Dreamhack] shell_basic
상단으로

티스토리툴바