5get_it, el quinto reto del primer flare-on de Fireeye. No puedo más que decirles que este si que me ha costado. Comencemos con el writeup de este keylogger.

Bien comenzamos por descomprimir el challenge “C5.zip”, el cual esta protegido por la contraseña “malware”.

Nota: Todos los archivos de challenge se encuentran dentro de un zip que se descarga aquí

Unzip

Tomamos algo de información base sobre el binario:

Información Base

Ok, tenemos el primer vistazo que nos dice que tratamos con una DLL que no se encuentra empaquetada, con formato PE para 32 bits y que salvo la imagen base, todo parece normal.

Continuemos identificándolo en radare2:

Análisis base de Radare2

El show info all o ia de radare2 nos entrega mucha información, que coincide con lo primero que empezamos a observar, adicionalmente nos devuelve que tenemos bastante funciones importadas (al menos 82) las cuales no coloco en imagen para no perderlas de vista:

Num Vaddr Bind Type Name
1 0x10014000 NONE FUNC ADVAPI32.dll_RegQueryValueExA
2 0x10014004 NONE FUNC ADVAPI32.dll_RegOpenKeyExA
3 0x10014008 NONE FUNC ADVAPI32.dll_RegSetValueExA
4 0x1001400c NONE FUNC ADVAPI32.dll_RegCreateKeyA
5 0x10014010 NONE FUNC ADVAPI32.dll_RegCloseKey
1 0x10014018 NONE FUNC KERNEL32.dll_Sleep
2 0x1001401c NONE FUNC KERNEL32.dll_GetModuleHandleA
3 0x10014020 NONE FUNC KERNEL32.dll_CopyFileA
4 0x10014024 NONE FUNC KERNEL32.dll_GetModuleFileNameA
5 0x10014028 NONE FUNC KERNEL32.dll_GetLastError
6 0x1001402c NONE FUNC KERNEL32.dll_GetModuleHandleExA
7 0x10014030 NONE FUNC KERNEL32.dll_AllocConsole
8 0x10014034 NONE FUNC KERNEL32.dll_CreateFileW
9 0x10014038 NONE FUNC KERNEL32.dll_GetStringTypeW
10 0x1001403c NONE FUNC KERNEL32.dll_LCMapStringW
11 0x10014040 NONE FUNC KERNEL32.dll_HeapSize
12 0x10014044 NONE FUNC KERNEL32.dll_HeapAlloc
13 0x10014048 NONE FUNC KERNEL32.dll_EnterCriticalSection
14 0x1001404c NONE FUNC KERNEL32.dll_LeaveCriticalSection
15 0x10014050 NONE FUNC KERNEL32.dll_GetCurrentThreadId
16 0x10014054 NONE FUNC KERNEL32.dll_DecodePointer
17 0x10014058 NONE FUNC KERNEL32.dll_GetCommandLineA
18 0x1001405c NONE FUNC KERNEL32.dll_HeapFree
19 0x10014060 NONE FUNC KERNEL32.dll_CloseHandle
20 0x10014064 NONE FUNC KERNEL32.dll_UnhandledExceptionFilter
21 0x10014068 NONE FUNC KERNEL32.dll_SetUnhandledExceptionFilter
22 0x1001406c NONE FUNC KERNEL32.dll_IsDebuggerPresent
23 0x10014070 NONE FUNC KERNEL32.dll_EncodePointer
24 0x10014074 NONE FUNC KERNEL32.dll_TerminateProcess
25 0x10014078 NONE FUNC KERNEL32.dll_GetCurrentProcess
26 0x1001407c NONE FUNC KERNEL32.dll_SetHandleCount
27 0x10014080 NONE FUNC KERNEL32.dll_GetStdHandle
28 0x10014084 NONE FUNC KERNEL32.dll_InitializeCriticalSectionAndSpinCount
29 0x10014088 NONE FUNC KERNEL32.dll_GetFileType
30 0x1001408c NONE FUNC KERNEL32.dll_GetStartupInfoW
31 0x10014090 NONE FUNC KERNEL32.dll_DeleteCriticalSection
32 0x10014094 NONE FUNC KERNEL32.dll_RtlUnwind
33 0x10014098 NONE FUNC KERNEL32.dll_IsProcessorFeaturePresent
34 0x1001409c NONE FUNC KERNEL32.dll_GetProcAddress
35 0x100140a0 NONE FUNC KERNEL32.dll_GetModuleHandleW
36 0x100140a4 NONE FUNC KERNEL32.dll_ExitProcess
37 0x100140a8 NONE FUNC KERNEL32.dll_WriteFile
38 0x100140ac NONE FUNC KERNEL32.dll_GetModuleFileNameW
39 0x100140b0 NONE FUNC KERNEL32.dll_HeapCreate
40 0x100140b4 NONE FUNC KERNEL32.dll_HeapDestroy
41 0x100140b8 NONE FUNC KERNEL32.dll_TlsAlloc
42 0x100140bc NONE FUNC KERNEL32.dll_TlsGetValue
43 0x100140c0 NONE FUNC KERNEL32.dll_TlsSetValue
44 0x100140c4 NONE FUNC KERNEL32.dll_TlsFree
45 0x100140c8 NONE FUNC KERNEL32.dll_InterlockedIncrement
46 0x100140cc NONE FUNC KERNEL32.dll_SetLastError
47 0x100140d0 NONE FUNC KERNEL32.dll_InterlockedDecrement
48 0x100140d4 NONE FUNC KERNEL32.dll_FreeEnvironmentStringsW
49 0x100140d8 NONE FUNC KERNEL32.dll_WideCharToMultiByte
50 0x100140dc NONE FUNC KERNEL32.dll_GetEnvironmentStringsW
51 0x100140e0 NONE FUNC KERNEL32.dll_QueryPerformanceCounter
52 0x100140e4 NONE FUNC KERNEL32.dll_GetTickCount
53 0x100140e8 NONE FUNC KERNEL32.dll_GetCurrentProcessId
54 0x100140ec NONE FUNC KERNEL32.dll_GetSystemTimeAsFileTime
55 0x100140f0 NONE FUNC KERNEL32.dll_SetStdHandle
56 0x100140f4 NONE FUNC KERNEL32.dll_GetConsoleCP
57 0x100140f8 NONE FUNC KERNEL32.dll_GetConsoleMode
58 0x100140fc NONE FUNC KERNEL32.dll_FlushFileBuffers
59 0x10014100 NONE FUNC KERNEL32.dll_CreateFileA
60 0x10014104 NONE FUNC KERNEL32.dll_LoadLibraryW
61 0x10014108 NONE FUNC KERNEL32.dll_GetCPInfo
62 0x1001410c NONE FUNC KERNEL32.dll_GetACP
63 0x10014110 NONE FUNC KERNEL32.dll_GetOEMCP
64 0x10014114 NONE FUNC KERNEL32.dll_IsValidCodePage
65 0x10014118 NONE FUNC KERNEL32.dll_HeapReAlloc
66 0x1001411c NONE FUNC KERNEL32.dll_WriteConsoleW
67 0x10014120 NONE FUNC KERNEL32.dll_MultiByteToWideChar
68 0x10014124 NONE FUNC KERNEL32.dll_SetFilePointer
69 0x10014128 NONE FUNC KERNEL32.dll_SetEndOfFile
70 0x1001412c NONE FUNC KERNEL32.dll_GetProcessHeap
71 0x10014130 NONE FUNC KERNEL32.dll_ReadFile
1 0x10014138 NONE FUNC USER32.dll_ShowWindow
2 0x1001413c NONE FUNC USER32.dll_GetAsyncKeyState
3 0x10014140 NONE FUNC USER32.dll_GetWindowLongA
4 0x10014144 NONE FUNC USER32.dll_DialogBoxIndirectParamW
5 0x10014148 NONE FUNC USER32.dll_EndDialog
6 0x1001414c NONE FUNC USER32.dll_FindWindowA

