반응형

 

Write-up 쓴 날짜 : 2022-06-17 14:35

 

tots4youreverseMe1.exe
0.01MB
keyfile.dat
0.00MB

 

 

프로그램을 실행하면 위와 같이 “Evaluation period out of date. Purchase new license” 문자열이 뜨고 확인 버튼을 누르면 종료된다.

 

주제 - Olly + assembler + patching a basic reverseme


분석

 

 

위 사진은 EP 부분이다.

 

GetModuleHandleA API로 모듈을 불러오고 LoadIconA API와 LoadCursorA API를 호출한다.

 

 

그리고 CreateFileA API를 호출하는데 인자로 keyfile.dat 이라는 문자열이 넘어간다.

 

그리고 CreateFileA API의 반환값과 FFFFFFFF를 비교하여 일치하지 않으면 40109A로 jump 하고 일치하면 Evaluation period out of date. Purchase new license 문구를 띄우고 종료한다.

 

참고)

16진수 FFFFFFFF는 10진수 -1이다.

즉, 위의 CreateFileA API의 반환값이 FFFFFFFF 이라는 것은 -1이 반환되었다는 것이고, 이는 파일을 생성하는 데에 실패한 것이다.

 

즉, keyfile.dat 파일이 tots4youreverseMe1 파일과 동일한 위치에 있어야 한다.

(keyfile.dat 파일이 있어야 CreateFileA API 반환값이 -1이 아닌 값이 되고, cmp eax, FFFFFFFF의 결과가 0이 아닌 값이 되어 jne 명령이 실행됨으로써 40109A 주소로 간다.)

 

 

40109A 주소로 가면 ReadFile API를 호출한다.

 

그리고 ReadFile API가 반환한 값이 들어있는 eax가 0인지 검사하여 0이 아니라면 4010B4 주소로 jump 하고, 0 이라면 4010F7 주소로 jump 한다.

 

 

4010F7 주소로 jump 하면 “Keyfile is not valid. Sorry.” 문구를 띄우고 종료한다.

 

그러므로 4010B4 주소로 점프하게 ReadFile API의 반환값이 0이 아니여야 한다.

 

 

4010B4 주소로 가면 ebx와 esi를 0으로 초기화 하고, 402173 주소에서 4byte를 읽은 값과 10h를 비교한다.

 

402173 주소에서 4byte를 읽은 값이 10h 보다 작으면 4010F7 주소로 점프하여 “Keyfile is not valid. Sorry.” 문구가 띄워지고, 10h 이상이면 40211A 주소에서 ebx의 값만큼 더한 값으로부터 1byte를 읽어 eax 레지스터의 1byte를 의미하는 al 레지스터에 저장한다.

 

 

그리고 al과 0h을 비교한 뒤 0h과 같으면 4010D3 주소로 점프하여 esi의 값이 8h인지 검사한 뒤 esi의 값이 8h보다 작으면 4010F7로 이동하여 “Keyfile is not valid. Sorry.” 문구가 띄워지고, esi의 값이 8h보다 이상이면 401205 주소로 점프하여 You really did it! Congratz !!! 문구를 띄운다.

 

만약 al과 0h을 비교한 뒤 0h과 같지 않으면, al과 47h('G')을 비교해서 같지 않으면 4010D0 주소로 점프하여 ebx의 값을 증가시키고, 4010C1 주소로 점프하여 40211A 주소에 증가한 ebx의 값을 더한 곳에서 1byte를 읽어 al에 담은 뒤 이전과 동일하게 al를 비교한다.

 

그렇다면 40211A는 파일에서 읽어온 문자열일 것이고, 해당 문자열에서 문자 하나하나와 0h과 47을 비교하는 것이다

 

1. 40211A 주소에 있는 문자열 중 ebx 번째에 해당하는 문자를 al에 넣는다.

2. al(문자)와 0h(을)를 비교한다.

3. al(문자)이 0h 이라면 esi의 값과 8h을 비교하고 esi가 8이라면 You really did it! Congratz !!! 문구를 띄운다.
4. 반면, al(문자)이 0h가 아니라면 al을 47h('G')과 비교한 뒤 47h이라면 esi와 ebx의 값을 1 증가한 다음 위의 1번으로 돌아가 반복하는데 47h('G')이 아니라면 ebx를 증가하고, 위의 1번으로 돌아가 반복한다.

 

즉, You really did it! Congratz !!! 문구가 띄워지게 하려면, 파일에 입력한 문자열의 문자들이 al에 담기고 이 al의 값이 G(47h)여야 esi가 증가하고 al의 값이 0h일 때 esi가 8까지 증가했다면 즉, 파일에서 가져온 문자열의 문자가 0h이고, G(47h)가 8번 반복되어 적혔었다면 반복문을 탈출해 성공했다는 메시지  창을 띄운다.

 


풀이

 

지금까지 분석한 결과를 정리하면

  1. keyfile.dat이라는 파일이 있어야 한다.
  2. keyfile.dat 파일의 크기는 10h(=16byte)이어야 한다.
  3. 16개 문자 중 G가 8개 이상이여야 하고, G가 8개 이상인 상태에서 다음 문자 값이 0h라면 더 이상 반복하여 검사하지 않고 반복문을 탈출하여 성공 메시지 창을 띄운다.

keyfile.dat 파일에 G 문자를 16개 입력하여 파일 크기를 맞추는 것까지는 가능하다.

 

하지만 8번째 까지는 G 문자이고, 9 번째 문자는 NULL 이어야 한다는 것은 불가능 한 것이 메모장 프로그램으로 NULL을 입력할 수는 없다.

 

그러므로 HxD를 이용해 keyfile.dat 파일을 열어 9번째 16진수 값을 00으로 수정하면 된다.

 

 

G를 16개 입력하고

 

 

tots4youreverseMe1 파일과 동일한 위치에 keyfile.dat 파일로 생성한 뒤

 

 

HxD로 keyfile.dat 파일의 9번째 값을 00(=NULL)로 바꾸고 저장한다.

 

 

그리고 tots4youreverseMe1를 실행하면 위와 같이 뜬다.

반응형

+ Recent posts