logo Homepage
+  NewbieContest
Username:
Password:
  Voir les messages
Pages: 1 2 [3] 4 5 6
31  Divers / Cracking / Re : Injection de DLL dans un process le: 08 Août 2016 à 21:01:50
Autrement je n'ai absolument rien compris ton problème.

Ca, c'est fait

Attache test.exe à un débogueur et énumère la liste des DLLs chargées dans le contexte de ton processus pour vérifier que l'injection a correctement abouti.
Tu peux aussi vérifier le nombre de threads dans test.exe puisque tu crées un thread sur le processus cible.

La liste des DLLs (les "executable modules" de Ollydbg) me confirme que ça ne marche pas.
Par contre, si je met mon test.exe dans le "working directory" -si le terme existe sous Windows- de la console, j'ai bien la MessageBox qui pop et ma DLL s'ajoute à la liste.

J'avais pas pensé à regarder les threads et, effectivement, il y a peut-être quelque chose à en tirer : à l'injection il crée un thread qui s'arrête immédiatement.
A voir de plus près.

----

Enfin, peut-on avoir le code de ta DLL ?

FYI, les codes de test.exe et test.dll c'est les templates de CodeBlocks (excepté, donc, l'appel à MessageBoxA que j'ai ajouté).

La DLL - main.cpp :
Code:
#include "main.h"

extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    if(fdwReason == DLL_PROCESS_ATTACH)
    {
        MessageBoxA(NULL, "Fake DLL loaded!", "test.dll", 0);
    }

    return TRUE;
}

La DLL - main.h :
Code:
#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>

/*  To use this exported function of dll, include this header
 *  in your project.
 */

#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif


#ifdef __cplusplus
extern "C"
{
#endif

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__

Le binaire de test :
Code:
#if defined(UNICODE) && !defined(_UNICODE)
    #define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
    #define UNICODE
#endif

#include <tchar.h>
#include <windows.h>

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
TCHAR szClassName[ ] = _T("CodeBlocksWindowsApp");

int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           _T("Code::Blocks Template Windows App"),       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nCmdShow);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}
32  Divers / Cracking / Injection de DLL dans un process le: 08 Août 2016 à 16:36:43
Salut,

J'essaye de coder un "injecteur" de DLL et je me trouve confronté à un problème : ça ne marche que dans un cas.
Mes connaissances en Windows étant quelque peu limitées, à l'aide ! ^^