Tenemos básicamente 3 bibliotecas dinámicas de las que importamos funciones: user32.dll, kernel32.dll y advapi32.dll. Decidí que para este writeup tengamos un enfoque mas estático de lo que a continuación sucede, ya que en un análisis mas tradicional, continuaríamos por la parte dinámica.

Comenzamos por llamar al shorcut de análisis:

AAAA

Ok, con el análisis completado, veamos que funciones pudimos recuperar:

afl

Como el resultado de afl era muy extenso, decidí convertirlo en tabla:

address nbbs size name
0x10001000 4 85 sub.KERNEL32.dll_Sleep_0
0x10001060 1 425 fcn.10001060
0x10001240 1 1024 fcn.10001240
0x10009340 1 15 fcn.10009340
0x100093b0 1 10 fcn.100093b0
0x100093c0 1 15 fcn.100093c0
0x100093d0 1 15 fcn.100093d0
0x100093e0 1 15 fcn.100093e0
0x100093f0 1 15 fcn.100093f0
0x10009400 1 15 fcn.10009400
0x10009410 1 15 fcn.10009410
0x10009420 1 15 fcn.10009420
0x10009430 1 15 fcn.10009430
0x10009440 6 77 fcn.10009440
0x10009490 1 15 fcn.10009490
0x100094a0 1 15 fcn.100094a0
0x100094b0 1 15 fcn.100094b0
0x100094c0 1 15 fcn.100094c0
0x100094d0 6 77 fcn.100094d0
0x10009520 1 15 fcn.10009520
0x10009530 1 15 fcn.10009530
0x10009540 1 15 fcn.10009540
0x10009550 1 15 fcn.10009550
0x10009560 1 15 fcn.10009560
0x10009570 1 15 fcn.10009570
0x10009580 1 15 fcn.10009580
0x10009590 1 15 fcn.10009590
0x100095a0 1 15 fcn.100095a0
0x100095b0 1 15 fcn.100095b0
0x100097d0 8 108 fcn.100097d0
0x10009840 1 15 fcn.10009840
0x10009850 4 46 fcn.10009850
0x10009880 10 139 fcn.10009880
0x10009910 6 77 fcn.10009910
0x10009960 4 46 fcn.10009960
0x10009990 8 108 fcn.10009990
0x10009a00 4 46 fcn.10009a00
0x10009a30 4 46 fcn.10009a30
0x10009a60 1 15 fcn.10009a60
0x10009a70 4 46 fcn.10009a70
0x10009aa0 6 77 fcn.10009aa0
0x10009af0 3 29 fcn.10009af0
0x10009b10 6 77 fcn.10009b10
0x10009b60 12 173 fcn.10009b60
0x10009c10 1 15 fcn.10009c10
0x10009c20 1 15 fcn.10009c20
0x10009c30 8 108 fcn.10009c30
0x10009ca0 4 46 fcn.10009ca0
0x10009cd0 12 173 fcn.10009cd0
0x10009d80 4 46 fcn.10009d80
0x10009db0 1 15 fcn.10009db0
0x10009dc0 1 15 fcn.10009dc0
0x10009dd0 1 15 fcn.10009dd0
0x10009de0 1 15 fcn.10009de0
0x10009e30 1 10 fcn.10009e30
0x10009e40 1 10 fcn.10009e40
0x10009e50 1 10 sub.RETURN_e50
0x10009e60 1 10 sub.BACKSPACE_e60
0x10009e70 1 10 sub.TAB_e70
0x10009e80 1 10 sub.CTRL_e80
0x10009e90 1 10 sub.DELETE_e90
0x10009ea0 1 10 sub.CAPS_LOCK_ea0
0x10009eb0 114 1274-> 1125 sub.USER32.dll_GetAsyncKeyState_eb0
0x1000a4c0 9 162 sub.KERNEL32.dll_Sleep_4c0
0x1000a570 9 157 sub.ADVAPI32.dll_RegOpenKeyExA_570
0x1000a610 6 103 sub.SOFTWARE__Microsoft__Windows__CurrentVersion__Run_610
0x1000a680 5 275 sub.KERNEL32.dll_AllocConsole_680
0x1000a793 9 109 fcn.1000a793
0x1000a800 7 105 fcn.1000a800
0x1000a86c 1 8 fcn.1000a86c
0x1000a874 16 251 fcn.1000a874
0x1000a972 1 8 fcn.1000a972
0x1000a97a 11 178 fcn.1000a97a
0x1000aa2c 1 10 fcn.1000aa2c
0x1000aa36 1 23 fcn.1000aa36
0x1000aa4d 3 33 fcn.1000aa4d
0x1000aa6e 3 15 -> 277 fcn.1000aa6e
0x1000aa80 4 43 fcn.1000aa80
0x1000aab0 33 6722 -> 305 fcn.1000aab0
0x1000ab2a 16 148 sub.KERNEL32.dll_HeapAlloc_b2a
0x1000abbe 1 33 fcn.1000abbe
0x1000abe0 14 139 fcn.1000abe0
0x1000ac6b 19 258 fcn.1000ac6b
0x1000ad6d 1 10 fcn.1000ad6d
0x1000ad77 1 6 fcn.1000ad77
0x1000ae4e 5 65 sub.KERNEL32.dll_EnterCriticalSection_e4e
0x1000ae8f 3 50 sub.KERNEL32.dll_EnterCriticalSection_e8f
0x1000aec1 4 60 sub.KERNEL32.dll_LeaveCriticalSection_ec1
0x1000aefd 3 47 sub.KERNEL32.dll_LeaveCriticalSection_efd
0x1000af2c 28 356 -> 332 sub.KERNEL32.dll_GetCommandLineA_f2c
0x1000b005 4 20 fcn.1000b005
0x1000b090 23 246 -> 226 fcn.1000b090
0x1000b186 3 35 entry0
0x1000b1a9 4 58 sub.KERNEL32.dll_HeapFree_1a9
0x1000b1e3 13 156 sub.KERNEL32.dll_CloseHandle_1e3
0x1000b27f 12 185 fcn.1000b27f
0x1000b33b 1 8 fcn.1000b33b
0x1000b343 3 38 fcn.1000b343
0x1000b369 4 49 fcn.1000b369
0x1000b39a 9 104 fcn.1000b39a
0x1000b402 8 72 fcn.1000b402
0x1000b44a 17 209 -> 187 fcn.1000b44a
0x1000b4ec 1 17 fcn.1000b4ec
0x1000b51b 1 9 fcn.1000b51b
0x1000b524 1 9 fcn.1000b524
0x1000b52d 1 15 fcn.1000b52d
0x1000b53c 7 297 sub.KERNEL32.dll_IsDebuggerPresent_53c
0x1000b665 1 37 sub.KERNEL32.dll_GetCurrentProcess_665
0x1000b68a 3 45 sub.KERNEL32.dll_DecodePointer_68a
0x1000b6b7 1 16 fcn.1000b6b7
0x1000b6c7 7 66 fcn.1000b6c7
0x1000b709 3 19 fcn.1000b709
0x1000b71c 3 19 fcn.1000b71c
0x1000b72f 1 35 fcn.1000b72f
0x1000b760 1 69 fcn.1000b760
0x1000b7a5 1 20 fcn.1000b7a5
0x1000b94f 13 156 fcn.1000b94f
0x1000b9eb 5 52 fcn.1000b9eb
0x1000ba1f 37 343 fcn.1000ba1f
0x1000bb76 49 581 sub.KERNEL32.dll_GetStartupInfoW_b76
0x1000bdbb 10 83 sub.KERNEL32.dll_DeleteCriticalSection_dbb
0x1000be0e 74 663 sub.UTF_8_e0e
0x1000c0a5 18 295 sub.KERNEL32.dll_InitializeCriticalSectionAndSpinCount_a5
0x1000c1cf 1 9 fcn.1000c1cf
0x1000c1e0 7 144 fcn.1000c1e0
0x1000c2d2 1 23 fcn.1000c2d2
0x1000c2e9 1 25 fcn.1000c2e9
0x1000c302 1 25 fcn.1000c302
0x1000c31b 1 23 fcn.1000c31b
0x1000c332 3 262 loc.1000c332
0x1000c502 4 43 sub.mscoree.dll_502
0x1000c52d 1 23 sub.KERNEL32.dll_ExitProcess_52d
0x1000c545 1 9 fcn.1000c545
0x1000c54e 1 9 fcn.1000c54e
0x1000c557 1 51 fcn.1000c557
0x1000c58a 7 36 fcn.1000c58a
0x1000c5ae 13 151 fcn.1000c5ae
0x1000c645 26 320 sub.KERNEL32.dll_DecodePointer_645
0x1000c785 1 22 fcn.1000c785
0x1000c79b 1 15 fcn.1000c79b
0x1000c7aa 1 30 fcn.1000c7aa
0x1000c7c8 5 38 fcn.1000c7c8
0x1000c7ee 23 431 sub.Runtime_Error_____Program:_7ee
0x1000c99d 5 57 fcn.1000c99d
0x1000c9d6 1 30 sub.KERNEL32.dll_HeapCreate_9d6
0x1000c9f4 1 20 sub.KERNEL32.dll_HeapDestroy_9f4
0x1000ca08 1 15 fcn.1000ca08
0x1000ca17 4 40 sub.KERNEL32.dll_DecodePointer_a17
0x1000ca3f 1 9 sub.KERNEL32.dll_EncodePointer_a3f
0x1000ca51 3 52 sub.KERNEL32.dll_TlsGetValue_a51
0x1000ca85 16 5010 -> 148 sub.KERNEL32.dll_DecodePointer_a85
0x1000cac2 3 156 sub.KERNEL32.DLL_ac2
0x1000cb64 1 9 fcn.1000cb64
0x1000cb6d 1 9 fcn.1000cb6d
0x1000cb76 6 121 sub.KERNEL32.dll_GetLastError_b76
0x1000cbef 3 26 fcn.1000cbef
0x1000cc09 28 279 sub.KERNEL32.dll_InterlockedDecrement_c09
0x1000cd23 1 9 fcn.1000cd23
0x1000cd2f 1 9 fcn.1000cd2f
0x1000cd38 9 110 sub.KERNEL32.dll_TlsGetValue_d38
0x1000cda6 17 379 sub.KERNEL32.DLL_da6
0x1000cf21 11 135 fcn.1000cf21
0x1000cfa8 8 51 fcn.1000cfa8
0x1000cfdb 11 116 fcn.1000cfdb
0x1000d04f 234 2953 sub.KERNEL32.dll_DecodePointer_4f
0x1000dbfb 7 69 sub.KERNEL32.dll_Sleep_bfb
0x1000dc40 7 76 sub.KERNEL32.dll_Sleep_c40
0x1000dc8c 8 78 sub.KERNEL32.dll_Sleep_c8c
0x1000dcda 10 147 sub.KERNEL32.dll_DeleteCriticalSection_cda
0x1000dd6d 1 9 fcn.1000dd6d
0x1000dd76 7 74 sub.KERNEL32.dll_InitializeCriticalSectionAndSpinCount_d76
0x1000de17 1 23 sub.KERNEL32.dll_LeaveCriticalSection_e17
0x1000de2e 13 185 sub.KERNEL32.dll_InitializeCriticalSectionAndSpinCount_e2e
0x1000dee7 1 9 fcn.1000dee7
0x1000def0 4 51 sub.KERNEL32.dll_EnterCriticalSection_ef0
0x1000df23 21 220 fcn.1000df23
0x1000dfff 61 410 fcn.1000dfff
0x1000e199 12 187 sub.KERNEL32.dll_GetModuleFileNameA_199
0x1000e254 13 151 sub.KERNEL32.dll_GetEnvironmentStringsW_254
0x1000e2eb 5 38 fcn.1000e2eb
0x1000e337 40 330 fcn.1000e337
0x1000e481 3 32 fcn.1000e481
0x1000e4a1 9 155 sub.KERNEL32.dll_GetSystemTimeAsFileTime_4a1
0x1000e53c 14 129 sub.KERNEL32.dll_SetStdHandle_53c
0x1000e5bd 15 134 sub.KERNEL32.dll_SetStdHandle_5bd
0x1000e643 8 105 fcn.1000e643
0x1000e6ac 9 145 main
0x1000e742 1 9 fcn.1000e742
0x1000e74b 1 39 sub.KERNEL32.dll_LeaveCriticalSection_74b
0x1000e772 29 400 -> 385 sub.KERNEL32.dll_InitializeCriticalSectionAndSpinCount_772
0x1000e844 1 9 fcn.1000e844
0x1000e902 1 9 fcn.1000e902
0x1000e90b 99 1789 sub.KERNEL32.dll_GetConsoleMode_90b
0x1000f008 12 201 fcn.1000f008
0x1000f0d4 1 8 fcn.1000f0d4
0x1000f0dc 16 206 sub.KERNEL32.dll_FlushFileBuffers_dc
0x1000f1ad 1 8 fcn.1000f1ad
0x1000f1b5 1 8 fcn.1000f1b5
0x1000f1c0 4 53 fcn.1000f1c0
0x1000f200 7 68 fcn.1000f200
0x1000f250 3 139 fcn.1000f250
0x1000f30c 7 86 fcn.1000f30c
0x1000f362 31 356 fcn.1000f362
0x1000f4d0 56 10779 -> 668 fcn.1000f4d0
0x1000f831 144 1844 sub.KERNEL32.dll_CreateFileA_831
0x1000ff65 8 145 fcn.1000ff65
0x1000fffb 5 46 fcn.1000fffb
0x10010029 1 32 fcn.10010029
0x10010049 59 516 fcn.10010049
0x1001024d 1 26 fcn.1001024d
0x10010267 36 332 fcn.10010267
0x100103b3 1 26 fcn.100103b3
0x10010435 8 132 fcn.10010435
0x100104e5 1 31 fcn.100104e5
0x10010504 1 3 fcn.10010504
0x10010540 1 17 sub.KERNEL32.dll_EncodePointer_540
0x10010551 1 30 fcn.10010551
0x1001056f 7 55 fcn.1001056f
0x100105a6 1 13 sub.KERNEL32.dll_DecodePointer_5a6
0x100105b3 43 419 -> 398 sub.KERNEL32.dll_DecodePointer_5b3
0x1001071a 3 15 fcn.1001071a
0x10010756 1 15 fcn.10010756
0x10010765 1 15 fcn.10010765
0x10010774 13 182 sub.KERNEL32.dll_DecodePointer_774
0x1001085b 1 54 fcn.1001085b
0x10010891 1 6 fcn.10010891
0x10010897 1 23 fcn.10010897
0x100108ae 3 35 sub.KERNEL32.dll_EncodePointer_8ae
0x100108d1 23 364 sub.USER32.DLL_8d1
0x10010a3d 16 117 fcn.10010a3d
0x10010ab2 28 205 fcn.10010ab2
0x10010b7f 3 27 fcn.10010b7f
0x10010b9a 12 99 fcn.10010b9a
0x10010bfd 6 63 fcn.10010bfd
0x10010c3c 17 143 sub.KERNEL32.dll_InterlockedIncrement_c3c
0x10010ccb 19 153 sub.KERNEL32.dll_InterlockedDecrement_ccb
0x10010d64 28 331 fcn.10010d64
0x10010eaf 10 77 fcn.10010eaf
0x10010efc 7 109 fcn.10010efc
0x10010f69 1 12 fcn.10010f69
0x10010f75 9 47 fcn.10010f75
0x10010fa4 5 100 fcn.10010fa4
0x10011008 26 400 sub.KERNEL32.dll_GetCPInfo_8
0x10011198 13 152 sub.KERNEL32.dll_InterlockedDecrement_198
0x10011233 1 9 fcn.10011233
0x1001123c 12 124 sub.KERNEL32.dll_GetOEMCP_23c
0x100112b8 37 489 sub.KERNEL32.dll_IsValidCodePage_2b8
0x100114a1 27 410 -> 399 sub.KERNEL32.dll_InterlockedDecrement_4a1
0x10011602 1 9 fcn.10011602
0x1001163b 3 30 fcn.1001163b
0x10011659 1 22 fcn.10011659
0x1001166f 35 341 sub.KERNEL32.dll_WideCharToMultiByte_66f
0x100117c4 1 29 fcn.100117c4
0x100117e1 3 56 fcn.100117e1
0x10011819 1 19 fcn.10011819
0x10011830 11 149 fcn.10011830
0x100118c5 15 130 sub.KERNEL32.dll_HeapAlloc_8c5
0x10011947 18 173 sub.KERNEL32.dll_HeapReAlloc_947
0x100119f4 13 95 fcn.100119f4
0x10011a53 9 83 fcn.10011a53
0x10011aa6 1 24 fcn.10011aa6
0x10011abe 6 66 sub.KERNEL32.dll_WriteConsoleW_abe
0x10011b00 26 278 sub.KERNEL32.dll_MultiByteToWideChar_b00
0x10011c16 1 26 fcn.10011c16
0x10011c30 8 133 sub.KERNEL32.dll_SetFilePointer_c30
0x10011cb5 12 224 fcn.10011cb5
0x10011d95 1 10 fcn.10011d95
0x10011d9f 4 73 fcn.10011d9f
0x10011eeb 33 438 sub.KERNEL32.dll_GetProcessHeap_eeb
0x100120a1 137 1463 sub.KERNEL32.dll_ReadFile_a1
0x10012658 10 117 sub.KERNEL32.dll_SetFilePointer_658
0x100126cd 13 187 fcn.100126cd
0x10012788 3 45 fcn.10012788
0x100127b5 21 226 fcn.100127b5
0x10012897 7 2857 -> 83 fcn.10012897
0x100128ea 30 192 fcn.100128ea
0x100129aa 5 51 fcn.100129aa
0x100129dd 4 32 fcn.100129dd
0x100129fd 3 51 sub.KERNEL32.dll_HeapSize_9fd
0x10012a39 3 887 fcn.10012a39
0x10012db0 12 105 fcn.10012db0
0x10012e19 28 254 fcn.10012e19
0x10012f17 47 487 sub.KERNEL32.dll_MultiByteToWideChar_f17
0x100130fe 3 70 fcn.100130fe
0x10013144 18 231 sub.KERNEL32.dll_MultiByteToWideChar_144
0x1001322b 3 64 fcn.1001322b
0x1001326b 1 31 sub.CONOUT_26b
0x100132a1 19 277 fcn.100132a1
0x100133c0 16 97 fcn.100133c0
0x10013430 1 22 fcn.10013430
0x1001345c 13 184 fcn.1001345c
0x10013674 1 6 sub.KERNEL32.dll_RtlUnwind_674

