Jaeseo's Information Security Story

Codeengn Basic RCE 15번 문제 본문

Write UP/Codeengn - basic

Codeengn Basic RCE 15번 문제

Jaeseokim 2019. 12. 1. 16:21

Basic RCE L15

Name이 CodeEngn일때 Serial을 구하시오

일단 PE 분석을 하면서 시작합니다.

아무런 Packing이 안되어 있는 모습을 볼 수 있습니다.

이런식으로 Name과 Serial를 입력 하고 Check를 하는 프로그램입니다. 이제 IDA로 정적분석을 합니다.

일단 메인 함수로 추정되는 위치입니다.

void __noreturn start()
{
  int v0; // eax

  Sysinit::__linkproc__ InitExe(&dword_458990);
  sub_44119C(*off_45A58C);
  sub_440DD8(*off_45A58C, &str_CrackMe_1__UBC_[1]);
  // 프로그램에 대한 이름을 설정하는 항목으로 예상된다.
  TApplication::CreateForm(*off_45A58C, &cls_Unit1_TForm1, off_45A664);
  // 델파이를 이용하여 폼을 생성한다.
  TApplication::CreateForm(*off_45A58C, &cls_Unit2_TForm2, off_45A684);
  v0 = Forms::TApplication::Run((Forms::TApplication *)*off_45A58C);
  System::__linkproc__ Halt0(v0);
}

일단 델파이를 이용하여 프로그램을 제작하였다는 점을 확인 하였습니다. 이제 ALT + t를 이용해서 문자열을 검색 해봤습니다.

CODE:00458880 _str_You_cracked_the dd 0FFFFFFFFh           ; _top
CODE:00458880                                         ; DATA XREF: _TForm1_Button1Click+39↑o
CODE:00458880                 dd 85                   ; Len
CODE:00458880                 db 'You cracked the UBC CrackMe#1 ! Please send your solution to ubcr'; Text
CODE:00458880                 db 'ackers@hotmail.com !',0; Text
CODE:004588DE                 align 10h
CODE:004588E0 _str_CRACKED    dd 0FFFFFFFFh           ; _top

위와 같이 성공 했을때에 대한 문자열을 찾았고 _TForm1_Button1Click()함수에서 참조를 하고 있다는 것을 보았습니다. 이제 함수에 들어가 분석을 합니다.

int __fastcall TForm1_Button1Click(int a1)
{
  int v1; // ebx
  int v2; // edx
  unsigned int v4; // [esp-10h] [ebp-14h]
  void *v5; // [esp-8h] [ebp-Ch]
  int v6; // [esp+0h] [ebp-4h]
  int savedregs; // [esp+4h] [ebp+0h]

  v6 = 0;
  v1 = a1;
  v4 = __readfsdword(0);
  __writefsdword(0, (unsigned int)&v4);
  sub_458760();
  //여기서 dword_45B844에 대해 Serial를 생성하고 저장
  TControl::GetText(*(TControl **)(v1 + 720));
  if ( sub_407774(v6) == dword_45B844 ) //0x45B844에서 4byte를 읽어와 비교
  //위의 sub_407774(v6)는 serial 필드의 데이터를 가져오는 것 으로 보인다.
  {
    Dialogs::ShowMessage((Dialogs *)&str_You_cracked_the[1], v2);
    Controls::TControl::SetText(dword_45B83C, (const int)&str_CRACKED[1]);
  }
  else
  {
    Dialogs::ShowMessage((Dialogs *)&str_Try_Again__[1], v2);
  }
  __writefsdword(0, v4);
  v5 = &loc_45887B;
  return System::__linkproc__ LStrClr(&v6);
}

일단 분석을 해보니 dword_45B844의 값을 읽어 비교를 하는 작업을 하여 처리를 하는데 이때 X64DBG를 통해 동적으로 분석을 하여 Name이 CodeEngn일때의 0x45B844의 데이터를 살펴 봅니다!

이때 00006160이 저장되어 있는 걸 볼 수 있는데 10진수로 바꿔서 확인해봅니다. 그러면 24928 이러한 결과값이 나오는데 이걸 테스트 해보면 정상적으로 동작하는 것을 볼 수 있습니다.

AUTH:24928

'Write UP > Codeengn - basic' 카테고리의 다른 글

Codeengn Basic RCE 16번 문제  (0) 2019.12.03
Codeengn Basic RCE 14번 문제  (0) 2019.12.01
Codeengn Basic RCE 13번 문제  (0) 2019.11.30
Codeengn Basic RCE 12번 문제  (0) 2019.11.30
Codeengn Basic RCE 11번 문제  (0) 2019.11.30
Comments