[리버싱] : KeyGen 풀이 - FSC Level 2
#REVERSINGF-secure Level 2 문제 풀이 기록
키젠 프로그램 다운로드는 여기
F-secure Level 2 문제이다. 레벨 1에 비해서는 약간 난이도가 상승했다.
원래 원본 파일은 UPX
패킹이 된 파일인데 원본 파일은 못구하고 UPX 언패킹된 파일만 구할 수 있었다.
사실 UPX 패킹은 upx -d
명령어로 너무 쉽게 언패킹 되므로 그냥 언패킹된 파일로 진행했다.
프로그램을 실행하면 메시지 박스 하나 띄워주는게 전부이다. 키를 입력하는 부분은 보이지도 않아 처음에 당황할 수 있다.
PEview로 IAT
를 보면 눈에 띄는 API 하나가 보인다. GetCommandLineA()
API이다.
해당 API의 역할을 알기 위해 MSDN문서를 확인해보자.
문서를 확인하고 나니 이 프로그램은 실행할 때 특정 파라미터를 지정해서 같이 실행해야 원하는 메시지를 출력하겠군을 짐작할 수 있었다.
파라미터를 지정하고 동적 분석을 하기 위해 이번엔 x32dbg
를 사용했다.
x32dbg의 하단 명렁어 입력창에 다음과 같이 입력하면 파라미터를 지정해서 프로그램을 실행할 수 있다. 나는 우선 "1234"를 파라미터로 넣었다.
init "실행 파일 경로", "파라미터"
우선 GetCommandLineA()를 사용하는 부분을 위주로 찾아보면 0x40117D 에서 API 호출 리턴 값을 eax에 넣는 부분이 나오고
0x4011C2 에서 내가 넣은 파라미터가 앞에 공백을 포함해서 [edx-5]에 들어 있는 것도 브레이크걸고 트레이싱하면 알 수 있었다. 그리고 얼마안가 정말 눈여겨볼 부분이 나오는데 0x4011EC 부분이다. [edx-4]는 앞에 공백을 제외한 내가 입력한 파라미터인데 이 파라미터를 eax에 넣고 xor eax,5528566D 를 한다. 내 파라미터와 특정 숫자와 xor 연산을 하는 것을 보면 키 값과 거의 무조건 관련이 있다.
0040123A cmp eax, dword ptr ss:[esp]
그리고 실패와 성공을 분기시킬 cmp문이 나온다.
[esp]에는 아까 연산한 xor eax,5528566D의 결과 값이 저장되어 있다.
eax에는 무슨 값이 들어 있나면 0x401227에서 나오는데 [edx-A]의 값을 넣는데 이 값은 파라미터가 4글자라면 ".exe"이다.
즉, 여기까지 오려면 일단 파라미터는 4글자이어야 하고 4글자가 아니라면 0x4011E1 부분에서 바로 실패 분기로 넘겨 버린다.
0x40123A 명령에서 알 수 있는 것은 성공 분기로 가려면
파라미터 xor 5528566D = .exe(6578652E)
의 등식이 성립하는 파라미터 값을 계산하면 된다는 것이다.
계산하는 방법은 간단하다 양 변에 xor 5528566D 을 추가하는 것이다. 그러면 좌변은 파라미터만 남게 되어
파라미터 = 6578652E XOR 5528566D 이 되고 계산기 돌리면 파라미터의 값은 30503343
이다.
30503343을 아스키코드로 변환하면 0P3C이고 이는 리틀 엔디언
방식이니 우리의 파라미터는 C3P0
가 되는 것이다.
C3P0를 파라미터로 실행하면 다음과 같은 성공 메시지 박스가 출력되어야 하는데 자꾸 안된다.
나름 이류를 분석해보니 0x4011F1 부분에서 xor ah, bh를 하는데 ebx가 0으로 설정되어 있으면 깔끔하게 나오지만 ebx에 값이 들어있으면 연산 결과가 흐트러진다. 그래서 임의적으로 ebx를 0으로 바꾸고 하니 잘 출력된다.