Si ordenamos esta tabla por tamaño, tomando únicamente los 10 primeros lugares tendríamos algo como lo siguiente:

address nbbs size name
0x1000d04f 234 2953 sub.KERNEL32.dll_DecodePointer_4f
0x1000f831 144 1844 sub.KERNEL32.dll_CreateFileA_831
0x1000e90b 99 1789 sub.KERNEL32.dll_GetConsoleMode_90b
0x100120a1 137 1463 sub.KERNEL32.dll_ReadFile_a1
0x10001240 1 1024 fcn.10001240
0x10012a39 3 887 fcn.10012a39
0x1000be0e 74 663 sub.UTF_8_e0e
0x1000bb76 49 581 sub.KERNEL32.dll_GetStartupInfoW_b76
0x10010049 59 516 fcn.10010049
0x100112b8 37 489 sub.KERNEL32.dll_IsValidCodePage_2b8

Analicemos esas tres funciones muy grandes que no están identificadas:

Se omiten las variables de inicio y se reduce el font para poder tener mayor visibilidad:

pdf de 10001240

Vaya vaya, parece que aquí se esta cargando algo en el stack… mas aun se nota el texto de Flare-On. Desgraciadamente pdf no logro identificar el tamaño completo de la función, pero eso se puede resolver ampliando el bloque:

