며칠 전입니다...
익명의 어느 분께서 x64dbg 로 crackme 실행파일을 열면 Crash 가 발생한다며...
혹시 그 이유를 아는지 블로그 댓글로 질문을 하셨습니다.
( 참고 - http://www.xeronichs.com/2016/11/attach-helper-x64dbg-plugin.html )
같은 OS 환경인데도 제 PC 에서는 별다른 문제가 없었기에...
플러그인 문제나 다른 외부 프로그램과 충돌이 아닐까~ 추측만 하고 넘어갔었습니다...
이번에 다른 분께서 동일한 문제가 발생한다며 댓글을 남기셨고...
그 분 나름대로 문제가 발생하는 부분까지 찾아내셨습니다... @_@ ;;;
11월 5일 2번째 릴리즈(snapshot_2016-11-05_19-55.zip) 이후로 언어를 '한글' 로 설정하면...
실행파일을 불러올 때 Crash 가 발생한다고 하시더군요.
저는 x64dbg 언어 설정을 처음부터 "영어" 로 맞춰두고 사용을 하다보니 문제가 발생하지 않았던거구요.. ^^;;
확인 차 언어 설정을 '한글' 로 잠깐 바꿔봤더니 Crash 가 발생하더군요... oTL;;;
언어 설정 "한글" 로 하면 파일을 열 때 Crash 발생 |
조금 더 정확하게 설명하면 x64dbg -> Settings 에서 Events 탭에...
"Entry Breakpoint*" 가 체크가 되어있을 때 Crash 가 발생합니다...
"System Breakpoint*" 를 체크하고 "Entry Breakpoint*" 를 체크하지 않으면 실행이 잘 되더군요..;;
한글 언어 적용 후, "Entry Breakpoint*" 체크 시 Crash 발생 |
언어 설정을 '영어' 로 하면 문제가 없고, '한글' 로 하면 Crash 발생하는 건...
언어 파일 자체에 뭔가 문제가 있다고 볼 수 있겠죠...
실제로 Crash 문제가 발생하기 시작한 11월 5일 두번째 릴리즈의 한글 언어 파일과...
문제가 발생하지 않는 한글 언어 파일을 비교하면 파일 크기 차이가 꽤 납니다... ;;;
왼쪽은 Crash 발생하지 않는 버전, 오른쪽은 Crash 발생하는 버전 |
한글 언어 파일에 내용이 추가되면서 뭔가 문제가 생긴 것 같아서 그 부분을 분석해봤습니다.
디버거 UI 에 언어 파일을 적용해주는 함수 |
위의 함수에서 "GuiTranslateText" 함수를 이용해 현재 적용된 언어 파일의 내용을 구해오도록 되어 있더군요.
Crash 발생하는 원본 문자열 |
분석한 결과 "%s breakpoint "%s" at %s (%p)!" 라는 문자열을 한글로 출력하려고 할 때...
Crash 가 발생했습니다.
포맷스트링 %s, %s, %s, %p 가 사용되고 이에 대한 실제 값은 ESI(0xA19DCE8)에 있습니다.
포맷스트링 실제 값 |
첫번째 %s = "INT3" 두번째 %s = "entry breakpoint" 세번째 %s = "<asmjit.EntryPoint>" 네번째 %p = 0x5801EA22 |
언어 설정이 '영어' 일 때 아래와 같은 문자열이 완성됩니다.
INT3 breakpoint "entry breakpoint" at <asmjit.EntryPoint> (5801EA22)!
언어 설정이 '한글' 인 경우에는...
"%s breakpoint "%s" at %s (%p)!" 문자열이 아래와 같이 변경됩니다.
한글 적용 시 변경된 문자열 |
한글로는 "%s (%p) 에 %s 중단점 "%s"!" 라는 내용이 됩니다. ( oTL;;;; )
원래 포맷스트링의 순서는 %s, %s, %s, %p 인데...
한글 언어 파일의 내용에는 %s, %p, %s, %s 로 되어있네요.. @_@..!?!?
이 내용이 "_vsnprintf_s" 함수로 들어가면~
마지막 %s 가 엉뚱한 곳에서 문자열을 가져오려고 하다가 실패하고 Crash 가 딱~!!;;
엉뚱한 곳에서 문자열을 찾으려고 함 |
이 부분이 정상적으로 동작하려면 한글 언어 파일의 포맷스트링도 %s, %s, %s, %p 의 순서로 되어야 됩니다.
일단 제가 확인한 부분은 이 부분인데 다른 부분도 포맷스트링 순서가 일치하지 않을 경우...
얼마든지 Crash 가 발생할 수 있습니다. @_@;;;
한글 언어 파일 만드신 분이 번역을 조금 더 자연스럽게 하려고 하다가...
포맷스트링 부분은 미처 확인 못해서 이런 문제가 발생한게 아닌가 싶네요...
얼른 문제가 수정될 수 있길...
바로 분석하셨군요.
답글삭제새벽시간이었을텐데...덕분에 좋은 공부했습니다.
고맙습니다.
덕분에 저도 재밌게 봤습니다 :)
삭제그러네요.. 감사합니다. 수정하겠습니다 아마..
답글삭제내일쯤 나오는 릴리즈에는 수정될겁니다.
스트링 순서에 따라서 발생하는 문제가 더 있나 살펴봐야겠네요.
정말 감사합니다!
파이팅 ~ !! :)
삭제