[해커스쿨][F.T.Z]

1. 문제 분석

  • C언어를 알아야 합니다.

  • BOF 공격

2. 기본 아이디어

  1. buf의 용량을 초과하여 buf2의 용량에 들어갑니다.

  2. buf2의 처음 두 글자는 go일 수 있습니다.


3. 문제 해결

주어진 힌트는 다음과 같습니다.


fgets를 통해 sdin을 통해 최대 40자를 얻습니다.

즉, buf에 대한 입력입니다.

그러나 buf의 용량은 10자입니다.

따라서 수신된 문자 수가 제한을 초과하면 버퍼 오버플로가 발생합니다.

처음에는 10글자만 입력하면 해결되더니 입력을 시작하니,

정확한 답을 구글링해보니 미묘한 차이가 있었다.

좀 더 구체적으로, buf와 buf2 사이에 얼마나 많은 바이트가 다릅니까?

gdb로 디스어셈블하면 다음과 같습니다.


main+43과 main+55로 eax에 할당된 값을 보면 16바이트 차이가 나는 것을 알 수 있다.

(lea는 지정된 주소 값을 가져오라는 명령어이므로 buf와 buf2에 저장된 연산으로 해석되는 것 같습니다.

)

따라서 모든 문자의 16자를 패딩한 후(char는 C 언어에서 1바이트이기 때문에)

글을 쓰면 문제가 해결됩니다.

이렇게 해서 레벨 10 비밀번호를 얻었습니다.