pd5552 de 10001240

Rango: 0x10001240 - 0x10009335

Esta función no recibe nada ni devuelve nada, pero lo que si es que algo hace porque podemos ver claramente en la imagen la palabra flare-on mientras se sube al stack.

Ahora bien, este podría ser nuestro destino final en caso de éxito, es decir, el win msg. Tomare esto como valido y continuare viendo como llegar hasta aquí…

Para ello lo primero seria ver que funciones llaman a esta función, para ello ubicaremos cuales son las referencias cruzadas e iremos de función en función.

xref 0x10001240

Como podemos observar, fnc 0x10009af0 es la primera y única función que llama a 0x10001240, veamos su contenido:

pdf 0x10009af0

Tenemos una comparación a 0 en 0x100194fc, que en caso de ser mayor a 0, llama a la función winmsg, pero antes va a llamar a otra función, fcn 0x10001060. Veamos que hay en esta función previa:

pd25 @ 0x10009af0

Esta función como podemos observar se encarga de colocar las equivalencias de esas ubicaciones a 0, como alguna especie de controlador/limpiador. Observamos que tiene 91 referencias! He inclusive por su tamaño no pude extraer toda la función, pero debido a que solo se encarga de inicializar/limpiar (no recibe ni devuelve nada), decidí colocarlo en la siguiente tabla:

