Who is the strongest puncher?
Analysis
buf
에 0x2c
바이트가 채워져 있을 경우 score
까지 strlen()
에 포함되어 buffer overflow가 발생할 수 있다.
버그를 발생시키기 위해서는 rand()
의 return value를 맞춰야 한다.
Saitama를 선택하면 game_t
에 1바이트 랜덤 값이 들어가고 이 값이 srand()
의 인자로 전달된다. 1바이트는 충분히 브루트포싱이 가능하기 때문에 이후 rand()
의 return value들을 모두 예측할 수 있다.
Exploitation
score
를 한 번 증가시키면 0x01
이 되고, BOF를 이용하여 0xff
로 덮어쓴 후 다시 두 번 증가시키면 0x0101
이 된다. 이 과정을 반복하면 score
에 null byte가 없도록 만들 수 있다.
그러면 마지막에 buf
를 출력할 때 뒤쪽의 score
와 flag
까지 이어서 출력하게 된다.
728x90