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();
}
|
cs |
- main 함수에서 shellcode 를 stdin 에서 읽고 실행한다.
- 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 |