# Address Value
01 0x10017000 1
02 0x10019460 0
03 0x10019464 0
04 0x10019468 0
05 0x1001946c 0
06 0x10019470 0
07 0x10019474 0
08 0x10019478 0
09 0x1001947c 0
10 0x10019480 0
11 0x10019484 0
12 0x10019488 0
13 0x1001948c 0
14 0x10019490 0
15 0x10019494 0
16 0x10019498 0
17 0x1001949c 0
18 0x100194a0 0
19 0x100194a4 0
20 0x100194a8 0
21 0x100194ac 0
22 0x100194b0 0
23 0x100194b4 0
24 0x100194b8 0
25 0x100194bc 0
26 0x100194c0 0
27 0x100194c4 0
28 0x100194c8 0
29 0x100194cc 0
30 0x100194d0 0
31 0x100194d4 0
32 0x100194d8 0
33 0x100194dc 0
34 0x100194e0 0
35 0x100194e4 0
36 0x100194e8 0
37 0x100194ec 0
38 0x100194f0 0
39 0x100194f4 0
40 0x100194f8 0
41 0x100194fc 0
42 0x10019500 0

Prestando atención al penúltimo resultado, podemos observar que es el valor que hemos evaluado durante la comparación en fcn 0x10009af0, veamos de que manera si podemos escribirlo buscando la referencia hacia esta dirección:

