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:

William said...

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 :)

boub said...

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