Tuesday, May 25, 2010

Question du Jour

Trouve dans une DLL d'un systeme d'exploitation bien connu:

lea eax, [ebp+var_44]
push eax ; hMem
call ds:__imp__LocalFree@4 ; LocalFree(x)

Quelqu'un peut-il me dire:
  1. Pourquoi c'est "mal"?
  2. Quelle est l'erreur du programmeur qui a mene a ce code?
  3. Comment exploiter cela?
Par une operation du Saint Esprit, le code n'est pas atteignable dans la DLL en question. C'est moche.

2 comments:

  1. 1. LEA EAX instead of MOV EAX so LocalFree will end up trying an address that is part of the allocated stack (as opposed to a variable held on that stack).

    2. Probably something like this:

    void bug( HLOCAL mem )
    {
    LocalFree( &mem );
    }

    void foo()
    {
    HLOCAL addr;

    bug( addr );
    }

    So the programmer used 'LocalFree( &mem )' instead of 'LocalFree( mem )' (hence the LEA instead of MOV).

    3. ...something to do with decrementing the HLOCAL's lock count?, or maybe if EAX is a valid handle (to satisfy RtlIsValidHandle in LocalFree) then you could force the free of [EAX+4] which may be attacker controllable, ....but I really have no idea :)

    ReplyDelete
  2. lea eax, [ebp+var_44]
    push eax ; hMem
    call ds:__imp__LocalFree@4 ; LocalFree(x)

    Quelqu'un peut-il me dire:

    1. Pourquoi c'est "mal"?
    Je ne connais rien en faille, toutefois, on pourrait passer un bit/octet a NULL puis forger une saloperie qui attaque un autre truc du systeme ! par contre, il faut faire attention a la canary que visual ou un autre compilateur peut generer pour contre carrer un buffer overflow ? Peut-on remonter dans la pile pour chopper une adresse de Kernel32 ?
    2. Quelle est l'erreur du programmeur qui a mene a ce code?
    Comme l'a dit William c'est un LocalFree(&ptrVersZoneMemoire)
    3. Comment exploiter cela?
    J'en ai pas la moindre idee. Balancer dans ebp+var44 00 puis l'equivalent d'un en hexa
    call a
    db "coucou",0
    :a
    pop esi
    xor edi,edi
    push edi
    push esi
    push esi
    push edi
    call MessageBoxA
    push edi
    Call ExitProcess

    ReplyDelete