axt 0x100194fc

Como podemos ver, estan las dos funciones que acabamos de explorar, mas una tercera, fcn 0x10009b60, que se encarga de almacenar un 1, justo como buscamos romper el if.

pdf @ 0x10009b60

Tuve nuevamente que reducir el tamaño de fuente para poder tomar la captura.

Bueno, como podemos apreciar, esta función tiene varias cosas diferentes y a la vez comunes con la función anterior. La primera cosa en común es que también es llamada desde sub.USER32.dll_GetAsyncKeyState_10009eb0, presenta un compare, luego set a 0 y finalmente un set a 1 para activar el siguiente flujo o brinco a función.

Su característica principal, es que pareciera que tenemos varios if concatenados, siendo precisos unos 5 cmp, que si ninguno tiene la flag activada, pone en 0 la flag actual y levanta la siguiente. Pero todos los caminos conducen a roma, es decir, todas las comparaciones al final devuelve “o”.

La función anterior (0x10009af0) devolvía “m”, por lo que sea lo que sea GetAsyncKeyState, esta recibiendo estos valores char cuando llama a las funciones.

GetAsyncKeyState

SHORT GetAsyncKeyState(
  int vKey
);

Esta función básicamente recibe la tecla a evaluar y nos devuelve si fue o esta siendo presionada.

