버퍼 오버플로우 검사

 | C, C++
2009.11.08 22:15

버퍼 오버플로우 검사




에효... 얼마전에 초난감 삽질로 반나절을 날렸습니다.
계속 변수들이 값이 바뀌고 애매한 위치에서 익셉션이 나고 난리길래
오만 삽질 디버깅 끝에 아래 코드가 문제라는 것을 알았습니다...;



4개짜리 배열 변수에다가 루프를 8번 돌아서 값을 입력하려고 했으니 -_-;
에혀... 봐도 너무 한심하네요...

저희쪽 코드가 워낙 하드코딩을 일삼는 짓이 많다보니... 뭐 copy & paste 의 폐해이자 동시에,
일차적인 원인도 저런 코드를 만든 저 자신에게 있지만 그래도 이런건 컴파일러에서 좀 잡아줫으면
좋겠구만... 하는 생각이 막 앞서네요 (반나절을 날린 댓가를 누군가에게 보상받고 싶은 마음일지도)

제가 아직 6.0 컴파일러를 사용해서 노망난 컴파일러에게 저런 것 까지 기대하는 것은
무리인 것일까 하는 마음에 2003 으로 한번 테스트를 해봤습니다.
VS 2003 이상에서는 아시다 시피 저런 옵션이 있죠.






그리고 빌드를 해봤습니다......결과는 !!!!!



















뭐.... 마찬가지네요...
저한테 VS 2008 은 없어서, 옆에 앉은 넘에게 한번 시켜봤는데
VS 2008 역시 역시 결과는 마찬가지 였습니다.

컴파일러가 체크해 주는 BOF 의 기준은 어디까지일까 하는 생각을 갖게 하네요.
파고들어 보고 싶지만 아으 이걸로 (이렇게 멍청하게도)시간을 날려보니까 웬지 더이상
건드리기 싫다는 생각도 듭니다 :p

혹시 알고 계신 분은 공유해 주세요 ~



window31.




신고
Posted by window31


댓글을 달아주세요

  1. 2009.11.08 23:28 신고
    댓글 주소 수정/삭제 댓글
    Visual Studio 2005의 Code Analysis 기능
    http://eslife.tistory.com/entry/Visual-Studio-2005%EC%9D%98-Code-Analysis-%EA%B8%B0%EB%8A%A5
    를 써 보면 어떨까요?
    저희는 CI 툴에 연동해서 쓰고 있는데, 도움 많이 받고 있습니다. :)
    • 2009.11.13 20:19 신고
      댓글 주소 수정/삭제
      아 2005는 이런 좋은게 있었군요...
      2003에는 없네요 ㅠ ㅠ 좋은정보 감사합니다 !
  2. 2009.11.09 04:33 신고
    댓글 주소 수정/삭제 댓글
    먼저 저 컴파일러 옵션에 있는 /GS는 static analysis, 즉 컴파일할 때 버퍼 오버런을 알려주는 기능이 아닙니다. /GS는 런타임시에 스택 오버플로우가 감지되면(힙 오버플로우는 아니고요) assertion을 띄어주는 것입니다. 아마 이 옵션을 켜고 실제로 실행하면 assertion이 걸릴 것 같은데요. 감지하는 방식은 아마 canary value를 써서 하는 것일 겁니다.

    원하시는 것은 위에 박피디 말씀처럼 static analysis로도 알 수 있습니다.
    http://msdn.microsoft.com/en-us/library/ms182025.aspx

    올려 놓으신 경우는 정적 분석으로는 아주 간단하게 잡을 수 있는 경우입니다. 포인터도 없고 루프 바운드도 상수이고 하니 아주 간단하죠. 학부생들에게 숙제로 내도 될 정도로 쉽습니다 ㅎㅎ

    (웬만하시면 그냥 영문 VC++을 쓰실 것을 강력히 권장합니다. 그래야 해당 컴파일러 옵션이나 에러 코드를 보고 쉽게 구글링할 수 있습니다. 버퍼 보안 검사... 구조체 멤버 맞춤... 작은 형식 검사??)
    • 2009.11.13 20:16 신고
      댓글 주소 수정/삭제
      보안모듈은 더러운 상황이 많아서 상위 컴파일러로 함부로 포팅할 수 없는 난관이 많습니다.
      그래서 아직 울며 겨자먹기로 6.0 을 사용하고 있고요, 2003은 sln로 된 프로젝트 줏어와서
      빌드하는 용으로만 사용하기 때문에 별로 영문 컴파일러에 대한 필요성을 못느낍니다. 그냥
      가끔 그러시는 분들은 계십니다 "쪼팔리게 한글판 쓰냐?" 별로 개의치 않습니다 ㅎㅎ
      물론 6.0 은 영문판 아니면 메뉴 선택조차 제대로 못 하겠지만요 ㅎㅎ (근데 6.0도 한글판이 있나요?)
  3. 2009.11.09 09:43 신고
    댓글 주소 수정/삭제 댓글
    저 기능은... 지정한 버퍼 뒤에 추가로 버퍼를 할당해놓고 특정 값을 memset해놓았다가, 실행후 그 "특정 값"이 변경되었는지 검사하여 버퍼오버플로우를 체크하는 기능이라고 알고 있습니다. 말하자면... 런타임에 체크해주는 기능이란 얘기죠. 김민장님께서 잘 설명해주셨네요. ^^
    • 2009.11.13 20:17 신고
      댓글 주소 수정/삭제
      아하 그렇군요~
      이름 때문에 헷갈렸어요-_-; 설명 감사합니다~! 하나 배웟네요 : )
  4. 2009.11.16 16:54 신고
    댓글 주소 수정/삭제 댓글
    http://blogs.msdn.com/vcblog/archive/2009/03/19/gs.aspx

    혹시나 도움이 되실지...

    From Zeratul
  5. kernel0
    2009.11.23 03:15 신고
    댓글 주소 수정/삭제 댓글
    ParkPD님이 써놓은 CodeAnalysis 뿐만이 아니라 외부툴인 pc-lint 라는 정적 체크툴이 있는데요. 그걸 쓰시면 플랫폼 교환없이 찾아내실 수 있겠네요. 가격은...30만원정도?

BLOG main image
by window31

카테고리

분류 전체보기 (285)
Reverse Engineering (22)
C, C++ (20)
Kernel (8)
Guitar (19)
잡담 (79)
etc (8)
who am i (8)
보안 이야기 (89)
Tools (3)
월간 마이크로소프트웨어/그.. (28)

글 보관함