Anti-Sandbox code with norman

Unser alter Freund Norman bezeichnet niemand anders, als die Sandbox von norman.no. Sie ist eine virtuelle Maschine, welche eine Verhaltensanalyse von Binaries durchführt.

Mit anderen Worten, seit dem Nepenthes-Modul submit_norman, einer der grössten Feinde der Botnet-Kiddies, da durch sie schon viele Botnetze identifiziert wurden.

Nachdem ich einige Samples gefunden habe, welche die Sandbox erkennen, habe ich mich mit dem Thema genauer befasst.

#include <stdio.h>
#include <windows.h>

void main()
{
MessageBox(NULL, „Hello World“, „My first C program“, MB_OK);
}

Diese Zeilen Code erinnern an die Anfänge des Programmierens, der einfachen Hello-World Programme. Mit diesem Code testen wir die Grundfunktionen der Sandbox. Das Ergebnis der Sandbox ist durchaus zufriedenstellend:

Test.exe : Not detected by sandbox (Signature: NO_VIRUS)
[ General information ]
* Display message box (My first C program) : Hello World
* File length: 36864 bytes.

Unser Programm wird ordnungsgemäss analysiert. Ich gehe aufgrund der Informationen davon aus, dass die Sandbox keine normalen Windows DLLs verwendet. Desweiteren ist es beruhigend zu wissen, dass Ausgaben der Programme angezeigt werden. Auf diese Art und Weise kann man den Speicher der Sandbox anzapfen:

#include <stdio.h>
#include <windows.h>

void main()
{
char szBuffer[512];
DWORD dwAddr = (DWORD)GetProcAddress(LoadLibrary(„user32.dll“), „MessageBoxA“);
//Get the address of any WINAPI function, we use MessageBoxA() in this example.

memset(szBuffer, 0, sizeof(szBuffer));
_snprintf(szBuffer, sizeof(szBuffer) – 1, „[ 0x%x, 0x%x, 0x%x, 0x%x, 0x%x ]“, *(BYTE*)dwAddr, *(BYTE*)(dwAddr + 1), *(BYTE*)(dwAddr + 2), *(BYTE*)(dwAddr + 3), *(BYTE*)(dwAddr + 4));
//Read the first 5 bytes of connect() into the buffer

MessageBox(NULL, szBuffer, „The Title“, MB_OK);
//Display the messagebox
}

Das Ergebnis der Sandbox, wie folgt:

Test.exe : Not detected by sandbox (Signature: NO_VIRUS)
[ General information ]
* Display message box (The Title) : [ 0xc8, 0x0, 0x4, 0x0, 0x60 ].
* File length: 40960 bytes.

Der interessante Teil ist die Speicheradresse, in welcher unsere Messagebox MessageBoxA geladen ist. Vergleichen wir diese mit einem normalen Windows-PC.

„[ 0x8b 0xff 0x55 0x8b 0xec ]“

Die beiden Werte sind sehr unterschiedlich und bieten uns eine Art Fingerabdruck anhand dessen wir die Sandbox überlisten können, wie folgendes Codebeispiel ansatzweise umreisst:

#include <stdio.h>
#include <windows.h>

void main()
{
unsigned char szBytes[] = { 0xc8, 0x0, 0x4, 0x0, 0x60 };
DWORD dwAddr = (DWORD)GetProcAddress(LoadLibrary(„user32.dll“), „MessageBoxA“);

if(!memcmp((LPVOID)dwAddr, (LPVOID)szBytes, sizeof(szBytes)))
{
MessageBox(NULL, „Hello Norman.“, „Detected.“, MB_OK);
ExitProcess(0);
//Exit the process cleanly so it stops execution and logging of the file
}

MessageBox(NULL, „You will not see that message in the sandbox“, „Hidden.“, MB_OK);
}

Die Sandbox arbeitet unser Script mit folgendem Ergebnis ab:

Test3.exe : Not detected by sandbox (Signature: NO_VIRUS)
[ General information ]

* Display message box (Detected.) : Hello Norman.
* File length: 36864 bytes.

Lokal ausgeführt hingegen, bekommen wir unsere Messagebox „You will not see that message in the sandbox“ zu sehen. Das Ergebnis dieses kleinen Experiments ist wie folgt: Windows bleibt Windows und eine Sandbox ist eine Sandbox… und alles hat seine Merkmale.

Author:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert