DDDDigtal 4ensics

레나 튜토리얼 - 03 풀이 본문

Reversing

레나 튜토리얼 - 03 풀이

Dx4 2024. 2. 12. 17:48

 이번 문제 풀이는 2개의 메시지박스( [이미지 1], [이미지 3] )를 삭제하는 미션이다.

[이미지 1]
[이미지 2]
[이미지 3]

 

 기드라로 문제 를 연다면, [이미지 4]와 같이 나올 것 이며, 해당 프로그램의 메인 코드는 다음과 같다.

[이미지 4]

void entry(void)

{
  UINT uExitCode;
  
  DAT_0040311c = GetModuleHandleA((LPCSTR)0x0);
  if (DAT_0040311c != (HMODULE)0x0) {
    MessageBoxA((HWND)0x0,s_Remove_the_nags_to_register_This_00403034,s_Register_Me_0040307d,0);
  }
  FUN_00401052(DAT_0040311c);
  uExitCode = MessageBoxA((HWND)0x0,s_Oops!_I_am_not_registered_!!_00403089,s_Register_Me_0040307d,0
                         );
                    /* WARNING: Subroutine does not return */
  ExitProcess(uExitCode);
}

 

 이번 문제는 파일의 코드 패치를 요구하는 문제이다. 올리디버거, dbgx64와 같은 툴 보다 기드라라는 나도 익숙하지 않은 툴을 쓴다는게 조금 불편했던 그런 문제이다.

 

일단 GetModuleHandleA를 이용하여 파일의 핸들을 가져온다. 성공할 시 [이미지 1]의 메세지 박스를 띄운다. 이 코드는 [이미지 5]와 같은 어셈브리로 나타나는데, 이 때 JZ(0일 경우 점프)를 JMP(무조건 점프)로 패치하면 삭제할 수 있다.

기드라에서 코드 패치는 Ctrl + Shift + G로 할 수 있다.

[이미지 5]

 

 [이미지 6]과 같이 파일의 JZ를 JMP로 수정함으로 써, 해당 메세지박스의 호출을 피할 수 있다.

[이미지 6]

 

후 [이미지 7]과 같이 코드 브라우저가 수정된 것을 볼 수 있는데, 이제 uExitCode에 대하여 코드를 수정해야한다. 이는 

[이미지 7]

 

[이미지 8]의 영역을 NOP처리함으로 써, 해당 메시지 박스를 지울 수 있다.

[이미지 8]

 

 

후 file export를 하면 원하는 결과를 얻을 수 있다.