문제풀이------------------------------------------------------------------------------------------------
접기
6번 문제 :
1. 출제의도 :
이문제를 낸 이유는
리버싱을 할때 선행 단계들을 무시한 채 ( 리버싱 수행단계 : http://dakuo.tistory.com/21 )
무작정 올리디버거에 넣고 보는 사람들에게 경고를 하기 위해서 출제했습니다.
(동적분석 없이 바로 정적분석으로 넘어가는)
2. 문제풀이 :
리버싱 수행단계에 의해서
1. 바이너리 분석을 해본다. HexWorkshop과 PEID 로 분석결과 별 특이점을 찾지 못했습니다.
2. 문자열과 API, DLL 분석을 해본다.
MSVCP80.dll 을 로딩하는걸로 봐서
비주얼 스튜디오 2005로 작성된 것 같습니다.
별다른 DLL을 로딩하지 않습니다. (별다른 API를 사용하지 않는다는 뜻도 됩니다.)
스트링스로 문자열을 뽑아봤습니다.
str.txt
밑에서부터 분석해보면
success
pause
fail
hoky~Uyzoickf
zkyy}exn$~r~
C:\Windows\System32
a0c2e76eb0df8c5a83dc6ab90c875231
과 같은 의심스러운 문자열이 보이는데 더 자세한 사항은 알수가 없네요.
3. 모니터링을 통한 파일, 레지스트리, 네트워크 패킷 분석을 한다.
파일몬이 없어지고 프로세스 모니터가 생겼습니다. (
http://dakuo.tistory.com/22 )
위와 같이 dakuo@.exe 는
C:\Windows\System32\password.txt 라는 파일을 Create 하며 Write 한 후 Close 합니다.
위의 경로의 파일을 열어보게 되면 답을 알수가 있습니다.
3. 문제소스
소스를 보시면 알겠지만 디버깅을 방지하기 위해 여러 방법을 사용했습니다.
TLS CallABack 기법을 사용하여 main 함수 호출전에 IsDebugger 를 사용하여 디버깅을 방지했고
문자열의 자체 암호화를 통해 분석을 어렵게 했습니다.
물론 디버거로도 충분히 풀리는 문제이기는 하나
전 "디버거 사용만이 리버싱의 전부가 아니다" 라는 말을 하고 싶었습니다.
프로그램의 흐름은
1. TLS CallBack 으로 IsDebugger 호출한다.
2. OPEN 클래스로 인코딩된 파일이름을 디코딩한 후 파일을 Create 하고
인코딩된 암호를 디코딩 하여 파일에 Write 하고 닫는다.
3. 사용자로부터 문자열을 입력받은 후 MD5 해쉬하여 암호의 MD5 값과 비교하여
맞으면 Success 를 틀리면 fail 을 출력한다.
dakuo@_main.cpp
md5.cpp
md5.h
접기