Ok, veamos que hace la función sub.USER32.dll_GetAsyncKeyState_10009eb0:

pdf @ sub.USER32.dll\_GetAsyncKeyState\_10009eb0

El primer vistazo, nos revela muchos jumps, inclusive estamos hablando de un switch case, lo cual seria el tipo de loop adecuado para esto.

Las primeras 3 instrucciones corresponden al stack frame de 8 direcciones, las siguientes 11 instrucciones, desde mov eax, 8 hasta cmp edx, 0xde son las condicionales que nos haran mantenernos dentro de un loop de switch case, básicamente desde 8 hasta 222.

pdf @ sub.USER32.dll\_GetAsyncKeyState\_10009eb0

Como podemos ver, cuando se rompe el loop, se retorna 0 y termina la función.

Veamos que sucede dentro de este switch:

pdf @ sub.USER32.dll\_GetAsyncKeyState\_10009eb0

Después de la evaluación inicial, el counter es pasado como argumento a GetAsyncKeyState, es decir si local_4h vale 0x2b, se evaluara si la tecla ‘*’ fue presionada. Ese valor es compartido (tecla presionada ahora o antes) y se compara en el switch, si es no es igual, se va al caso ultimo, si es igual llama a la función correspondiente y brinca hacia el final (0x1000a3a6). En pocas palabras si la tecla “A” o la que sea es presionada, su función correspondiente es llamada.

