Can you restore the lost password?
Analysis
buf
의 첫 번째 문자가 null이면 strlen(buf)
가 0이 되어 buf[-1]
에 0이 들어가게 된다.
Exploitation
Bypass login
login()
에서 password
를 입력받을 때 flag
의 마지막 1바이트를 0으로 덮어쓸 수 있다 [1]. flag
의 길이가 0x20
바이트였다면 덮어쓴 이후에는 0x1f
바이트가 되고, 길이가 4의 배수가 아니면 base64로 decode할 수 없기 때문에 b64decode()
는 0을 반환한다 [2]. 그러면 b64cmp()
의 첫 번째 인자로 0이 들어간다 [3].
a1
이 0이면 b64cmp()
는 0을 반환하는데, login()
에서는 올바른 password
를 입력했다고 해석하게 된다.
Be root and get flag
Password를 변경할 때 flag
바로 앞에 있는 uid
를 0으로 덮어쓸 수 있다. 이후 password를 다시 restore하고 출력하여 플래그를 획득할 수 있다.
728x90