며칠 전입니다...

익명의 어느 분께서 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 가 발생할 수 있습니다. @_@;;;

한글 언어 파일 만드신 분이 번역을 조금 더 자연스럽게 하려고 하다가...

포맷스트링 부분은 미처 확인 못해서 이런 문제가 발생한게 아닌가 싶네요...

얼른 문제가 수정될 수 있길...