본문 바로가기

Security/Pwnable

[Pwnable] dreamhack basic_exploitation_000 문제 풀이

먼저 문제를 살펴보면 아무런 보호기법이 없다는 것을 확인 할 수 있고 canary와 같은 까다로운 보호기법을 생각하지 않아도 된다는 정보를 얻고 시작한다.

 

소스코드를 살펴보면 다음과 같은데 일단 main 안쪽부터 살펴보면 buf가 0x80이란 크기로 할당 되어 있고 initialize 함수 실행 후 printf를 이용해 현재 buf의 주소값을 프린트한 후 scanf를 이용해 buf에 최대 141바이트까지 입력 받는다는 것을 알 수 있다. 여기서 주목 해야 할 점은 buf 의 크기가 0x80, 즉 128 바이트이지만 scanf 로 받는 최대 바이트의 크기는 141 바이트라는 점이다. 이점을 이용해 bof 를 발생 시킬 수 있다는 점이 이 문제의 핵심 포인트이다.

 

추가로 다른 initialize 와 alarm 함수들을 살펴 보았지만 크게 시스템에 영향을 끼칠 정도의 함수들이 아닌거 같아 무시하고 진행 하겠다.

 

코드는 위와 같이 만들었고 26 바이트짜리 크기의 쉘 코드를 사용했다. Buf 를 recvuntil 를 이용해 (까지 받았고 recv 를 이용해 10 진수를 16 진수로 해석했다. Recvline 을 이용해 한 줄을 받아 올 수 있도록 했고 26 바이트짜리 쉘 코드를 실행 하면서 a 를 총 20, 86 번으로 총 106 번 입력해 bof 가 일어날 수 있을 만큼 scanf 를 실행 시켜 buf 의 크기를 넘어 서게 했다.