Esto implica que nosotros controlamos el valor de las flags, presionándolas en el orden correcto debemos llegar a llamar a la función bandera (0x10001240).

Entonces ya que hemos entendido hagamos el reverso de cada letra presionada mediante el siguiente burdo script en python:

#!/usr/bin/env python
  
import r2pipe, os

keys = ["0x10017000","0x10019460","0x10019464","0x10019468","0x1001946c","0x10019470","0x10019474","0x10019478","0x1001947c","0x10019480","0x10019484","0x10019488","0x1001948c","0x10019490","0x10019494","0x10019498","0x1001949c","0x100194a0","0x100194a4","0x100194a8","0x100194ac","0x100194b0","0x100194b4","0x100194b8","0x100194bc","0x100194c0","0x100194c4","0x100194c8","0x100194cc","0x100194d0","0x100194d4","0x100194d8","0x100194dc","0x100194e0","0x100194e4","0x100194e8","0x100194ec","0x100194f0","0x100194f4","0x100194f8","0x100194fc","0x10019500"]

flag = ""

if os.path.isfile("5get_it"):

    r2 = r2pipe.open("5get_it")
    r2.cmd("aaaa")

    for key in keys:
        xrefs = r2.cmdj("axtj " + key)
        for xref in xrefs:
            if xref["opcode"] == "mov dword [" + key + "], 1":
                fcn_called = r2.cmdj("pdfj@" + xref["fcn_name"])
                for eax_ret in fcn_called["ops"]:
                    if "mov eax, 0x100" in eax_ret["disasm"]:
                        flag += r2.cmd("pr 1 @ " + eax_ret["disasm"].split(",")[1])

r2.quit()
print flag

La salida del comando nos devuelve el string:

l0ggingdoturdot5tr0ke5atflaredashondotco

La letra faltante, “m”, se devuelve a la salida del la función de reseteo.

Validemos el DLL contra yara rules:

xbytemx@laptop:~/flare-on2014/challenge05$ yara ~/git/rules/Antidebug_AntiVM_index.yar 5get_it
anti_dbg 5get_it
keylogger 5get_it
win_registry 5get_it
win_files_operation 5get_it

Vemos que da positivo contra tecnicas de antidbg, keylogger, win_registry y win_files_operation. Por ello crearemos un prefix de wine en donde ejecutemos con calma la dll.

Si ejecutamos el dll e ingresamos la salida del comando nos aparecerá el siguiente mensaje:

wineconsole rundll32 5get_it

wineconsole rundll32 5get\_it

Nota: La dll se ejecuta en un prefix recien creado para ser eliminado despues.

Traduciendo al formato de la flag:

flag: l0gging.ur.5tr0ke5@flare-on.com


Espero que les haya gustado.

Saludos,