
카나리 말고는 다 있다.





prob2는 함수가 참 많다. 그래서 처음엔 약간 복잡해 보였지만, 정리해보니 다음과 같았다.

case1에서는 s라는 배열에 입력을 하고 이를 출력해준다.
case2에서는 특정 인덱스에 입력을 해준다.
기본 while문에서는 특정 인덱스의 값을 출력해준다.
원래라면 인덱스를 입력하는 부분에 취약점이 있어서 다른 부분까지 읽어볼 수 있었는데, 이번에는 pr3함수에서 보듯 0~31으로만 인덱스가 구성되게 해놓았다. 따라서 다른 부분을 읽거나 쓰는 것이 불가능해보였다.
추가로 pr4함수에서도 scanf에 %80s로 입력을 받아서 puts에서 leak이 불가능했다..

0x90으로 s를 채웠지만, 마지막에 00이 쓰여서 뒤에까지 leak이 불가능했다.
즉 내가 입력할 수 있는 부분은 v3 배열 내부와 s 배열 내부 뿐인데, 이것만 가지고 어떻게 해야할 지 감이 안 잡힌다.
그래도 몇가지 생각해본 것이 있는데,
- v3의 포인터가 v3 배열의 위치를 가리키고 있으므로, 포인터에 저장된 값을 바꾼다면 v3 주변 부분을 읽어올 수 있을 것이다.
- pr1의 인자로 32가 전달되는데, 이 수를 다른 수로 바꿀 수 있다면 다른 영역까지 읽어오고 입력으로 덮을 수 있을 것이다.
이렇게 생각은 했는데, 문제는 v3의 포인터와 32가 저장된 곳을 건드릴 방법이 보이지 않는다..