→ Nuit Du Hack (NdH2k11) - RCE100

| No TrackBacks
File: rce100.zip
Задание представляет из себя Win32 PE бинарный файл запакованный простеньким пакетом. Сперва распаковываем подручными средствами или снимаем дамп, восстанавливаем импорт. Я использовал IDA Universal PE unpacker и IDAStealth, кто-то использует свои любимые средства.
Первым делом в распакованном бинарнике смотрим строки и API вызовы. Вскоре находим функцию которая вызывает RegisterClassExA - это sub_403260. Вот примеры её вызовов:
  sub_403260("CWindow", CWindow_WindowProc, 0x7F00);
  sub_403260("CImage", CImage_WindowProc, 0x7F00);
  sub_403260("CEdit",  CEdit_WindowProc, 0x7F00);
  sub_403260("CButton", CButton_WindowProc, 0x7F89);
Окей уже неплохо, а теперь посмотрим граф вызовов и его же но с переименованными функциями:
rce100-1.png rce100-2.png

Код функции WinMain:
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
  HRSRC v4; // eax@1
  HWND v5; // esi@1
  HRSRC v6; // eax@1
  int v7; // eax@1
  HRSRC v8; // eax@1
  int v9; // eax@1
  int v10; // esi@1

  sub_401000(hInstance);
  sub_401080(0, 0x101010u, 0x999999u);
  v4 = sub_402CB0(0x73u);
  v5 = NewWindows(0, 10, 10, 1, v4, -1, "test", sub_41ED20, 0);
  v6 = sub_402CB0(0x75u);
  v7 = sub_401BA0(v6);
  CreateCImage(v5, 220, 180, 4, v7);
  v8 = sub_402CB0(0x74u);
  v9 = sub_401BA0(v8);
  CreateCImage(v5, 220, 190, 3, v9);
  sub_403580(4);
  sub_403580(3);
  CreateCEdit(v5, 390, 240, 200, 20, 2, 2);
  NewButton(v5, 405, 270, 80, 20, 100, "Login", 10);
  NewButton(v5, 495, 270, 80, 20, 101, "Quit", 10);
  sub_403750(100, 1, 50);
  sub_403750(101, 1, 50);
  sub_403550(1);
  sub_403870(1, 128);
  v10 = sub_4010B0();
  sub_4010F0();
  return v10;
}

Замечаем
v5 = NewWindows(0, 10, 10, 1, v4, -1, "test", sub_41ED20, 0);

sub_41ED20 - это оконная процедура, которая дальше вызывает функцию sub_41ECB0

int __cdecl sub_41ECB0()
{
  signed int v1; // [sp+0h] [bp-20Ch]@2
  char v2; // [sp+4h] [bp-208h]@1
  unsigned int v3; // [sp+208h] [bp-4h]@1

  v3 = &v2 ^ dword_4228B4;

  GetCEditString(2, &v2, 513);
  if ( calc_hash(&v2) == 0xC4B1801C )	// Bingo !
    v1 = 3;
  else
    v1 = 4;

  sub_403550(v1);
  sub_403580(2);
  sub_403580(100);
  return 0;
}

int __usercall calc_hash<eax>(const char *string<edi>)
{
  const char *v1; // ecx@1
  int hash; // esi@1
  unsigned int i; // edx@1
  char v4; // al@2

  v1 = string;
  hash = 0xDEADBEEFu;
  i = 0;
  do
    v4 = *v1++;
  while ( v4 );
  if ( v1 != string + 1 )
  {
    do
      hash = 0x5B86AFFE * string[i++] - 0x38271606 * hash;
    while ( i < strlen(string) );
  }
  return hash;
}

Теперь мы можем написать брутфорсер:
snk-box:rce100 snk$ ./brute
Key: pWn3D

Таких строк удовлетворяющих условию будет очень много. Но жюри приминает только две: pWn3D и H,v^^

No TrackBacks

TrackBack URL: http://smokedchicken.org/m/mt-tb.cgi/50

About this Entry

This page contains a single entry by snk published on April 4, 2011 9:50 PM.

Nuit du Hack (NdH2k11) - crypto300 was the previous entry in this blog.

Nuit Du Hack (NdH2k11) - RCE200 is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.