de lart binaire           des PEs explosifs fait main   Ange Albertini        3 Novembre 2012http://corkami.com        Luc...
version longue●    la présentation avait une 60aine de diapos●   celle-ci en a plus de 140    ●   plus dexplications    ● ...
planquest-ce quun PE?  le problème et mon approchevue densemble du format PEpièges classiquesnouvelles astuces            ...
Portable Executablebasé surCommon Object File Format
exécutables Windows, mais aussi●   presque tous les exécutables depuis 1993    ●   32bits, 64bits, .Net    ●   DLL, pilote...
PEbinaire Windows    universel            depuis 1993
pe101.corkami.com
le problème...
crimes & châtiments●   la documentation officielle est pauvre et floue    ●   décrit juste des PEs standards    ●   totale...
“le guide naïf des PEs standards”
CVE-2012-2273version_mini               ibkernel
normal
...et mon approche
en partant de zéro●   analyser ce quon trouve dans la nature    ●   devoir attendre le virus/bug suivant?●   écrire le bin...
brique par brique
un exécutable complet
pe.corkami.com
Fichier    PE    (Appended data)
défini par len-tête PEdata                           PEAppended                           PE
PE     en-tête     Sections         code, données...
en-tête     MZ       en-tête DOS             depuis IBM PC-DOS 1.0 (1981)     PE (ou NE/LE/LX/VZ/...)      en-têtes modern...
en-tête     en-tête DOS     (code DOS)  16 bits     (en-tête Rich)   infos de compil.    en-têtes PE
code DOS   ● code 16bits obsolète     ● affiche message & termine   ● encore présent dans les PEs     ● même les 64 bits  ...
en-tête Rich● information de compilation● officiellement non documentée  ● chiffrement xor32 pitoyable● complètement couve...
en-tête DOS●   obsolète    ●   utilisé uniquement si exécuté en mode DOS    ●   ignoré dans les autres cas●   indique où l...
en-têtes PE                          en-têtes NT   PE00   File header      déclare ce qui suit   Optional header       pas...
File header●   combien de section(s)?●   y a-t-il un Optional Header?●   32b or 64b, DLL ou EXE...
valeurs de NumberOfSections●   0: Corkami :p●   1: packer●   3-6: standard    ●   code, données, données (non) initialisée...
Optional header●   propriétés géométriques    ●   alignements, début en mémoire, taille●   indique où lexécution démarre● ...
Sections●   définir lorganisation en mémoire:    ●   où sera chargée telle partie du fichier    ●   à quelles fins? (inscr...
Data Directory●   (RVA, Size) DataDirectory[NumbersOfRvaAndSizes]●   chacun des 16 premiers, en standard, a une    utilité...
PE                             DLL...call [API]                   API: ……                                ret         Impor...
Exports●   3 pointeurs vers 3 listes●   définir en parallèle (nom, adresse, numéro)    ●   une adresse peut avoir plusieur...
Imports●   une liste à zéro terminal de descripteurs    ●   dhabitude, un par DLL●   chaque descripteur spécifie    ●   un...
Relocations●   les PEs ont des ImageBases standard    ●   EXE: 0x400000, DLL 0x1000000        → conflits entre DLLs       ...
Resources●   icones, dialogues, numéro de version, ...●   nécessite juste 3 appels de fonctions        → utilisé partout● ...
Thread Local Storage●   Callbacks exécutés au démarrage et à larrêt de    chaque thread    ●   avant lEntryPoint    ●   ap...
32 bits ↔ 64 bits●   IMAGE_FILE_HEADER.Machine    ●   0x14c I386 ↔ 0x8664 AMD64●   IMAGE_OPTIONAL_HEADER.Magic    ●   0x10...
NumberOfSections●   96 sections (XP)●   65536 Sections (Vista ou ultérieur)        → suffisant pour faire planter des outi...
maxsecXP65535sects
SizeOfOptionalHeader●   sizeof(OptionalHeader)    ●   ce qui donnerait 0xe0 (32b)/0xf0 (64b)    ●   beacoup doutils naïfs ...
PE sans section●   mode standard:    ●   200 ≤ FileAlignment ≤ SectionAlignment    ●   1000 ≤ SectionAlignment●   mode pil...
1 ≤ FileAlignment == SectionAlignment ≤ 800                                        nosection*
TinyPEexemple classique de malformation manuelle    ●   en-tête PE dans len-tête DOS    ●   OptionalHeader tronqué●   ne n...
tiny*
double en-têtes pliablesles DD sont pris en compte après chargementhttp://www.reversinglabs.com/advisory/pecoff.php1.dépla...
foldedhdr
EntryPoint nul●   pour les EXEs    ●   MZ désassemblé en tant que dec ebp/pop edx          (pas dappel à DllMain si lEP es...
EntryPoint virtuel●   1er octet absent physiquement dans le fichier    ●   00 C0 => add al, al                            ...
TLS à la volée●   la liste des callbacks est m-a-j à la volée    ●   le callback #1 ajoute un callback #2                 ...
TLS ignoré●   le TLS nest pas exécuté si seul kernel32 est importée    ●   et si aucune DLL important kernel32 est importé...
points terminaux superflus●   uniquement sous XP●   trivial    ●   les points en fin de nom de DLL sont ignorés●   certain...
dll-ld
boucles dans les Ressources●   boucles (infinies)    ●   ignorées lors le chargement    ●   ignorées si le chemin pour att...
resourceloop
EntryPoint modifié par une DLL statiqueles DLLs statiques sont appelé avant lEntryPoint●   DllMain reçoit le thread contex...
ctxt*
Win32VersionValue●   officiellement reserved    ●   should be null●   utilisé en réalité pour forcer les informations de v...
winver
★Nouvelles★ astuces
Characteristics●   IMAGE_FILE_32BIT_MACHINE    ●   vrai même en 64 bits    ●   non requis!!●   IMAGE_FILE_DLL    ●   non r...
mininormal64
dllnomain*
descripteurs dImports●   INT factice ou absente    ●   uniquement DllName et IAT sont requis●   le descripteur est sauté s...
dd OriginalFirstThunkdd TimeDateStampdd ForwarderChain----------------------------dd Namedd FirstThunk                    ...
Imports torturésmalformation complexe●   DllName sans extension●   IAT dans le descriptor    ●   lINT presque valide est i...
corkamix
DD Exceptions●   64 bits Structured Exception Handler    ●   avec beaucoup de code rajouté par le compilateur●   utilisé p...
exceptions
seh_change64
Relocations●   autorise nimporte quelle ImageBase    ●   requises pour les adresses absolues: code, TLS,        .Net●   ig...
ibknoreloc64        no_dd
fakerelocs             ibreloc
types de Relocations (en théorie)HIGHLOW ●   delta dImageBase standardABSOLUTE ●   ne fait rien ●   juste utilisé pour lal...
type de Relocations en pratique●   les types 6 et 7 sont ignorés    ●   alors que le type 8 est interdit●   le type 4 (HIG...
un peu dhistoire●   HIGHADJ est là depuis le début●   MIPS était reconnu mais rejeté par Win95●   NT3.1 introduit MIPS – s...
samuser avec les relocations●   4 types ne font en fait rien●   tous peuvent être utilisés sur une adresse factice    ●   ...
reloccrypt
reloccrypt
reloccrypt
Code dans len-tête●   len-tête est exécutable    ●   les packers y mettent code ou données●   beaucoup de champs inutilisé...
maxvals
hdrcode
traceless
.Netétapes du chargement:1.chargement du PE  •   uniquement les imports (DD[1]) à cette étape2.appel de MSCoree.dll3.charg...
PE    .NET  ...     ...imports   ...  ...     ...  ...     ...  ...     ...  ...   relocs  ...     ...  ...     ...  ...  ...
PE sans zéro●    LoadlibraryEx   avec LOAD_LIBRARY_AS_DATAFILE●   un PE de données nécessite uniquement    MZ, e_lfanew, P...
d_nonnull-*
uniquement des resources●   1 seule section valide    ●   65535 sections sous XP!●   1 DataDirectory
d_resource*
subsystems●   pas de différences particulières    ●   alignements bas pour les pilotes    ●   imports incompatibles: NTOSK...
multiss*
un PE nu avec du code●   alignments bas → pas de sections●   pas dimports → APIs chargées à la main●   TLS → pas dEntryPoi...
nothing*
EntryPoint externe (1/2)●   dans une DLL (sans relocations)                                      dllextEP
EntryPoint externe (2/2)●   mémoire allouée juste avant par le TLS                                             tls_virtEP
EntryPoint ignoréle TLS termine lexécution mais sera rappelé ensuite                                                 tls_n...
du noyau à lutilisateur●   le déboguage noyau est compliqué    ●   alors que les packers noyau sont limités1.changer le su...
ntoskrnl
TLS AddressOfIndex●   pointeur vers un double mot●    reçoit 0, 1... au chargement du nème TLS●   astuce dynamique facile ...
tls_aoiOSDET
Manifest●   ressource XML    ●   peut faire échouer le chargement    ●   peut faire planter le SE! (KB921337)●   difficile...
corruption de DllMain/TLS●   DllMain et TLS ont juste besoin de restaurer ESI    ●   même ESP peut être corrompu    ●   an...
fakeregs
un PE quine●   afficher son code source    ●   totalement inutile – très divertissant :D●   remplir len-tête DOS de caract...
quine
un polyglotte binaire●   ajouter %PDF dans les 400h premiers octets      → votre PE est aussi un PDF (→ Acrobat)●   ajoute...
corkamix
Conclusion
Conclusion●   le format des exécutables de Windows est    complexe●   la majeure partie est documentée, mais cest un    vr...
des questions?Merci à              Fabian Sauter, Peter Ferrie, ‫وليد عصر‬Bernhard Treutwein, Costin Ionescu, Deroko, Ivan...
Merci!Ange Albertini @gmail.com @ange4771    http://corkami.com
Bonus
pas du PE, mais quand même amusant
formats anciens●   en 32b, Windows gère encore les EXE et COM    ●   moins courant, ils échappent aux détections●   un EXE...
exe2pe, dosZMXP
aa86drop.com
archéologie binaire●   les polices pt/pt (.FON) sont en format NE    ●   crée en 1985 pour Windows 1.0●   vgasys.fon toujo...
instruction en état débriété●   Lock:Prefetch    ●   ne peut pas être exécutée (illégale)●   fonctionne bizarrement sous W...
this is the end...my only friend, the end...      (les Portes)
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
de l'art binaire: des PEs explosifs fait main
Prochain SlideShare
Chargement dans…5
×

de l'art binaire: des PEs explosifs fait main

691 vues

Publié le

une vue d'ensemble des exécutables Windows et de leurs malformations.
voir http://hashdays2012.corkami.com pour plus d'informations (en anglais)

Publié dans : Business
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
691
Sur SlideShare
0
Issues des intégrations
0
Intégrations
15
Actions
Partages
0
Téléchargements
13
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

de l'art binaire: des PEs explosifs fait main

  1. 1. de lart binaire des PEs explosifs fait main Ange Albertini 3 Novembre 2012http://corkami.com Lucerne, Suisse
  2. 2. version longue● la présentation avait une 60aine de diapos● celle-ci en a plus de 140 ● plus dexplications ● plus dexemples
  3. 3. planquest-ce quun PE? le problème et mon approchevue densemble du format PEpièges classiquesnouvelles astuces © ID software
  4. 4. Portable Executablebasé surCommon Object File Format
  5. 5. exécutables Windows, mais aussi● presque tous les exécutables depuis 1993 ● 32bits, 64bits, .Net ● DLL, pilotes, ActiveX...● aussi comme conteneur de données ● icones, chaînes, dialogues, images... omniprésent sous Windows mais aussi EFI, portables CE, Xbox,... (mais pas couvert ici)
  6. 6. PEbinaire Windows universel depuis 1993
  7. 7. pe101.corkami.com
  8. 8. le problème...
  9. 9. crimes & châtiments● la documentation officielle est pauvre et floue ● décrit juste des PEs standards ● totalement insuffisante● plantage (OS, security tools)● empêche de développer ses propres outils● gêne lautomatisation et le tri ● PE ou pas? ● corrompu ou malveillant?● les meilleurs outils échouent → ça empêche même lanalyse manuelle
  10. 10. “le guide naïf des PEs standards”
  11. 11. CVE-2012-2273version_mini ibkernel
  12. 12. normal
  13. 13. ...et mon approche
  14. 14. en partant de zéro● analyser ce quon trouve dans la nature ● devoir attendre le virus/bug suivant?● écrire le binaire entier à partir de zéro● manuellement ● pas de limites dûes à un compilateur ● des PoCs concises→ meilleure couverture de lensemble je partage mes connaissances et mes PoCs
  15. 15. brique par brique
  16. 16. un exécutable complet
  17. 17. pe.corkami.com
  18. 18. Fichier PE (Appended data)
  19. 19. défini par len-tête PEdata PEAppended PE
  20. 20. PE en-tête Sections code, données...
  21. 21. en-tête MZ en-tête DOS depuis IBM PC-DOS 1.0 (1981) PE (ou NE/LE/LX/VZ/...) en-têtes modernes depuis Windows NT 3.1 (1993)
  22. 22. en-tête en-tête DOS (code DOS) 16 bits (en-tête Rich) infos de compil. en-têtes PE
  23. 23. code DOS ● code 16bits obsolète ● affiche message & termine ● encore présent dans les PEs ● même les 64 bits PoC: compiled
  24. 24. en-tête Rich● information de compilation● officiellement non documentée ● chiffrement xor32 pitoyable● complètement couvert par Daniel Pistelli http://ntcore.com/files/richsign.htm PoC: compiled
  25. 25. en-tête DOS● obsolète ● utilisé uniquement si exécuté en mode DOS ● ignoré dans les autres cas● indique où len-tête PE se trouve
  26. 26. en-têtes PE en-têtes NT PE00 File header déclare ce qui suit Optional header pas dans .obj table des Sections organisation mémoire
  27. 27. File header● combien de section(s)?● y a-t-il un Optional Header?● 32b or 64b, DLL ou EXE...
  28. 28. valeurs de NumberOfSections● 0: Corkami :p● 1: packer● 3-6: standard ● code, données, données (non) initialisées, imports, ressources...● 16: free basic :D ● à quoi bon?
  29. 29. Optional header● propriétés géométriques ● alignements, début en mémoire, taille● indique où lexécution démarre● 32/64b, pilote/standard/ligne de commande● beaucoup dinformations non cruciales● data directory
  30. 30. Sections● définir lorganisation en mémoire: ● où sera chargée telle partie du fichier ● à quelles fins? (inscriptible, exécutable...)
  31. 31. Data Directory● (RVA, Size) DataDirectory[NumbersOfRvaAndSizes]● chacun des 16 premiers, en standard, a une utilité particulière → distincts, on les met souvent au pluriel
  32. 32. PE DLL...call [API] API: …… ret Imports Exports
  33. 33. Exports● 3 pointeurs vers 3 listes● définir en parallèle (nom, adresse, numéro) ● une adresse peut avoir plusieurs noms
  34. 34. Imports● une liste à zéro terminal de descripteurs ● dhabitude, un par DLL● chaque descripteur spécifie ● un nom de DLL ● 2 listes de pointeurs à zéro terminal – noms dAPI et futures adresses● ImportsAddressTable indique la liste des adresses ● elle doit être une zone mémoire inscriptible
  35. 35. Relocations● les PEs ont des ImageBases standard ● EXE: 0x400000, DLL 0x1000000 → conflits entre DLLs → le SE doit imposer des ImageBases différentes● les adresses absolues doivent être déplacées ● la plupart dans len-tête sont relatives ● valeurs immédiates dans le code, TLS callbacks ● ajouter (NouvelleImageBase - AncienneImageBase)
  36. 36. Resources● icones, dialogues, numéro de version, ...● nécessite juste 3 appels de fonctions → utilisé partout● structure récursive dossier & documents ● 3 niveaux en standards
  37. 37. Thread Local Storage● Callbacks exécutés au démarrage et à larrêt de chaque thread ● avant lEntryPoint ● après un appel à ExitProcess
  38. 38. 32 bits ↔ 64 bits● IMAGE_FILE_HEADER.Machine ● 0x14c I386 ↔ 0x8664 AMD64● IMAGE_OPTIONAL_HEADER.Magic ● 0x10b ↔ 0x20b● ImageBase, stack, heap ● double ↔ quad ● sizeof(OptionalHeader): 0xe0 ↔ 0xf0● TLS, import thunks deviennent aussi des qmots
  39. 39. NumberOfSections● 96 sections (XP)● 65536 Sections (Vista ou ultérieur) → suffisant pour faire planter des outils!
  40. 40. maxsecXP65535sects
  41. 41. SizeOfOptionalHeader● sizeof(OptionalHeader) ● ce qui donnerait 0xe0 (32b)/0xf0 (64b) ● beacoup doutils naïfs plantent si ce nest pas le cas● offset(SectionTable) – offset(OptionalHeader)● peut être: ● plus grand – que le fichier (→ table virtuelle, sous xp) ● plus petit ou nul (→ superposé à lOptionalHeader) ● nul (aucune section)
  42. 42. PE sans section● mode standard: ● 200 ≤ FileAlignment ≤ SectionAlignment ● 1000 ≤ SectionAlignment● mode pilote: ● 1 ≤ FileAlignment == SectionAlignment ≤ 800→ virtuelle == physique● le fichier entier est chargé tel quel● les sections sont inutiles ● aucune, beaucoup (factices ou non)
  43. 43. 1 ≤ FileAlignment == SectionAlignment ≤ 800 nosection*
  44. 44. TinyPEexemple classique de malformation manuelle ● en-tête PE dans len-tête DOS ● OptionalHeader tronqué● ne nécessite pas de section● compatible 64b & pilote● 92 octets ● uniquement sous XP (OptionalHeader tronqué) ● rembourrage nécessaire depuis Vista → plus petit PE universel: 268 octets
  45. 45. tiny*
  46. 46. double en-têtes pliablesles DD sont pris en compte après chargementhttp://www.reversinglabs.com/advisory/pecoff.php1.déplacer len-tête plus loin2.début de section et DD factices superposés en mémoire.3.la section contient les vrais DD● au chargement:1.en-têtes et section sont analysés2.le fichier est chargé en mémoire3.les DD sont écrasés par leurs vraies valeurs ● les imports sont localisés, etc...
  47. 47. foldedhdr
  48. 48. EntryPoint nul● pour les EXEs ● MZ désassemblé en tant que dec ebp/pop edx (pas dappel à DllMain si lEP est nul) nullEP
  49. 49. EntryPoint virtuel● 1er octet absent physiquement dans le fichier ● 00 C0 => add al, al virtEP
  50. 50. TLS à la volée● la liste des callbacks est m-a-j à la volée ● le callback #1 ajoute un callback #2 tls_onthefly
  51. 51. TLS ignoré● le TLS nest pas exécuté si seul kernel32 est importée ● et si aucune DLL important kernel32 est importée – Kaspersky & Ferrie tls_k32
  52. 52. points terminaux superflus● uniquement sous XP● trivial ● les points en fin de nom de DLL sont ignorés● certaines heuristiques échouent
  53. 53. dll-ld
  54. 54. boucles dans les Ressources● boucles (infinies) ● ignorées lors le chargement ● ignorées si le chemin pour atteindre une ressource est différent
  55. 55. resourceloop
  56. 56. EntryPoint modifié par une DLL statiqueles DLLs statiques sont appelé avant lEntryPoint● DllMain reçoit le thread context via lpvReserved ● contient déjà laddresse de lEntryPoint→ toute DLL statique peut librement le modifierdocumenté par Skywing (http://www.nynaeve.net/?p=127),mais peu connu
  57. 57. ctxt*
  58. 58. Win32VersionValue● officiellement reserved ● should be null● utilisé en réalité pour forcer les informations de version du SE dans le PEB● anti-émulateur dynamique simple ● utilisé dans les virus
  59. 59. winver
  60. 60. ★Nouvelles★ astuces
  61. 61. Characteristics● IMAGE_FILE_32BIT_MACHINE ● vrai même en 64 bits ● non requis!!● IMAGE_FILE_DLL ● non requis pour les DLLs – les exports sont toujours utilisables – aucun appel à DllMain! ● EP invalide → pas un EXE ● FILE_DLL absent → pas une DLL non plus → indéboguable
  62. 62. mininormal64
  63. 63. dllnomain*
  64. 64. descripteurs dImports● INT factice ou absente ● uniquement DllName et IAT sont requis● le descripteur est sauté si aucun thunk ● DllName ignoré – peut être nul ou TRÈS gros ● lanalyse devrait ne pas abandonner trop tôt● isTerminator = (IAT == 0 || DllName == 0)● le terminateur peut être virtuel ou en dehors du fichier ● de même que le début du premier descripteur
  65. 65. dd OriginalFirstThunkdd TimeDateStampdd ForwarderChain----------------------------dd Namedd FirstThunk imports_virtdesc
  66. 66. Imports torturésmalformation complexe● DllName sans extension● IAT dans le descriptor ● lINT presque valide est ignorée● noms et indices/noms dans le terminateur● valide car le dernier dmot est nul
  67. 67. corkamix
  68. 68. DD Exceptions● 64 bits Structured Exception Handler ● avec beaucoup de code rajouté par le compilateur● utilisé par W32.Deelae pour infecter ● Peter Ferrie, Virus Bulletin, Septembre 2011● modifiable manuellement, à la volée ● aucun appel dAPI nécessaire
  69. 69. exceptions
  70. 70. seh_change64
  71. 71. Relocations● autorise nimporte quelle ImageBase ● requises pour les adresses absolues: code, TLS, .Net● ignorée si non requises ● aucun changement dImageBase (→ factices!) ● pas de code ● code 64 bits relatif à RIP ● code indépendant de lIP (shellcode)● peut tout déplacer ● déplacer lImageBase altère lEntryPoint
  72. 72. ibknoreloc64 no_dd
  73. 73. fakerelocs ibreloc
  74. 74. types de Relocations (en théorie)HIGHLOW ● delta dImageBase standardABSOLUTE ● ne fait rien ● juste utilisé pour lalignement
  75. 75. type de Relocations en pratique● les types 6 et 7 sont ignorés ● alors que le type 8 est interdit● le type 4 (HIGHADJ) nécessite un param. ● qui est en fait ignoré (bug du SE)● le type 2 (LOW) ne fait rien ● car les ImageBases sont alignées à 64kb● les types MIPS et IA64 sont toujours présents● enfin, du nettoyage sous Windows 8!
  76. 76. un peu dhistoire● HIGHADJ est là depuis le début● MIPS était reconnu mais rejeté par Win95● NT3.1 introduit MIPS – sous toutes les archs.● LOW était rejeté par Win95/WinME ● alors quil ne fait rien sous les autres versions● Windows 2000 avait un type supplémentaire, aussi avec un paramètreBonus:les relocations de Win95 utilisent 2 copies identiques dumême code – quelle optimisation!
  77. 77. samuser avec les relocations● 4 types ne font en fait rien● tous peuvent être utilisés sur une adresse factice ● HighAdjs peut être utilisé comme piège● des Relocations peuvent en modifier dautres ● un bloc peut modifier le suivant● des Relocations peuvent décrypter des données ● mettre une ImageBase dans le noyau ● sa future valeur est connue● pas danalyse statique possible ● mais cest très louche :D
  78. 78. reloccrypt
  79. 79. reloccrypt
  80. 80. reloccrypt
  81. 81. Code dans len-tête● len-tête est exécutable ● les packers y mettent code ou données● beaucoup de champs inutilisés (→ format TE)● beaucoup de champs contrôlables ● Peter Ferrie http://pferrie.host22.com/misc/pehdr.htm→ du vrai code dans len-tête
  82. 82. maxvals
  83. 83. hdrcode
  84. 84. traceless
  85. 85. .Netétapes du chargement:1.chargement du PE • uniquement les imports (DD[1]) à cette étape2.appel de MSCoree.dll3.chargement de la partie .Net ● nécessite CLR (DD[13]) et relocations (DD[5]) ● oublie de vérifier NumberOfRvaAndSizes :( – fonctionne avec NumberOfRvaAndSizes = 2échec dIDA, reflector – mais déjà dans la nature
  86. 86. PE .NET ... ...imports ... ... ... ... ... ... ... ... relocs ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... CLR ... ... tinynet
  87. 87. PE sans zéro● LoadlibraryEx avec LOAD_LIBRARY_AS_DATAFILE● un PE de données nécessite uniquement MZ, e_lfanew, PE00● PE à la fin du fichier ● assez de rembourrage pour que e_lfanew ne contienne pas de zéro un PE non-null peut être créé et chargé
  88. 88. d_nonnull-*
  89. 89. uniquement des resources● 1 seule section valide ● 65535 sections sous XP!● 1 DataDirectory
  90. 90. d_resource*
  91. 91. subsystems● pas de différences particulières ● alignements bas pour les pilotes ● imports incompatibles: NTOSKRNL ↔ KERNEL32 ● texte ↔ graphique : IsConsoleAttached → un PE avec des alignements bas et sans imports peut marcher avec les 3 subsystems
  92. 92. multiss*
  93. 93. un PE nu avec du code● alignments bas → pas de sections● pas dimports → APIs chargées à la main● TLS → pas dEntryPoint ni EntryPoint, ni section, ni import, mais le code sexécute sans problème
  94. 94. nothing*
  95. 95. EntryPoint externe (1/2)● dans une DLL (sans relocations) dllextEP
  96. 96. EntryPoint externe (2/2)● mémoire allouée juste avant par le TLS tls_virtEP
  97. 97. EntryPoint ignoréle TLS termine lexécution mais sera rappelé ensuite tls_noEP
  98. 98. du noyau à lutilisateur● le déboguage noyau est compliqué ● alors que les packers noyau sont limités1.changer le subsystem2.utiliser de fausses DLLs noyau (ntoskrnl, etc...) ● rediriger les APIs – DbgPrint → MessageBoxA, ExAllocatePool → VirtualAlloc→ automatisation de lunpacking noyau
  99. 99. ntoskrnl
  100. 100. TLS AddressOfIndex● pointeur vers un double mot● reçoit 0, 1... au chargement du nème TLS● astuce dynamique facile call <garbage> dans le fichier → call $+5 en mémoire● modifié avant les imports sous XP, après sous W7 même PE, mais chargement différent
  101. 101. tls_aoiOSDET
  102. 102. Manifest● ressource XML ● peut faire échouer le chargement ● peut faire planter le SE! (KB921337)● difficile à analyser en détail ● ignoré si le type est incorrectManifest minimal:<assembly xmlns=urn:schemas-microsoft-com:asm.v1 manifestVersion=1.0/>
  103. 103. corruption de DllMain/TLS● DllMain et TLS ont juste besoin de restaurer ESI ● même ESP peut être corrompu ● anti-émulateur simple● le TLS peut déclencher une exception ● pas derreur pour le SE ● lEntryPoint est exécuté comme si de rien nétait
  104. 104. fakeregs
  105. 105. un PE quine● afficher son code source ● totalement inutile – très divertissant :D● remplir len-tête DOS de caractères ASCII● code ASM entre les en-têtes DOS et PE● visible par affichage texte● saffiche lui-même si exécuté
  106. 106. quine
  107. 107. un polyglotte binaire● ajouter %PDF dans les 400h premiers octets → votre PE est aussi un PDF (→ Acrobat)● ajouter PK0304 nimporte où → votre PE est aussi un ZIP (→ PKZip)● mettre une .CLASS Java .CLASS dans le ZIP → votre PE est aussi un JAR (→ Java)● ajouter <HTML> quelque part → votre PE est aussi une page HTML (→ Mosaic)● Bonus: Python, JavaScript
  108. 108. corkamix
  109. 109. Conclusion
  110. 110. Conclusion● le format des exécutables de Windows est complexe● la majeure partie est documentée, mais cest un vrai champ de mines ● avec de nouvelles découvertes chaque jour :( http://pe101.corkami.com http://pe.corkami.com
  111. 111. des questions?Merci à Fabian Sauter, Peter Ferrie, ‫وليد عصر‬Bernhard Treutwein, Costin Ionescu, Deroko, Ivanlef0u, Kris Kaspersky, Moritz Kroll, Thomas Siebert,Tomislav Peričin, Kris McConkey, Lyr1k, Gunther, Sergey Bratus, frank2, Ero Carrera, Jindřich Kubec, LordNoteworthy, Mohab Ali, Ashutosh Mehra, Gynvael Coldwind, Nicolas Ruff, Aurélien Lebrun, DanielPlohmann, Gorka Ramírez, 최진영 , Adam Błaszczyk, 板橋一正 , Gil Dabah, Juriaan Bremer, Bruce Dang,Mateusz Jurczyk, Markus Hinderhofer, Sebastian Biallas, Igor Skochinsky, Ильфак Гильфанов, AlexIonescu, Alexander Sotirov, Cathal Mullaney
  112. 112. Merci!Ange Albertini @gmail.com @ange4771 http://corkami.com
  113. 113. Bonus
  114. 114. pas du PE, mais quand même amusant
  115. 115. formats anciens● en 32b, Windows gère encore les EXE et COM ● moins courant, ils échappent aux détections● un EXE peut sauto-modifier en PE ● en utilisant une signature ZM ● pas en mémoire :(● un COM écrit en symboles peut créer un PE ● grâce à http://utf-8.jp/public/sas/ de Yosuke Hasegawa
  116. 116. exe2pe, dosZMXP
  117. 117. aa86drop.com
  118. 118. archéologie binaire● les polices pt/pt (.FON) sont en format NE ● crée en 1985 pour Windows 1.0● vgasys.fon toujours présent dans Windows 8 ● tel quel depuis 1991 (Windows 3.11) ● police créée en 1984● les propriétés montrent le copyright → Windows 8 gère encore (partiellement) un format dexécutable 16b datant de 1985
  119. 119. instruction en état débriété● Lock:Prefetch ● ne peut pas être exécutée (illégale)● fonctionne bizarrement sous W7 x64 ● ne déclenche pas dexception ● modifiée par le SE (mal réparée) – mais encore incorrecte après! boucle infinie derreurs silencieuses
  120. 120. this is the end...my only friend, the end... (les Portes)

×