또 갑자기 공부가 안되는 시기인건지... 아무것도 손에 안잡히는 군요.. 이럴땐 책을 보는게 최선인거 같습니다.
그래서 WinDbg 책을 폈는데.. 괜찮은 내용인거 같아서 바로정리.. ^^;
===========================================================================
이번에 알아볼 내용은 GFlags를 사용해 힙 영역에서 발생할 수 있는 문제점을 탐지해 내는 방법입니다.
간단한 툴 소개가 될꺼같으니.. 짤막하게 하겠습니다.
일단 문제가 되는 소스코드를 보시겠습니다.
소스코드를 보시면 7번째 줄에서 malloc을 사용해 힙 영역에 메모리를 할당 받고 있습니다.
그리고 14번째 줄에서 할당받았던 메모리를 해제해 주고 있습니다.
그런데 16번째 줄에서 해제한 메모리에 값을 쓰고 있습니다.
이건 분명 문제가 있는 코드입니다. 해제한 힙 영역에 데이터를 쓴다는 것은 지금 당장은 문제가 되지 않지만 계속 프로그램을 사용하다보면 언젠간 문제가 생길것 입니다.
일단 코드 실행을 해보겠습니다.
정상적으로 종료가 되며 오류창이 뜨거나하는 그런 현상도 나타나질 않습니다.
아마 이대로 배포를 하게 된다면.. 언제일진 몰라도 문제가 발생하겠죠.
이제 GFlags라는 툴을 사용해 이러한 잠재적인 취약점을 탐지해보도록 하겠습니다.
해당 툴은 WinDbg를 설치하게 되면 같은 폴더에 존재합니다. MS에서 무료배포 해주는 것이지요.
이제 툴을 켜줍니다.
세번째 Image File이라는 탭으로 오게되면 위와같은 화면이 나오게 됩니다.
두개 빼곤 전부 비활성화된 상태인데 Image에 실행파일 명을 쳐주고 탭을 누르면 활성화 되게 됩니다.
먼저 전 gflags.exe 있는 폴더에 테스트해볼 프로그램(위 소스를 컴파일해서 만든 실행파일..)을 넣어두고 실행파일 명을 치고 Tab을 눌렀습니다.
Enable page heap부분에 체크를 해주셔야합니다.
저 부분을 체크해주면 할당한 버퍼보다 더 많이 쓰려고 하거나 해제한 메모리를 재사용하려는 부분은 감지할수 있습니다.
그냥 실행시켰을 때는 아무런 문제가 발생하지 않는데 gflags를 사용해 실행시켰을 경우 오류가 날것입니다.
저 같은 경우는 오류가 날 경우 바로 WinDbg로 연결되도록 해놓았기 때문에 오류창은 안뜰것입니다.
이제 저 상태에서 Launch를 누르게 되면 프로그램이 실행될 것입니다.
그 상태에서 진행해보겠습니다.
아까는 아무런 문제가 없던 프로그램이 갑자기 오류가 생기면서 디버거에 연결됬습니다.
파일을 보니 Malloc.exe 네요. 오류발생 원인은 잘못된 메모리에 접근을 한거 같습니다.
일단 해당 어셈코드를 보니 0x01600f98에 접근을 못하고 있는건데.. 이 내용을 보고는 일단 문제가 있다는 것은 알수있는데
무엇때문인지는 알 수 없습니다. 그래서 해당 메모리의 특성을 봐보도록 하겠습니다.
명령어는 !address를 사용해도 되고 !vprot를 사용해도 됩니다. 전 !vprot를 사용했습니다.
보호상태를 보니 페이지에 접근할 수 없는 상태입니다. 즉, 메모리가 해제된 곳이라는 것을 알 수 있습니다.
결론은 GFlags를 사용해 자기가 만든 프로그램을 배포전에 한번쯤 테스트를 해보는 것도 좋은 습관일꺼 같습니다.
'My Study > Programming&Theory' 카테고리의 다른 글
Thread Injection ( Code Injection ) (4) | 2010.06.14 |
---|---|
BSOD에러 창 띄우기 (2) | 2010.06.04 |
대부분 바이러스들이 사용하는 DLL Drop~! (2) | 2010.05.28 |
소켓 프로그래밍을 이용한 파일 전송 (3) | 2010.05.19 |
알약 프로세스 죽이기 (10) | 2010.05.07 |