Risolto Aggiungere msgbox nell'exe

A77ila

Utente Silver
31 Agosto 2014
207
28
95
Salve ragazzi,
stamattina risolvendo un crackme in dos,mi è venuto lo sfizio di aggiungere un msgbox che all'apertura del programmino mostrasse un id e un seriale,(ho visto che qualcuno adoperava questa cosa,però andando a modificare una msgbox già esistente,magari quella dell'errore).
Comunque leggendo qualcosa ecco cosa ho capito:
Ho aggiunto una nuova sezione con PEtools
Immagine1.png
Ho utilizzato la funzione RebuildPE altrimenti non partiva il programma.
Da come ho capito adesso dovrei cambiare il mio entrypoint con quello della mia sezione,poi dopo nella mia sezione devo ritornare il mio OEP,non so come procedere però.
Cosa devo inserire invece di push ebp?
im2.png
Questa poi è la sezione che ho appena creata,pensavo sarebbe stata riempita da tutti 0,ma non mi sembra sia cosi,perchè?
Perdonate magari le domande stupide,ma sto imparando
im3.png


im4.png
 

JunkCoder

Moderatore
5 Giugno 2020
753
599
345
Per aggiungere una MessageBox che prima non esisteva in un eseguibile compilato ci sono diverse cose che devi considerare:
  • MessageBox[A|W] e' presente nella IAT?
    • Si
      • ; ... push parametri a MessageBoxA
      • call MessageBoxA
    • No
      • push ptr->"user32.dll"
      • call LoadLibraryA
      • push ptr->"MessageBoxA"
      • push eax ; hModuleUser32
      • call GetProcAddress
      • ; ... push parametri a MessageBoxA
      • call eax
  • Le stringhe da passare come parametro sono:
    • Aggiunte in .rdata
      • push puntatore
    • Direttamente nel codice (es. spezzettate in DWORD ed assemblate a runtime)
Dopodiche' valuta dove mettere il tuo shellcode, puoi appunto creare una nuova sezione r-x e impostare li' l'EntryPoint nell'header del PE, oppure sovrascrivendo qualunque punto della .text originale. Potresti anche non cambiare il puntatore all'entrypoint ma mettere come prima istruzione una call che fa da trampolino al tuo shellcode che poi puo' riprendere l'esecuzione normale tramite ret (ma prima di ritornare dovresti eseguire le istruzioni sovrascritte, anche se una o due essendo pochi byte di opcode).

Non ho mai usato PETools per cui non so dirti se e' normale che venga inizializzata con quelle istruzioni.
 
  • Mi piace
Reactions: A77ila

A77ila

Utente Silver
31 Agosto 2014
207
28
95
Grazie mille per l'aiuto,
sono risucito a seguirti fino ad un certo punto,ho cambiato EP nell'header e l'ho messo alla mia sezione,ho anche provato a mettere il jmp all'OEP del programma e funziona tutto.
Ora la messagebox deve essere aggiunta alla IAT,però non mi sono chiare alcune istruzioni:
  • push ptr->"user32.dll" questa non mi viene riconosciuta come espressione
  • call LoadLibraryA Questa l'ho cercata su google e viene passato 1 parametro che penso sia quello di sotto
  • push ptr->"MessageBoxA"
  • push eax ; hModuleUser32 "non saprei "
  • call GetProcAddress "questa l'ho trovata su internet e ho capito che accetta come parametri l'handle del modulo dll restituito da LoadLibrary "
  • ; ... push parametri a MessageBoxA "i parametri della msg li conosco"
  • call eax
Come puoi vedere sono in alto mare,ma ti chiedo di avere un po' di pazienza
Ti ringrazio ancora
 
Banner pubblicitario per Bright Data su Inforge.net azienda di vendita Proxy, Data Collector e Content Unlocker
DOWNLOAD

JunkCoder

Moderatore
5 Giugno 2020
753
599
345
Grazie mille per l'aiuto,
sono risucito a seguirti fino ad un certo punto,ho cambiato EP nell'header e l'ho messo alla mia sezione,ho anche provato a mettere il jmp all'OEP del programma e funziona tutto.
Ora la messagebox deve essere aggiunta alla IAT,però non mi sono chiare alcune istruzioni:
  • push ptr->"user32.dll" questa non mi viene riconosciuta come espressione
  • call LoadLibraryA Questa l'ho cercata su google e viene passato 1 parametro che penso sia quello di sotto
  • push ptr->"MessageBoxA"
  • push eax ; hModuleUser32 "non saprei "
  • call GetProcAddress "questa l'ho trovata su internet e ho capito che accetta come parametri l'handle del modulo dll restituito da LoadLibrary "
  • ; ... push parametri a MessageBoxA "i parametri della msg li conosco"
  • call eax
