рд╡рд╛рд░реНрд╖рд┐рдХ рд╣реИрдХрдХреНрд╡реЗрд╕реНрдЯ рдХреЗ рд╕рд╛рдд рджрд┐рди - рд╕рд╛рдд рдХрд╛рд░реНрдп рдЬрд┐рдиреНрд╣реЗрдВ рдЬрд╝реАрд░реЛрдирд╛рдЗрдЯреНрд╕ рдХреЛ рдореБрдлреНрдд рдкреНрд░рд╡реЗрд╢ рдЯрд┐рдХрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЖрдкрдХреЛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЗ рдирд┐рд░реНрдгрдпреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдВ, рд╕рд╛рде рд╣реА рд╡рд┐рдЬреЗрддрд╛рдУрдВ рдХреЗ рдирд╛рдо рднреА рдЬрд╛рдиреЗрдВред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рдХрд╛рд╢рди рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗред

рд╕рд╛рдордЧреНрд░реА

Day1ред рдЧрд╛рд▓реНрд╡рд╛
рдЗрд╕ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП,
REhints рдХреЛ рдзрдиреНрдпрд╡рд╛рдж
рджреЗрдВ ред
"рдЪреБрдиреМрддреА рдирд┐рдореНрди рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ: рдмрд╛рдЗрдирд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ (рдкрд╛рд╕: рд╕рдВрдХреНрд░рдорд┐рдд), рдЗрд╕реЗ рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░ рдХрд░реЗрдВ рдФрд░ рджреЛ рд░рд╣рд╕реНрдпреЛрдВ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдЬреЛ рдмрд╛рдЗрдирд░реА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдкреНрд░рддреНрдпреЗрдХ рд░рд╣рд╕реНрдп рдПрдХ ASCII рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИред рджреВрд╕рд░реЗ рдкрд░ рд╣рдорд▓рд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЪрд░рдг рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЧреБрдб рд▓рдХ рдФрд░ рдЧреИрд▓реЛрдЬрд╝ рдЖрдкрдХреЗ рд╕рд╛рде рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ! тАЭрдзреНрд╡рдЬ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рджреЛ рдЧреБрдкреНрдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╣рдо рдлрдВрдХреНрд╢рди рдореЗрдВ рдЖрддреЗ рд╣реИрдВ:
DialogFuncBOOL __stdcall DialogFunc(HWND hWnd, UINT a2, WPARAM a3, LPARAM a4) { HWND v5; // eax HWND v6; // eax HWND v7; // eax HWND v8; // eax HWND v9; // eax HWND v10; // eax CHAR v11; // [esp+0h] [ebp-5Ch] CHAR String[20]; // [esp+2Ch] [ebp-30h] struct tagRECT Rect; // [esp+40h] [ebp-1Ch] UINT v14; // [esp+50h] [ebp-Ch] HDC hdc; // [esp+54h] [ebp-8h] unsigned int i; // [esp+58h] [ebp-4h] v14 = a2; if ( a2 == 20 ) { hdc = (HDC)a3; GetClientRect(hWnd, &Rect); SetMapMode(hdc, 8); SetWindowExtEx(hdc, 100, 100, 0); SetViewportExtEx(hdc, Rect.right, Rect.bottom, 0); FillRect(hdc, &Rect, hbr); return 1; } if ( v14 == 272 ) return 1; if ( v14 != 273 || HIWORD(a3) ) return 0; if ( (unsigned __int16)a3 == 1 ) { EndDialog(hWnd, (unsigned __int16)a3); return 1; } if ( (unsigned __int16)a3 != 1002 ) { if ( (unsigned __int16)a3 == 1004 ) { sub_42E7C0(&v11, 0, 42); if ( GetDlgItemTextA(hWnd, 1005, &v11, 42) <= 0x27 && (unsigned __int8)sub_42CEF0(&v11) ) { v9 = GetDlgItem(hWnd, 1004); EnableWindow(v9, 0); v10 = GetDlgItem(hWnd, 1005); EnableWindow(v10, 0); MessageBoxW(hWnd, L"Good job!", L"Success", 0); return 1; } MessageBoxW(hWnd, L"Keep trying!", L"Rejected", 0); } return 1; } if ( GetDlgItemTextA(hWnd, 1001, String, 18) != 16 || !(unsigned __int8)sub_4014E0(String) ) { MessageBoxW(hWnd, L"Keep trying!", L"Rejected", 0); return 1; } v5 = GetDlgItem(hWnd, 1002); EnableWindow(v5, 0); v6 = GetDlgItem(hWnd, 1001); EnableWindow(v6, 0); v7 = GetDlgItem(hWnd, 1005); EnableWindow(v7, 1); v8 = GetDlgItem(hWnd, 1004); EnableWindow(v8, 1); for ( i = 0; i < 0x28; ++i ) *((_BYTE *)&dword_442780 + i) ^= String[(signed int)i % 16]; MessageBoxW(hWnd, L"Stage #2 unlocked!", L"Accepted", 0); return 1; }
"рд╕реНрдЯреЗрдЬ # 2 рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП
рдЦреБрд▓рд╛!" , рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди
sub_4014E0
(рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рдВрдмрд╛рдИ - 16 рд╡рд░реНрдг) рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░
"рдЕрдЪреНрдЫрд╛ рдХрд╛рдо!" -
sub_42CEF0
рдореЗрдВ рдПрдХ рдФрд░ рдЬрд╛рдВрдЪ (рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдХреА рд▓рдВрдмрд╛рдИ 40 рд╕реЗ рдХрдо рдЕрдХреНрд╖рд░ рд╣реИ)ред
рд╕реНрдЯреЗрдЬ # 1
char __cdecl sub_4014E0(char *a1) { int v1; // ecx unsigned __int128 var_1018[256]; // [esp+0h] [ebp-1018h] unsigned __int128 var_18; // [esp+1000h] [ebp-18h] int v5; // [esp+1010h] [ebp-8h] char v6; // [esp+1017h] [ebp-1h] sub_438740(0x1018u, v1); sub_43A460(var_1018, xmmword_4427A8, 0x1000u); sub_4010E0(a1, var_1018); sub_401250(var_1018, &var_18); v5 = sub_438845(var_18, &xmmword_442770, 0x10u); if ( !v5 ) v6 = 1; return v6; }
рдбрд┐рдмрдЧрд░ рдХреЗ рддрд╣рдд, рдЖрдк рдЙрд╕
sub_43A460
рдкреНрд░рддрд┐рдпреЛрдВ рдХреЗ рдбреЗрдЯрд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдФрд░
sub_438845
рд╕рд╛рде рдореВрд▓реНрдп рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ:
.data:00442770 xmmword_442770 9698CA91EE29902C60D377C981589205h
рдбреЗрдЯрд╛ рдХреЛ 128-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдЧреЗ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд┐рдХрд▓рд╛ред
Sub_4010E0 рдлрд╝рдВрдХреНрд╢рди void __cdecl sub_4010E0(unsigned __int128 *a1, unsigned __int128 *a2) { signed int i; // [esp+4h] [ebp-8h] signed int j; // [esp+8h] [ebp-4h] for ( i = 0; i < 128; ++i ) { for ( j = 0; j < 128; ++j ) { if ( (*((_DWORD *)a1 + (j >> 5)) >> (j & 0x1F)) & 1 ) { if ( !((*((_DWORD *)a1 + ((j + 1) % 128 >> 5)) >> ((j + 1) % 128 & 0x1F)) & 1) ) *((_DWORD *)&a2[2 * i] + ((j + 128) >> 5)) &= ~(1 << ((j + -128) & 0x1F)); } else { *((_DWORD *)&a2[2 * i] + (j >> 5)) &= ~(1 << (j & 0x1F)); *((_DWORD *)&a2[2 * i] + ((j + 128) >> 5)) &= ~(1 << ((j + -128) & 0x1F)); } } } }
рдХреБрдЫ рд╕рд░рд▓реАрдХреГрдд рд░реВрдк рдореЗрдВ рд╕рдорд╛рди рдХрд╛рд░реНрдп void __cdecl sub_4010E0(unsigned __int128 *a1, unsigned __int128 *a2) { signed int i; // [esp+4h] [ebp-8h] signed int j; // [esp+8h] [ebp-4h] signed int j_1; for ( i = 0; i < 128; ++i ) { for ( j = 0; j < 128; ++j ) { j_1 = (j + 1) % 128; if ( (*((_DWORD *)a1 + j / 32) >> (j % 32)) & 1 ) { if ( !((*((_DWORD *)a1 + j_1 / 32) >> (j_1 % 32)) & 1) ) *((_DWORD *)&a2[2 * i] + 4 + j / 32) &= ~(1 << (j % 32)); } else { *((_DWORD *)&a2[2 * i] + j / 32) &= ~(1 << (j % 32)); *((_DWORD *)&a2[2 * i] + 4 + j / 32) &= ~(1 << (j % 32)); } } } }
рджреВрд╕рд░реЗ рддрд░реНрдХ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдмреЛрдзрд┐рдд 128-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбрд╝реА рдХреЗ рд▓рд┐рдП, рдЪрдХреНрд░ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдкрд╣рд▓реЗ рддрд░реНрдХ) рдХреЗ 128 рдмрд┐рдЯреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ рдФрд░, рдпрджрд┐ рдмрд┐рдЯ 0 рд╣реИ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдмрд┐рдЯреНрд╕ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ (рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ AND рдСрдкрд░реЗрд╢рди рдХрд░рддрд╛ рд╣реИ)ред рдмрд┐рдЯреНрд╕ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рд╕реЗ рджреВрд╕рд░реЗ рдирдВрдмрд░ рдХреЗ рд▓рд┐рдП, рдпрд╣ рднреА рд░реАрд╕реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЕрдЧрд▓рд╛ рдмрд┐рдЯ 0 рд╣реИред
рдЕрдЬрдЧрд░ рдкрд░, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
def sub_4010E0(a1, a2): for i in range(128): a2[2 * i] &= a1 a2[2 * i + 1] &= a1 & (a1 >> 1)
рдлрд╝рдВрдХреНрд╢рди рдЙрдк_401250 void __cdecl sub_401250(unsigned __int128 *a1, unsigned __int128 *a2) { signed int k; // [esp+4h] [ebp-Ch] signed int j; // [esp+8h] [ebp-8h] signed int i; // [esp+Ch] [ebp-4h] *(_QWORD *)a2 = 0i64; *((_QWORD *)a2 + 1) = 0i64; for ( i = 0; i < 128; ++i ) { for ( j = 0; j < 4; ++j ) *((_DWORD *)&a1[2 * i] + j) ^= *((_DWORD *)&a1[2 * i + 1] + j); for ( k = 0; k < 2; ++k ) *((_DWORD *)&a1[2 * i] + k) ^= *((_DWORD *)&a1[2 * i] + k + 2); LODWORD(a1[2 * i]) ^= DWORD1(a1[2 * i]); LODWORD(a1[2 * i]) ^= LODWORD(a1[2 * i]) >> 16; LODWORD(a1[2 * i]) ^= LODWORD(a1[2 * i]) >> 8; LODWORD(a1[2 * i]) ^= LODWORD(a1[2 * i]) >> 4; LODWORD(a1[2 * i]) ^= LODWORD(a1[2 * i]) >> 2; LODWORD(a1[2 * i]) ^= LODWORD(a1[2 * i]) >> 1; if ( a1[2 * i] & 1 ) *((_DWORD *)a2 + (i >> 5)) |= 1 << (i & 0x1F); } }
рдлрд╝рдВрдХреНрд╢рди рд╕рднреА рдмрд┐рдЯреНрд╕ рдХреЗ рдмреАрдЪ XOR рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╣реБрдП, рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рдгрд╛рдореА рдЬреЛрдбрд╝реЗ рдХреЛ рдПрдХ рдмрд┐рдЯ рдореЗрдВ рдореЛрдбрд╝ рджреЗрддрд╛ рд╣реИред 128 рдмрд┐рдЯреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдФрд░ рджрд┐рдП рдЧрдП рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдмрдирд╛ред
рдПрдХ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реЙрд▓реНрд╡рд░ z3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдиреЛрдЯрдмреБрдХ рдореЗрдВ рд╕рд░рд▓ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд╕рд╛рде, рд╣рдо xmmword_4427A8 рд╕рд░рдгреА рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ (рдмрд╛рдИрдВ рдУрд░ рд╢реВрдиреНрдп рдФрд░ рд╕рдВрдЦреНрдпрд╛ xmmword_442770 рд╣реИрдВ) from z3 import * init('../') def xor_bits(x): x = Extract(63, 0, x) ^ Extract(127, 64 ,x) x = Extract(31, 0, x) ^ Extract(63, 32, x) x = Extract(15, 0, x) ^ Extract(31, 16, x) x = Extract(7, 0, x) ^ Extract(15, 8, x) x = Extract(3, 0, x) ^ Extract(7, 4, x) x = Extract(1, 0, x) ^ Extract(3, 2, x) return Extract(0, 0, x) ^ Extract(1, 1, x) x = BitVec('x', 128) s = Solver()
рдкрд╛рдП рдЧрдП рдмрд┐рдЯреНрд╕ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдкрд░, рд╣рдореЗрдВ рдкрд╣рд▓реА рдХреБрдВрдЬреА
рдорд┐рд▓рддреА рд╣реИ :
ItWasJustAWarmUp ред
рд╕реНрдЯреЗрдЬ # 2
bool __cdecl sub_42CEF0(char *a1) { bool result; // al __int64 v2; // [esp+0h] [ebp-3Ch] __int64 v3; // [esp+8h] [ebp-34h] __int64 v4; // [esp+10h] [ebp-2Ch] __int64 v5; // [esp+18h] [ebp-24h] __int64 v6; // [esp+20h] [ebp-1Ch] int v7; // [esp+28h] [ebp-14h] int v8; // [esp+2Ch] [ebp-10h] int v9; // [esp+30h] [ebp-Ch] int v10; // [esp+34h] [ebp-8h] int v11; // [esp+38h] [ebp-4h] v6 = *(_QWORD *)a1; v5 = *((_QWORD *)a1 + 1); v4 = *((_QWORD *)a1 + 2); v3 = *((_QWORD *)a1 + 3); v2 = *((_QWORD *)a1 + 4); (**off_444360)(off_444360, &v6, 0, off_44435C); (**off_444360)(off_444360, &v5, 0, off_44435C); (**off_444360)(off_444360, &v4, 0, off_44435C); (**off_444360)(off_444360, &v3, 0, off_44435C); (**off_444360)(off_444360, &v2, 0, off_44435C); v11 = 0; result = 0; if ( v6 == qword_442780 ) { v10 = 8; if ( v5 == __PAIR__(*((_DWORD *)&qword_442780 + 3), *((_DWORD *)&qword_442780 + 2)) ) { v9 = 16; if ( v4 == __PAIR__(*((_DWORD *)&qword_442780 + 5), *((_DWORD *)&qword_442780 + 4)) ) { v8 = 24; if ( v3 == __PAIR__(*((_DWORD *)&qword_442780 + 7), *((_DWORD *)&qword_442780 + 6)) ) { v7 = 32; if ( v2 == __PAIR__(*((_DWORD *)&qword_442780 + 9), *((_DWORD *)&qword_442780 + 8)) ) result = 1; } } } } return result; }
рджрд░реНрдЬ рдХреА рдЧрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрд╛рдВрдЪ 64-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдкрд░рд┐рдгрд╛рдо рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред

рдбреАрдмрдЧрд░ рдХреЗ рдиреАрдЪреЗ рдЪрд▓рддреЗ рд╣реБрдП, рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреНрд░рдо рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ:

рдЕрдм рддрдХ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рддреАрд╕рд░реЗ рддрд░реНрдХ рдХреЛ рдХреЙрд▓ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрднреА-рдХрднреА рдПрдХ рдЗрдХрд╛рдИ рдХреЗ рд╕рд╛рде 2 рдореЛрдбрд╝рдирд╛, рдХрднреА-рдХрднреА рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдЕрдЧрд▓реЗ рдмрд┐рдЯ рдХреЗ рд╕рд╛рде (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдЫ рдмрд┐рдЯреНрд╕, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдХрд╣рд╛рдВ рд╣реЛрддрд╛ рд╣реИ, рд╕реНрдореГрддрд┐ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдкрд░ рдПрдХ рд╡рд┐рд░рд╛рдо рдмрд┐рдВрджреБ рдбрд╛рд▓рдирд╛:

рдпрд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд┐рдЯ рдХреЛ рддреАрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рдореВрд▓реНрдп рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдкрд┐рдЫрд▓рд╛ рдорд╛рди (рдХрднреА-рдХрднреА рдЙрд▓рдЯрд╛) рдкрд░ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдореНрди рд░реВрдкрд╛рдВрддрд░рдг рд╣реЛрддрд╛ рд╣реИ:
a3 = xor_all_bits(input & x) ^ y; output = ((input << 1) ^ z) | a3;
- x рдЙрди рдмрд┐рдЯреНрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рдирд╣реАрдВ рдЫреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛;
- y рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдЗрдХрд╛рдИ рдХреЛ рдХрд┐рддрдиреА рдмрд╛рд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ (modulo 2);
- z рджреВрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ рдЙрд▓реНрдЯреЗ рдмрд┐рдЯреНрд╕ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред
рдЕрдЬреНрдЮрд╛рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдмрд┐рдЯ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╢реВрдиреНрдп рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдорд╛рди рдорд┐рд▓рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ
extern i; i = 0;
рдФрд░ рдлрд╝рдВрдХреНрд╢рди
sub_428FD0
рдЕрдЧрд▓реЗ рд░рд╛рдЙрдВрдб рд╕реЗ рдкрд╣рд▓реЗ рд╣рдордиреЗ рдПрдХ рд╢рд░реНрдд рдХреЗ рд╕рд╛рде рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд▓рдЧрд╛рдпрд╛, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдмрд╛рдж рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛, рдЗрд╕рдХреЗ рдЕрдЧрд▓реЗ рдореВрд▓реНрдп рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рджреЛрд╣рд░рд╛рдПрдВред
print(Qword(Qword(ebp+8))), i=i+1, (i<64)?patch_qword(Qword(ebp+8), __int64(1) << i)^(eip=0x428FE0):0,0
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдереЗ:

рдЬрд╣рд╛рдВ:
- x = 0x11CE9E8E6CF2B888
- рдп = рез
- z = 0x8E2B550A6AEDD63A
рддреЛ рдкрд╛рдпрдерди рдореЗрдВ, рд░реВрдкрд╛рдВрддрд░рдг рд╕рдорд╛рд░реЛрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
def xor_bits(x): a = 0 while x != 0: a ^= x & 1 x >>= 1 return a def round(x): x = ((x << 1) & 0xFFFFFFFFFFFFFFFF) | xor_bits(x & 0x8e2b550a6aedd63a) ^ 1 return x ^ 0x11CE9E8E6CF2B888 def encrypt(x): for _ in range(64): x = round(x) return x
рдФрд░ рдЙрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд:
def rev_round(x): x ^= 0x11CE9E8E6CF2B888 a = x & 1 x >>= 1 if xor_bits(x & 0x8e2b550a6aedd63a) ^ 1 != a: x |= 1 << 63 return x def decrypt(x): for _ in range(64): x = rev_round(x) return x
qword_442780
рд╕рд░рдгреА рд╕реЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ
рдорд┐рд▓рддреА рд╣реИ :
YourReversingSkillsAreImpressive_zN2018 ред

Day2ред Blackanwyte
рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП
@leetmore рд╕реЗ
рд╡реНрд▓рд╛рдж рд░реЛрд╕рдХреЛрд╡ рдХреЛ рдзрдиреНрдпрд╡рд╛рджред
рд▓рд┐рдВрдХ рдкрд░
рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╕рдордп
, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦрддреЗ рд╣реИрдВ:

рд╣рдореЗрдВ рдПрдХ рдкреНрд░рдЪрд╛рд░ рдХреЛрдб рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдкреЗрдЬ рдЦреБрд▓рдиреЗ рдкрд░ рдХреМрди рд╕реА рдлрд╛рдЗрд▓реЗрдВ рд▓реЛрдб рд╣реЛрддреА рд╣реИрдВред

Whitebox.js рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рдЪрд╛рд░ рдХреЛрдб рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ: рдЪрд░
c
, рджрд░реНрдЬ рдкрд╛рда рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ; рдпрд╣ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ "/ \ d + - \ w + /" рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рдЪрд╛рд░рдХ рдХреЛрдб "1234-ABCD" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдЧрд▓рд╛, рд╕рдВрдЦреНрдпрд╛ рдмрд╛рдЗрдирд░реА рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ, рд╢реВрдиреНрдп "рдПрди", рдФрд░ рдЗрдХрд╛рдЗрдпреЛрдВ - "рдЬреЗрдб" рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред рд╕рд░рдгреА
f
рд╕реЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ 4 рдЕрдХреНрд╖рд░реЛрдВ рдХреЗ рдЪрдХреНрд░ рдореЗрдВ, рд╣реИрд╢ md5 рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдкрд╣рд▓реЗ рдЪрд╛рд░ рд╡рд░реНрдгреЛрдВ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд░реНрдг "7177a294cfa7b333371776765cfa74ddf" рд╕реЗ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рд╣реА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЫреЛрдЯреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреЗрдВред рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЦреНрдпрд╛ рдорд┐рд▓рддреА рд╣реИ, рд╣рдорд╛рд░реЗ рдкреНрд░рдЪрд╛рд░ рдХреЛрдб рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ: 234082018ред

рд╣рдордиреЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ред рдЪрд▓реЛ рджреВрд╕рд░реЗ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ:

рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐
blackbox_check
рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рди рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрд╣ "elee757bc7fd00d5" рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, whitebox.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ
blackbox_check
рдХрд╛ рдХреЛрдИ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмреНрд▓реИрдХрдмреЙрдХреНрд╕.js рдЦреЛрд▓рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
рдкрд╛рда рд╕рдВрдкрд╛рджрдХ рдПрдХ рд▓рдВрдмреА рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдмреНрд▓реИрдХрдмреЙрдХреНрд╕_рдЪреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд▓рд╛рдЗрди (22) рд╣реИред Googling, рд╣рдо рд╕реАрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рдЗрдЯ рдХреЛ рдЪрд░
code
рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓рд╛рдЗрди 32 рдореЗрдореЛрд░реА рдореЗрдВ рдкреНрд░рдЪрд╛рд░ рдХреЛрдб рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд▓рд╛рдЗрди 33 рд╕реНрдЯреИрдХ рдХрд╛ рдкрддрд╛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рд▓рд╛рдЗрди 41 рд╕реЗ рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рд╛рдЗрд▓ "0x080485E0" рдкрддреЗ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред
рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдИрдбреАрдП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рд╣реИред рдЪрд▓рд┐рдП рдмреНрд▓реИрдХрдмреЙрдХреНрд╕_рдЪреЗрдХ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рд╣рдо рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рддреНрд╡рд░рд┐рдд рдмреНрд░реВрдЯ рдпрд╛ рдЕрдиреНрдп рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╡рд╕рд░ рдЦреЛрдЬрдиреЗ рдХреЗ рдХрдИ рдЕрд╕рдлрд▓ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдмрд╛рдж, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдбреИрд╢ рдХреЙрдкреА рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд▓рд╛рдЗрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдХреЗрд╡рд▓ 256 рд╡рд░реНрдгреЛрдВ рддрдХ рд╕реАрдорд┐рдд рд╣реИред
рд╣рдо рдЪреЗрдХрд╕реЗрдХ рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдЯреИрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд╣реИ:
рдиреЛрдЯ - рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдФрд░ vraytap рдХреЗ рд▓реЗрдЦрдХ рдХреЗ рдкрд╛рда рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕рдВрдЧрддрд┐рдпрд╛рдВ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╕реНрдЯреИрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд╕ рд╕реНрдЯреИрдХ рдХрд╛ рдкрддрд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рд╣рдорд╛рд░реА рд▓рд╛рдЗрди рд▓рд┐рдЦреА рдЬрд╛рдПрдЧреА, рдпрд╣ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ рдХрд┐ рдЖрдк "e1ee757bc7fd00d5" рд▓рд╛рдЗрди рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдкрддреЗ рддрдХ рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рдЦреЗрдВред

рд╣рдо рдХрдВрд╕реЛрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рдгрд╛рдореА рд▓рд╛рдЗрди рднреЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рдЭрдВрдбрд╛ рдЙрдард╛рддреЗ рд╣реИрдВ:
рдЦреЛрдЬрд╛ рд╣реБрдЖ рддрд╛рд░ рдЦреЛрдЬреА рдкрдВрдХреНрддрд┐:
Bl4CK_0r_wYT3_It5_z3r0Ni6hT
Day3ред рдореБрдЭреЗ рдкреИрдб рджреЛ
рдЕрд░реЗ, рдпрд╣ рд╕рдореВрд╣ рдЕрднреА рднреА рдкреБрд░рд╛рдиреЗ рд╢реИрд▓реА рдХреЗ рд╕рдВрджреЗрд╢ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рджрд╕реНрдп рдЕрдкрдиреЗ рддреАрд╕рд╡рд╛рдВ рджрд╢рдХ рдореЗрдВ рд╣реИрдВ рдФрд░ рдпрд╣ рдЙрдирдХреА рдХреНрд░рд┐рдкреНрдЯреЛрдХрд░рдВрд╕реА рд╣реИред рд╡рд╣рд╛рдВ рдЦрд╛рдорд┐рдпрд╛рдВ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдЙрдирдХрд╛ рдореИрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо 51.15.79.170 рдкрд░ рд╣реИ рдФрд░ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реИ? рд╣рдо рдЙрдирдХреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЕрдиреБрд░реЛрдз рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк ytW81KkHaGOnaqiG7Gr4AA == рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: XXnpfKJoUCufBm2ztTXGCN6wgqLeScU8 + XLL7Co5oHg =1. рдореБрдЭреЗ тАЬytW81KkHaGOnaqiG7Gr4AA ==: XXnpfKJoUCufBm2ztTXGCN6wgqLeSc88 + XlL7Co5oHg =тАЭ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж 403 рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА рд╣реИред рдпрджрд┐ рдХреБрдЫ рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ - рдлрд┐рд░ рднреА 403 рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рдкрддреНрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ - 500 рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдХреБрдЫ рдЬрд╛рдВрдЪ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдорд╣рд╕реВрд╕ рд╣реБрдЖ рдХрд┐ рдмреЗрд╕ 64-рдбрд┐рдХреЛрдбреЗрдб рдлреЙрд░реНрдо рдореЗрдВ рдкрд╣рд▓рд╛ рднрд╛рдЧ рдмреЛрдпрд╛ рдЧрдпрд╛ 16 рдмрд╛рдЗрдЯреНрд╕ рд▓рдВрдмрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдЯреНрд╕ 16 рдмрд╛рдЗрдЯреНрд╕ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред Seems first part is IV and second part тАУ encoded data in CBC mode, and according to task name тАЮpadтАЭ it is padding oracle attack.
2. Lets change last byte in base64 decoded form of second part (01.php script, total 256 possibilities). For one case instead of тАЬ403тАЭ error I have received message тАЮSir, your message is incorrect or it is not 48 bytes longтАЭ
01.php script <?php $s = "7177a294cfa7b53371776be5cfa74ddf"; $r = ""; for($i=0;$i<32;$i+=4) { for($j=0;$j<16;$j++) { $a = sprintf("%04b", $j); $a = str_replace("0", "Z", $a); $a = str_replace("1", "N", $a); if (substr(md5($a), 0, 4) == substr($s, $i, 4)) break; } if ($j == 16) die("Error 1: {$i}"); $r .= $a; echo md5($r).": ".$r."\r\n"; } $p = array(22,30,25,23,2,20,0,11,24,6,31,3,16,12,9,15,27,28,18,1,21,4,8,13,17,7,19,29,5,26,14,10); $s = str_repeat("_", 32); for($i=0;$i<32;$i++) $s[$p[$i]] = $r[$i]; echo $s."\r\n"; $a = 0; for($i=0;$i<32;$i++) { if ($s[$i] == 'Z') $a += (1<<$i); } echo $a."\r\n";
3. Lets decrypt message from task using padding oracle attack (scripts 02.php and 02b.php) тАУ I have received string тАЬNever gonna give you up\nNever goтАЭ.
02.php script<?php
$a = тАЮytW81KkHaGOnaqiG7Gr4AA==:XXnpfKJoUCufBm2ztTXGCN6wgqLeScU8+XlL7Co5oHg=тАЬ;
$a = explode(┬╗:", $a);
$a[0] = base64_decode($a[0]);
$a[1] = base64_decode($a[1]);
file_put_contents(┬л01.bin┬╗, $a[0].$a[1]);
$s = $a[1];
$known = "";
for($i=1;$i<=16;$i++)
{
for($j=0;$j<256;$j++)
{
$iv = str_repeat(┬лA┬╗, 16-$i).((chr($j).$known) ^ str_repeat(chr($i), $i));
if (($r = send($iv, substr($s, 0, 16))) !== false)
{
echo $r."\r\n";
$known = chr($j).$known;
echo bin2hex($known)." ".($known ^ substr($a[0], -$i))."\r\n";
break;
}
}
if ($j == 256) die(┬лError 1: {$i}┬╗);
}
function send($a, $b)
{
$data = base64_encode($a).":".base64_encode($b);
$s = ┬лPOST / HTTP/1.0\r\n┬╗;
$s.= ┬лHost: 51.15.79.170\r\n┬╗;
$s.= ┬лContent-Length: ┬╗.strlen($data)."\r\n";
$s.= ┬лUser-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0\r\n┬╗;
$s.= "\r\n";
$s.= $data;
$r = "";
do {$socket =
fsockopen (┬л51.15.79.170┬╗, 80);} while(!$socket);
fwrite($socket, $s);
while(!@feof($socket)) $r .= fread($socket, 4096);
fclose($socket);
if (strpos($r, ┬л500 INTERNAL SERVER ERROR┬╗)) die(┬лError 2: {$data}┬╗);
return (strpos($r, ┬л403 FORBIDDEN┬╗) !== false)?false:$r;
}
Never gonna give you upHTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:49:08 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
0f0cc904c9a68b038e65 gonna give
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:49:25 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
270f0cc904c9a68b038e65 gonna give
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:50:10 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
db270f0cc904c9a68b038e65 r gonna give
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:51:11 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
b1db270f0cc904c9a68b038e65 er gonna give
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:52:15 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
cab1db270f0cc904c9a68b038e65 ver gonna give
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:53:19 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
b0cab1db270f0cc904c9a68b038e65 ever gonna give
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:54:15 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
84b0cab1db270f0cc904c9a68b038e65 Never gonna give
02b.php script <?php $a = "ytW81KkHaGOnaqiG7Gr4AA==:XXnpfKJoUCufBm2ztTXGCN6wgqLeScU8+XlL7Co5oHg="; $a = explode(":", $a); $a[0] = base64_decode($a[0]); $a[1] = base64_decode($a[1]); file_put_contents("01.bin", $a[0].$a[1]); $s = substr($a[1], 16); $iv2 = substr($a[1], 0, 16); $known = ""; for($i=1;$i<=16;$i++) { for($j=0;$j<256;$j++) { $iv = str_repeat("A", 16-$i).((chr($j).$known) ^ str_repeat(chr($i), $i)); if (($r = send($iv, substr($s, 0, 16))) !== false) { echo $r."\r\n"; $known = chr($j).$known; echo bin2hex($known)." ".($known ^ substr($iv2, -$i))."\r\n"; break; } } if ($j == 256) die("Error 1: {$i}"); } function send($a, $b) { $data = base64_encode($a).":".base64_encode($b); $s = "POST / HTTP/1.0\r\n"; $s.= "Host: 51.15.79.170\r\n"; $s.= "Content-Length: ".strlen($data)."\r\n"; $s.= "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0\r\n"; $s.= "\r\n"; $s.= $data; $r = ""; do {$socket = @fsockopen("51.15.79.170", 80);} while(!$socket); fwrite($socket, $s); while(!@feof($socket)) $r .= fread($socket, 4096); fclose($socket); if (strpos($r, "500 INTERNAL SERVER ERROR")) die("Error 2: {$data}"); return (strpos($r, "403 FORBIDDEN") !== false)?false:$r; }
Never goHTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:50:12 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
67 o
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:51:11 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
a167 go
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:51:14 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
15a167 go
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:52:30 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
c715a167 r go
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:53:57 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
d6c715a167 er go
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:54:15 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
1bd6c715a167 ver go
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:54:28 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
631bd6c715a167 ever go
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:55:21 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
d1631bd6c715a167 Never go
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:55:43 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
21d1631bd6c715a167
Never go
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:55:47 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
2021d1631bd6c715a167 p
Never go
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:55:51 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
1d2021d1631bd6c715a167 up
Never go
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:56:07 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
821d2021d1631bd6c715a167 up
Never go
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:56:08 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
09821d2021d1631bd6c715a167 u up
Never go
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:56:52 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
8609821d2021d1631bd6c715a167 ou up
Never go
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:56:52 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
008609821d2021d1631bd6c715a167 you up
Never go
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 21:57:10 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
7d008609821d2021d1631bd6c715a167 you up
Never go
4. Ok, seems the message was truncated (should be 48 bytes long). Using google I have found some song with full phase "
Never gonna give you up\nNever gonna let you down тАЭ. Lets encrypt it using padding oracle attack from last block till first block and iv (scripts 05.php and 04_brute.php).
04_brute.php script <?php $a = "ytW81KkHaGOnaqiG7Gr4AA==:XXnpfKJoUCufBm2ztTXGCN6wgqLeScU8+XlL7Co5oHg="; $a = explode(":", $a); $a[0] = base64_decode($a[0]); $a[1] = base64_decode($a[1]); file_put_contents("01.bin", $a[0].$a[1]); $s = hex2bin("ff4fba7f36536f04bd0a3f77b8b06dde"); $known = ""; for($i=1;$i<=16;$i++) { for($j=0;$j<256;$j++) { $iv = str_repeat("A", 16-$i).((chr($j).$known) ^ str_repeat(chr($i), $i)); if (($r = send($iv, substr($s, 0, 16))) !== false) { echo $r."\r\n"; $known = chr($j).$known; echo bin2hex($known)."\r\n"; break; } } if ($j == 256) die("Error 1: {$i}"); } function send($a, $b) { $data = base64_encode($a).":".base64_encode($b); $s = "POST / HTTP/1.0\r\n"; $s.= "Host: 51.15.79.170\r\n"; $s.= "Content-Length: ".strlen($data)."\r\n"; $s.= "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0\r\n"; $s.= "\r\n"; $s.= $data; $r = ""; do {$socket = @fsockopen("51.15.79.170", 80);} while(!$socket); fwrite($socket, $s); while(!@feof($socket)) $r .= fread($socket, 4096); fclose($socket); if (strpos($r, "500 INTERNAL SERVER ERROR")) die("Error 2: {$data}"); return (strpos($r, "403 FORBIDDEN") !== false)?false:$r; }
05.php <?php $a = "ytW81KkHaGOnaqiG7Gr4AA==:XXnpfKJoUCufBm2ztTXGCN6wgqLeScU8+XlL7Co5oHg="; $a = explode(":", $a); $a[0] = base64_decode($a[0]); $a[1] = base64_decode($a[1]); $Q = "Never gonna give you up\nNever gonna let you down".str_repeat("\x10", 0x10); echo strlen($Q)."\r\n"; $e1 = substr($a[1], 0, 16); $d1 = $a[0] ^ "Never gonna give"; $e2 = $d1 ^ substr($Q, 48, 16); echo bin2hex($e2)."\r\n"; $d2 = hex2bin("9e3d4885d3be30498069cfc4992e73df"); $e3 = $d2 ^ substr($Q, 32, 16); echo bin2hex($e3)."\r\n"; $d3 = hex2bin("df36d50a16261f0ef36f4912ca900ab1"); $e4 = $d3 ^ substr($Q, 16, 16); echo bin2hex($e4)."\r\n"; $d4 = hex2bin("20c3540ec72fa0b486b5f0c868218360"); $e5 = $d4 ^ substr($Q, 0, 16); echo bin2hex($e5)."\r\n"; $a[0] = $e5; $a[1] = $e4.$e3.$e2.$e1; $data = base64_encode($a[0]).":".base64_encode($a[1]); $s = "POST / HTTP/1.0\r\n"; $s.= "Host: 51.15.79.170\r\n"; $s.= "Content-Length: ".strlen($data)."\r\n"; $s.= "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0\r\n";
20c3540ec72fa0b486b5f0c868218360HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 23:51:49 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
60
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 23:52:05 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
8360
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 23:52:15 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
218360
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 23:52:52 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
68218360
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 23:53:56 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
c868218360
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 23:55:08 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
f0c868218360
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 23:56:09 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
b5f0c868218360
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 23:57:05 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
86b5f0c868218360
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 23:58:03 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
b486b5f0c868218360
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 23:58:59 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
a0b486b5f0c868218360
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 23 Oct 2018 23:59:05 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
2fa0b486b5f0c868218360
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Wed, 24 Oct 2018 00:00:08 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
c72fa0b486b5f0c868218360
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Wed, 24 Oct 2018 00:00:10 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
0ec72fa0b486b5f0c868218360
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Wed, 24 Oct 2018 00:00:21 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
540ec72fa0b486b5f0c868218360
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Wed, 24 Oct 2018 00:01:21 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
c3540ec72fa0b486b5f0c868218360
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Wed, 24 Oct 2018 00:01:34 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 57
Connection: close
Sir, your message is incorrect or it is not 48 bytes long
20c3540ec72fa0b486b5f0c868218360
64
94a0daa1cb371f1cd914d9b69b139e75
f05329a5bfdb4469f906bae4fd4104b1
ff4fba7f36536f04bd0a3f77b8b06dde
6ea6226bb50fc7dbe8db91e80f48f505
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Wed, 24 Oct 2018 00:01:51 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 73
Connection: close
Okey, I see you're from 80's, get in
< Wh4t_1f_R1ck_A3tl3y_Sm0ke_Cannab1s >