본문 바로가기

My Study/Reversing

Visual Studio의 Security Cookie 코드 변화

Visual Studio 2003부터 버퍼오버플로우를 대비하기 위해 새로 생긴 기능입니다.
보통은 디폴트로 예로 되어있을 것입니다. 버퍼보안검사 기능이 컴파일 시 어떤 코드를 넣는지 한번 간략하게 봐보겠습니다.
제가 컴파일 시킬 코드입니다.

너무 간단하군요. 올리디버거로 코드를 봐보겠습니다.
printf함수를 사용하기 위해서 4개의 값이 PUSH되고 있습니다.
하지만 가장 윗 줄을 보시면 " MOV ESI,ESP " 라는 명령어가 있습니다.
현재 스택 포인터를 ESI레지스터에 넣어주고 있네요. ESI는 함수 호출 전(인자 값 넣기 전) ESP의 값을 가지고 있겠습니다.
이제 printf함수가 끝나고 __cdecl방식이므로 함수 밖에서 스택을 정리해 주고 있네요.
그 아래 2줄은 무엇일까요?? 분명히 전 하나의 함수밖에 쓰지 않았습니다.

보통 함수가 끝나면 스택을 정리해 주면서 함수를 호출하기 전 상태로 돌아가야 합니다.
즉 ESP값이 함수 호출 전과 호출 후가 같겠죠. 아까 함수 호출 전에 ESP값을 ESI에 넣었습니다.
즉 아래에서 2번째 줄은 이렇습니다.
" 함수 호출 전 ESP값과 함수 호출 후의 ESP값을 비교하는 것 "
같거나 다르겠죠?? 정상적이라면 아마 같을 것 입니다. 그 아래 함수는 무엇일까요??
다들 예상 하셨겠지만.. 만약 비교 결과가 다르다면 .. 들어가는 루틴 입니다. 해당 함수 내부를 봐보겠습니다.

첫줄을 보니 JNZ가 나오네요 ^^. 아까 그 비교결과가 같다면 점프를 하지 않고 바로 RETN하고 함수를 빠져나옵니다.
하지만 다르다면?! 3번째 줄로 가면서 어떠한 작업을 시작하겠죠.
" PUSH EBP "로 강제 점프를 시킨 후 F9로 실행을 시켜보았습니다.

아주 익숙한 창이 나왔네요 ^^ 프로그래밍 하면서 배열 크기보다 크게 넣었을 경우.. 등등 이러한 에러창을 볼 수 있죠.
런타임 에러로 ESP값이 올바르지 않다고 하네요. 뭐.. 오버플로 났다고 생각하시면 편할 것입니다.

결론을 내보면 Security Cookie라는 것은 Visual Studio 2003부터 새로 생긴 기능이며.. 스택을 보호하기 위해서 컴파일 시 자동으로 코드를 생성해 준다는 것입니다.

(잘못된 내용이 있으면 지적해주세요 ^^)