J'ai trois fichiers :
- test.exe : le binaire dans lequel je veux faire l'injection (en l'occurrence il affiche une fenêtre vide même si ça n'a aucune importance)
- test.dll : la DLL que je veux injecter (elle affiche une MessageBox dans DllMain juste pour que je vois facilement que l'injection est OK)
- inject.exe (cf. plus bas pour le code) : le binaire qui fait l'injection
A l'origine, chacun de ces fichiers était dans un sous-dossier (i.e. un dossier pour chaque code, logique).

Mon inject.exe prend deux arguments : le binaire de test et la DLL.
Pour tester, je lance à la main "test.exe" puis j'exécute en console le inject.exe.

Ma première tentative a été : inject\inject.exe bin_test\test.exe dll_test\test.dll
=> il ne trouve pas le PID de test.exe (normal, il cherche "bin_test\test.exe"...)

Du coup, seconde tentative plus logique : inject\inject.exe test.exe dll_test\test.dll
=> il trouve le PID de test.exe, mais pas de MessageBox

Après pas mal de n'importe quoi j'en suis arrivé à constater que *il faut que test.exe soit dans le dossier courant*.
Autrement dit, il ne faut pas le path pour pouvoir récupérer le PID mais il faut le path pour que l'injection réussisse oO
Etant donné que le nom du fichier de test sert uniquement (ou pas du coup ?) à récupérer le PID, me voila perdu.

Si quelqu'un a une explication, je suis preneur !
Merci d'avance

----

Note : pour simplifier au maximum j'ai supprimé les tests sur l'input + sur les valeurs de retour (elles sont toutes testées et je n'ai aucune erreur btw).

Code:
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>

static DWORD GetProcessPID(char * processName)
{
    /* take a snapshot of running processes */
    HANDLE hProcessesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(PROCESSENTRY32);

    /* get the first running process */
    Process32First(hProcessesSnapshot, &pe32);

    /* loop on the running processes: if we find the target then get its PID */
    DWORD targetPID = 0;
    do
    {
        if(strcmp(pe32.szExeFile, processName) == 0)
        {
            targetPID = pe32.th32ProcessID;
            break;
        }
    }
    while(Process32Next(hProcessesSnapshot, &pe32));

    CloseHandle(hProcessesSnapshot);
    return targetPID;
}

int main(int argc, char * argv[])
{
    char * target = argv[1];
    char * dllPath = argv[2];

    /* get a handle on the target process */
    DWORD dwTargetPID = GetProcessPID(target);
    HANDLE hTargetProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwTargetPID);

    /* allocate memory for the injection */
    void * pReservedSpace = VirtualAllocEx(hTargetProcess, NULL, strlen(dllPath), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    WriteProcessMemory(hTargetProcess, pReservedSpace, dllPath, strlen(dllPath), NULL);

    /* get the address of 'LoadLibraryA' function from kernel32.dll */
    HMODULE hModuleKernel32 = GetModuleHandle("kernel32");
    LPTHREAD_START_ROUTINE pLoadLibrary = (LPTHREAD_START_ROUTINE) GetProcAddress(hModuleKernel32, "LoadLibraryA");

    /* create a remote thread which executes the DllMain function of the injected DLL */
    HANDLE hThread = CreateRemoteThread(hTargetProcess, NULL, 0, pLoadLibrary, pReservedSpace, 0, NULL);

    /* wait until the thread returns*/
    WaitForSingleObject(hThread,INFINITE);

    /* clean and exit */
    VirtualFreeEx(hTargetProcess, pReservedSpace, strlen(dllPath), MEM_COMMIT);
    CloseHandle(hTargetProcess);
    exit(EXIT_SUCCESS);
}
33  Général / Defouloir / Re : Challenge de l'été... Ransonware zepto le: 05 Juillet 2016 à 19:39:08
Salut,
Sous réserve que j'ai bien compris, il y a "Locky" mais aussi un "AutoLocky".
Pour le premier, ou tu payes ou c'est mort (désolé :s) mais pour l'autre tu peux déchiffrer les fichiers.
Va voir ici : http://news.softpedia.com/news/decrypter-available-for-autolocky-locky-ransomware-copycat-503053.shtml
34  Challenges / Aide Forensics / Re : Forensics - Hostname le: 04 Juillet 2016 à 15:05:34
Pour information, je précise juste que les épreuves, bien que présentées par "étapes", sont indépendantes donc tu peux effectivement les résoudre dans n'importe quel ordre
35  Challenges / Aide Forensics / Re : Forensics - Mot de passe oublié le: 04 Juillet 2016 à 15:02:37
Salut,

Je n'oserais pas dire que c'est une question bête, d'autant plus que je me souviens pas trop de tout ça (avec l'âge, les problèmes de mémoire... ).
Si je ne me trompe pas il s'agit ici du compte avec lequel tu te logues /* moderated par the lsd : ah ouais mais ça file un hint de fou ça en fait ^^' */

Pech.
36  Challenges / Aide Forensics / Re : Forensics - Mot de passe oublié le: 10 Mai 2016 à 15:49:05
Salut,
Est-ce qu'il est nécessaire d'avoir le même OS (version majeure + arch) pour résoudre ce challenge ou c'est faisable à la main en cherchant au bon endroit ?
37  Général / Sondage pour le site / Re : Trop d'épreuves sur NC ? le: 26 Avril 2016 à 18:42:17
De mon point de vue, mis à part la catégorie Logique que j'évoquerai ci-dessous, rien ne doit être supprimé : le nom du site est *newbie*contest, donc à moins que je sois complètement à côté de la plaque le site s'adresse dès les premières épreuves à ceux qui n'y connaissent rien (ou presque) !

Pour ce qui est des challs de logique, il m'est arrivé de nombreuses fois de trouver des raisonnements tout à fait logiques sans que ça valide (et je ne suis pas le seul au vu des discussions).
C'est frustrant puisque ça introduit une dose de "chance" : il faut tomber sur la bonne logique parmi toutes celles permettant de trouver une solution :s

En passant, concernant les client side, c'est clairement IMHO la catégorie la plus simple (excepté le dernier chall) et je ne serais pas du tout surpris que ce soit celle où le pourcentage de validations est le plus élevé. De ce fait, il serait effectivement intéressant d'y ajouter de nouveaux challs plus compliqués (mais, désolé, je ne peux pas aider).
38  Général / Général / Re : Re : Re : Le Forensic ! késkecé keca ?! le: 25 Avril 2016 à 23:31:19
Merci Pech pour ton savoir !
si d'autre veulent en parlez n'hesitez pas !

Mon "savoir", c'est un peu excessif mais de rien quand même
Il serait effectivement intéressant d'avoir l'avis de quelqu'un travaillant dans le forensic (il doit bien y en avoir au moins un sur NC !) puisque ce n'est pas mon cas.
J'ai juste été confronté à des "cas support", autrement dit des clients qui appellent le support pour rapporter de potentiels bugs (par exemple) dans le produit qu'on leur a vendu.
Reste alors à pleurer quand on arrive pas à reproduire malgré les infos qu'il nous donne parce que là c'est pas gagné pour résoudre le problème

(oui, je sais, je lance l'éternel troll du "ce chall il aurait sa place dans une autre catégorie" ^^)

CA TOMBE BIEN, ON A UNE CATEGORIE SPECIALE POUR CE GENRE DE CHALLS MAINTENANT \o/


Et le chall a été déplacé ! Victoire \o/
39  Général / Général / Re : Le Forensic ! késkecé keca ?! le: 20 Avril 2016 à 13:42:15
Salut,
Je définirais le forensic comme l'analyse d'un évènement après qu'il se soit produit.
Par exemple, dans le cadre d'une attaque informatique, on va chercher à comprendre comment elle a eu lieu, comment faire pour qu'elle ne se produise pas de nouveau, qui en est le coupable, etc.
Pour cela, on peut entre autres se baser sur les logs (c'est d'ailleurs pour ça qu'il est important de les conserver !).
Un exemple assez complet est le challenge "Analyse d'attaque" ici présent : https://www.newbiecontest.org/index.php?page=epreuve&no=182
(oui, je sais, je lance l'éternel troll du "ce chall il aurait sa place dans une autre catégorie" ^^)
40  News / News du site / Re : Re : Re : Newbie Contest : la version 5 le: 15 Avril 2016 à 17:02:18
3/ Je suis pas contre l'idée, je vois juste pas trop l'intérêt ^^' Une fois que tu as validé le chall, pourquoi tu veux revenir dessus ? Les afterwards ?

Exact, les afterwards
J'admets qu'il suffit d'un clic pour y retourner à partir de la liste de challs dans la catégorie mais je suis fainéant !
Plus sérieusement, ce lien est présent sur la page qui s'affiche après validation donc pourquoi celle-là mais pas l'autre ? (je vois arriver la réponse détestée "c'est historique" T_T)
41  News / News du site / Re : Newbie Contest : la version 5 le: 15 Avril 2016 à 16:06:40
Salut,

Avant tout, félicitations !

Un p'tit bug pas bien grave : quand je mets la souris sur la partie "Informations" ça fait apparaitre l'avatar (jusque là, pas de problème).
Mais si je scroll *sans bouger la souris* alors l'avatar reste visible, "recouvre" le côté droit de la page et c'est impossible (?) de le faire disparaitre.
Seule solution, remonter et passer de nouveau la souris sur les infos.

Autre chose (là c'est juste mon avis, à toi de voir) : pourquoi mettre la liste des gens connectés tout en bas (i.e. à l'endroit où -probablement- personne regarde) plutôt que dans la colonne de droite ?

Pendant que j'y suis, si t'as un peu de temps à perdre (c'était déjà le cas avant) : quand on valide une épreuve et qu'on vote, il n'y a pas le lien "revenir à l'épreuve" (qui est présent avant le vote).
Quoi ? J'abuse ? :p

Pech.

PS : si nécessaire => Win10 (snif...) + Firefox 45.0.2 (dernière version)
42  Général / Général / Re : Petit problème lors de mes débuts le: 04 Avril 2016 à 15:33:56
Salut,

Ainsi que l'a rappelé LoopString, scanner les ports d'une "victime" (comme tu dis) est illégal sauf si il/elle t'y autorise.
Si c'est le cas, cette personne pourra se charger de te donner son IP, non ?

Pech.
43  Challenges / Aide Programmation / Re : Prog - Bonne Pioche le: 29 Février 2016 à 17:58:11
Non.

(Désolé, la tentation était trop forte)

Grrr...
Bravo quand même, je l'avais pas vue venir celle-là 
44  Challenges / Aide Programmation / Re : Prog - Bonne Pioche le: 29 Février 2016 à 17:31:38
Je ne pense pas que quelqu'un ait déjà posé la question donc je tente : y a-t-il quoi que ce soit d'aléatoire dans la génération de l'image (en dehors du choix de la chaîne de caractères) ?
Pour présenter les choses autrement, est-ce qu'une chaîne donnée générera toujours la même image ?
45  Challenges / Aide Programmation / Re : Prog - Bonne Pioche le: 23 Février 2016 à 18:08:30
Salut,

En tout cas je n'ai pas compris le rapport avec la pioche
N'aurais-je pas écrit quelque chose sur le sujet le 8 janvier 2009 à 20:13:50 ?
Mais où est-donc ce message ?
Pages: 1 2 [3] 4 5 6