Description
Category: Pwnable
Source: TAMUctf 2019
Points: 463
Author: Jisoon Park(js00n.park)
Description:
nc pwn.tamuctf.com 4322
Difficulty: easy
Write-up
어떤 함수를 실행할건지 물어보고 입력값을 select_func() 함수로 넘긴다.
막상 select_func() 함수에서는 입력한 값이 "one" 인지 아닌지만 검사하는 것 같다.
stack 구조를 살펴보자.
내가 입력한 값을 dest로 최대 0x1f 바이트만큼 복사하는데, dest 버퍼의 크기는 0x1e 바이트이고 dest 버퍼 다음은 v3 변수이다. 즉, v3 변수의 첫번째 바이트를 변조할 수 있다.
v3 변수는 상황에 따라 one() 또는 two() 함수의 주소를 갖고 있게 되는데, 첫번째 바이트가 변조된다는 소리는 호출되는 주소값의 마지막 한 바이트를 바꿀 수 있다는 뜻이다. (little endian이니까)
그럼 v3 변수가 default 값인 two 함수 주소를 갖고 있을 때 마지막 바이트를 변조해서 호출할 수 있는 곳에 뭐가 있는지 살펴보자. 너무 뻔하게도, print_flag() 라는 함수가 6D8 번지에 존재한다.
v3 변수의 첫번째 바이트를 D8로 변조하는 exploit을 작성하여 실행해보니 flag를 얻을 수 있었다.
Flag : gigem{4ll_17_74k35_15_0n3}