Come puoi vedere sono in alto mare,ma ti chiedo di avere un po' di pazienza
Ti ringrazio ancora

Il mio esempio era assembly misto a pseudo codice. Se MessageBoxA non e' presente nella IAT allora non devi necessariamente aggiungerla, infatti in quell'esempio viene caricata dinamicamente. Le API di Windows x86 usano come calling convention stdcall, quindi devi fare push dei parametri da destra a sinistra e poi la call. Come hai visto LoadLibrary prende come parametro una stringa, che e' il nome della libreria da caricare (in questo caso user32.dll). Dopodiche' va chiamata GetProcAddress per trovare l'indirizzo di MessageBoxA; GetProcAddress ha due parametri: l'HMODULE della libreria (viene ritornato da LoadLibrary, quindi si trova in eax) e il nome della funzione esportata da cercare come stringa.

Per push ptr->"user32.dll" intendo dire che devi fare push del puntatore alla stringa "user32.dll" che devi mettere da qualche parte (ho specificato dopo che puoi metterla in .rdata o costruirla a runtime ad esempio nello stack).

La firma di MessageBoxA e':
C:
int MessageBoxA(
  HWND    hWnd,
  const char* lpText,
  const char* lpCaption,
  UINT    uType
);

Per cui dovrai passare i parametri da destra a sinistra, ad esempio:
Codice:
; ...
; Pseudocodice di quello fatto fin ora:
; eax = GetProcAddress(LoadLibaryA("user32.dll"), "MessageBoxA")
push 64
push ptr->"Titolo Messaggio"
push ptr->"Testo Messaggio"
push 0 ; come hWnd passiamo 0
call eax ; puntatore a MessageBoxA

Nota: uType e' una bitmask ed = 64 significa che il messaggio avra' come icona i (tipo informazione) e come button solo OK.
Tutta la documentazione su MessageBoxA qui.

Se invece il programma da modificare e' a 64 bit dovrai usare fastcall al posto di stdcall, che richiede una procedura diversa.

Un consiglio per facilitare: quando all'inizio non ero pratico di assembly e dovevo fare uno shellcode semplicemente lo scrivevo in C, lo compilavo e poi estraevo l'assembly prodotto con un debugger. Se prendi questa strada ricorda di non chiamare funzioni esterne a parte LoadLibrary e GPA (per quelle due modificherai le istruzioni a mano se necessario) e non usare stringhe dichiarate normalmente altrimenti andranno a finire in .rdata e non potrai estrarle, esempio:

C++:
// No:
const char* msg = "Testo";

// Si (anche se esistono metodi piu' carini):
char msg[6];
msg[0] = 'T';
msg[1] = 'e';
//...
msg[5] = 0;
 
  • Mi piace
Reactions: A77ila

DispatchCode

Moderatore
24 Maggio 2016
401
262
193
Io anni fa scrissi una cosa simile, come esempio, in Assembly.
Assumevo forse che la MessageBox fosse presente nella IAT.

Non so dirti se funziona ancora, essendo un esempio c'erano sicuro casi non funzionanti e con il passare del tempo chissà che altro si è aggiunto. :)

Nel readme spiegavo ciò che andavo a fare, se non vuoi leggere le 1000 righe di asm.

 
  • Mi piace
Reactions: A77ila
Banner pubblicitario per Bright Data su Inforge.net azienda di vendita Proxy, Data Collector e Content Unlocker
Supporta Inforge con una donazione

A77ila

Utente Silver
31 Agosto 2014
207
28
95
Io anni fa scrissi una cosa simile, come esempio, in Assembly.
Assumevo forse che la MessageBox fosse presente nella IAT.

Non so dirti se funziona ancora, essendo un esempio c'erano sicuro casi non funzionanti e con il passare del tempo chissà che altro si è aggiunto. :)

Nel readme spiegavo ciò che andavo a fare, se non vuoi leggere le 1000 righe di asm.

Grazie mille darò un'occhiata allora!