Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

View file
nameangry_doraemon_c927b1681064f78612ce78f6b93c14d9
height250

CODEGATE2014 prequals - angry doraemon

nc를 사용해 문제 서버를 접속하면 위와 같은 화면을 확인 할 수 있습니다.

1~6까지의 메뉴를 이용해서 doraemon의 H.P를 0으로 낮추면 자동으로 종료가 됩니다.

문제에는 CANARY,NX가 걸려있습니다.

angry_doraemon파일을 IDA로 확인해보면 프로그램의 4번 메뉴(Throw mouse)에서 스택오버플로우 취약점이 있는 것을 확인 할 수 있습니다.

Throw mouse의 함수부분입니다. read(fd, &buf, 0x6Eu) 에서 buf의 크기는 4바이트인데 110바이트 입력을 받으면서 오버플로우가 발생합니다.

canary가 설정되어 있지만 현재 바이너리에 걸려있는 canary는 fork() 시 발생하는 아래의 특성 때문에 취약점이 존재합니다.

  1. fork() 하는 경우 canary도 parent의 것을 그대로 복사해 가져오기 때문에 항상 동일한 값을 가진다.

      2. 프로세스 내 모든 함수에서 canary로 사용하는 값은 같으며, 어느 함수에서든 canary를 알아내기만 하면 된다.

      3. canary의 하위 1byte는 0x00으로 고정이다.

sprintf(s, "You choose '%s'!\n', &buf) 부분에서 information disclosure를 할 수 있고 buf와 canary가 저장되는 변수인 v8 의 사이를 메꾸기 위해서 (buf)0x16 - (v8)0xc = 10에

canary의 가장 낮은바이트는 항상 null 이므로 첫글자가 y인 11글자를 입력하면 canary 값을 알아 낼 수 있습니다.