dimanche 28 septembre 2008

L'union fait la force.

Me revoilà pour un nouveau post, (un peu tardif me direz vous, mais bon pas toujours facile avec les cours) mais cette fois-ci c'est un peu spécial.
En effet, lilxam et moi même vous proposons aujourd'hui une archive liant deux papers écrit en "collaboration".
Un gros travail d'entraide à été mis en place sur cette série de papers, une expérience à renouveler je pense car très efficace.
Tout cela pour dire que l'on sera surement amené à renouvelé ce type d'opération, hein lilxam :)?

Entrons dans le vif du sujet.

L'archive est composé d'un premier paper signé lilxam traitant des débordements de tampons appliqué et exploité sur php 5.x.
L'approche est vraiment intéréssante car mon chère collègue à due mener de nombreuses recherches sur l'organisation, l'appel des fonctions au seins de php.exe.
Une fois cette étape de franchis, il entamme la recherche de fonctions faillibles en codant un fuzzer like maison qui m'a foi à porté ces fruits :).
Non loin d'une dizaine de fonction faillible sur la version 5.2.6, l'exploitation rentre donc maintenant en jeux.
La technique utilisé est une réécriture de SEH (Structured Exception Handling), afin de rediriger le flot d'éxecution de php sur un vilain shellcode :).
Voilà en gros le fil rouge du paper, le tout est bien sûr agrementé de schéma/screenshots/codes et d'explications :).

Avec le second paper on change complétement de sujet ; je présente en premier temps les TLS CallBacks, puis l'HotPatching, et enfin une à deux petites applications liant les deux "outils" vu precedemment.Rien de bien méchant en tout cas, un contenus très soft :).
J'ai mis à disposition dans l'archive l'éboche, la tentative de rédaction d'une classe cpp (et oui, je m'y mets!) permettant l'implémentation d'une tls callback..la classe est vraiment très simple et peu fiable je pense cependant elle m'aura permis d'allonger du code pour me faire la main avec ce language.

Je vous laisse en compagnie de nos écris :
-L'Union Fait la Force.zip.

En espérant que ça plaira bonne après midi :).

6 commentaires:

Anonyme a dit…

nice, du php =)

Anonyme a dit…

"qui m'a foie à porter ces fruits"

on se demande meme pas qui a ete ton Jedi hein.. :))
meriterais des baffes..

Anonyme a dit…

http://fr.wiktionary.org/wiki/ma_foi

Sinon je comprends pas, 2 sujets différents, même s'il y a eu aide des 2 cotés pourquoi les associer ?

Fin oui, c'est cool, du PHP.
Avouez que vous pouvez pas vous en passer =)

Anonyme a dit…

J'ai posté un comm sans réponse sur le blog de lilxam. Si tu peux y passer pour m'éclairer overclock ce serait cool ;)

0vercl0k a dit…

Hey,
Excuse moi pour le temps de latence, mais comme lilxam je ne suis chez moi la semaine..et je vois qu'il t'a répondu avant même que je ne puisse le faire :).
L'explication étant complète je n'ai rien à ajouter, en espérant que tu auras pris plaisir à lire nos écrits.
Bonne soirée, cordialement 0vercl0k.

Anonyme a dit…

pour Akhenath0n sur EmptyWorkingset
(met les comments en anon comme ici :)

case ProcessQuotaLimits:

return PspQueryQuotaLimits(
ProcessHandle,
ProcessInformationClass,
ProcessInformation,
ProcessInformationLength,
ReturnLength,
PreviousMode
);



NTSTATUS
PspQueryQuotaLimits(
IN HANDLE ProcessHandle,
IN PROCESSINFOCLASS ProcessInformationClass,
OUT PVOID ProcessInformation,
IN ULONG ProcessInformationLength,
OUT PULONG ReturnLength OPTIONAL,
IN KPROCESSOR_MODE PreviousMode
)
{
QUOTA_LIMITS QuotaLimits;
PEPROCESS Process;
KIRQL OldIrql;
NTSTATUS st;
PEPROCESS_QUOTA_BLOCK QuotaBlock;

if ( ProcessInformationLength != (ULONG) sizeof(QUOTA_LIMITS) ) {
return STATUS_INFO_LENGTH_MISMATCH;
}

st = ObReferenceObjectByHandle(
ProcessHandle,
PROCESS_QUERY_INFORMATION,
PsProcessType,
PreviousMode,
(PVOID *)&Process,
NULL
);
if ( !NT_SUCCESS(st) ) {
return st;
}


QuotaBlock = Process->QuotaBlock;

MmLockPagableSectionByHandle(ExPageLockHandle);

if ( QuotaBlock != &PspDefaultQuotaBlock ) {
ExAcquireSpinLock(&QuotaBlock->QuotaLock,&OldIrql);

QuotaLimits.PagedPoolLimit = QuotaBlock->QuotaPoolLimit[PagedPool];
QuotaLimits.NonPagedPoolLimit = QuotaBlock->QuotaPoolLimit[NonPagedPool];
QuotaLimits.PagefileLimit = QuotaBlock->PagefileLimit;
QuotaLimits.TimeLimit.LowPart = 0xffffffff;
QuotaLimits.TimeLimit.HighPart = 0xffffffff;

ExReleaseSpinLock(&QuotaBlock->QuotaLock,OldIrql);
} else {
QuotaLimits.PagedPoolLimit = (SIZE_T)-1;
QuotaLimits.NonPagedPoolLimit = (SIZE_T)-1;
QuotaLimits.PagefileLimit = (SIZE_T)-1;
QuotaLimits.TimeLimit.LowPart = 0xffffffff;
QuotaLimits.TimeLimit.HighPart = 0xffffffff;
}

QuotaLimits.MinimumWorkingSetSize =
Process->Vm.MinimumWorkingSetSize << PAGE_SHIFT;
QuotaLimits.MaximumWorkingSetSize =
Process->Vm.MaximumWorkingSetSize << PAGE_SHIFT;

ObDereferenceObject(Process);

//
// Either of these may cause an access violation. The
// exception handler will return access violation as
// status code. No further cleanup needs to be done.
//

try {
*(PQUOTA_LIMITS) ProcessInformation = QuotaLimits;

if (ARGUMENT_PRESENT(ReturnLength) ) {
*ReturnLength = sizeof(QUOTA_LIMITS);
}
} except(EXCEPTION_EXECUTE_HANDLER) {
;
}

MmUnlockPagableImageSection(ExPageLockHandle);
return STATUS_SUCCESS;
}