Ce deuxième cours aborde la programmation réseau, c'est-à-dire le développement d'applications avec plusieurs composants qui communiquent entre eux via la réseau. Après une rapide présentation des protocoles UDP et TCP, le cours aborde la notion de socket et présente le module Python de même nom. Le cours présente deux applications concrètes : une application de chat (basé sur UDP) et une application echo (basé sur TCP). Le cours se termine par la découverte de la notion de protocole de communication et de la définition du format des messages échangés.
Dans ce cours, on découvre comment lire et écrire des fichiers à l'aide de Python. Il est possible de créer des fichiers texte ou des fichiers binaires. Pour manipuler un fichier, il faut d'abord l'ouvrir, puis on peut faire les opérations et enfin on doit le refermer.
Ce deuxième cours aborde la programmation réseau, c'est-à-dire le développement d'applications avec plusieurs composants qui communiquent entre eux via la réseau. Après une rapide présentation des protocoles UDP et TCP, le cours aborde la notion de socket et présente le module Python de même nom. Le cours présente deux applications concrètes : une application de chat (basé sur UDP) et une application echo (basé sur TCP). Le cours se termine par la découverte de la notion de protocole de communication et de la définition du format des messages échangés.
Dans ce cours, on découvre comment lire et écrire des fichiers à l'aide de Python. Il est possible de créer des fichiers texte ou des fichiers binaires. Pour manipuler un fichier, il faut d'abord l'ouvrir, puis on peut faire les opérations et enfin on doit le refermer.
Ce cours présente les techniques que l'on peut utiliser pour effectuer des calculs parallèles avec une machine. La première partie introduit à la notion de parallélisme et de processus. Elle présente ensuite comment lancer et manipuler des processus avec les modules subprocess et multiprocessing. On y voit également comment communiquer entre processus avec des Queue et des Pipe. La deuxième partie présente les threads et leur utilisation avec le module threading. On y voit également comment créer un pool de workers/executors pour exécuter des jobs. Enfin, la dernière partie présente le framework dispy qui permet de facilement faire du calcul distribué et exploiter le parallélisme de données.
Cette présentation montre plusieurs outils gratuits qui peuvent être utilisés pour gérer plusieurs aspects de la gestion de projets, en particulier informatique, de manière collaborative. On y voit comment versioner son code avec Git, déployer son code avec Heroku, tester son code avec Travis, gérer et planifier son temps et ses tâches avec Trello, FreedCamp et Tom'splanner, comment communiquer avec Slack et comment rédiger sa documentation avec Read the Docs.
Ce cours présente comment réaliser des interfaces graphiques avec Python en utilisant la librairie Kivy. La première partie rappelle les principes de la programmation évènementielle puis présente la séparation interface/comportement à l'aide de fichiers KV et Python. La deuxième partie présente comment réaliser des dessins avec les composants Canvas. On y voit comment dessiner des formes, appliquer des transformations et on termine avec un exemple de composants déplaçables.
objectif général : acquerir les fondamentaux d'un langage procédural
objectifs opérationnels :
Mémoriser des données à l’aide des variables
Traiter des données à l’aide des opérateurs
Communiquer avec le programme à travers le clavier et l’écran
Contrôler le flux d’exécution des instructions
Se servir des tableaux, des pointeurs et des structures
Gérer la mémoire d’une manière dynamique
Définir et utiliser des fonctions
Le groupe PHP-FIG s'est formé pour favoriser l'interopérabilité des frameworks PHP.
Découvrez l'organisation et le fonctionnement du FIG, et les standards PHP PSR-0/PSR-4 pour l'autoloading, PSR-1/PSR-2 pour les normes de codage, PSR-3 pour le logging, les autres standards en cours d'élaboration: PSR-5 pour PHPdoc, PSR-6 pour le cache, et toutes les discussions en cours sur la standardisation PHP.
Présentation donnée au meetup AFUP du 02/04/2014.
Ce cours présente la programmation fonctionnelle et montre comment il est possible de programmer avec ce paradigme en utilisant Python. La première partie présente la notion d'objet de type fonction, les fonctions lambda, le type callable et les closures. La deuxième partie présente les décorateur et montre comment ajouter du comportement à une fonction à l'aide d'un décorateur. La troisième partie présente les itérateurs et les générateurs qui, grâce à l'instruction yield, génère les données à la demande.
Objectif général : Acquérir les bases méthodologiques de la résolution d'un problème conduisant à la réalisation d'un programme informatique
Objectifs opérationnels :
- Connaître les étapes de résolution d’un problème
- Stocker et traiter des données simples
- Permettre à un programme de communiquer avec l’extérieur
- Contrôler le flux d’exécution des instructions
- Traiter des données composites
- Définir et utiliser des procédures et des fonctions
Open Wide : Les outils pour le développement des systemes embarquesAlexandre LAHAYE
Découvrez comment l'utilisation maîtrisée des outils Open Source peut améliorer de façon significative l'efficience de vos équipes de développement et donc votre compétitivité.
Pour découvrir les autres présentations, rendez-vous sur notre site : http://ingenierie.openwide.fr/References/Conferences-techniques
Virtualiastion des systèmes d'exploitations :
Installation et administration
Journée Logiciel Libre à la Faculté des Sciences Dhar El Mahraz.
Par KHAMILICH Jamal
Ce cours présente les techniques que l'on peut utiliser pour effectuer des calculs parallèles avec une machine. La première partie introduit à la notion de parallélisme et de processus. Elle présente ensuite comment lancer et manipuler des processus avec les modules subprocess et multiprocessing. On y voit également comment communiquer entre processus avec des Queue et des Pipe. La deuxième partie présente les threads et leur utilisation avec le module threading. On y voit également comment créer un pool de workers/executors pour exécuter des jobs. Enfin, la dernière partie présente le framework dispy qui permet de facilement faire du calcul distribué et exploiter le parallélisme de données.
Cette présentation montre plusieurs outils gratuits qui peuvent être utilisés pour gérer plusieurs aspects de la gestion de projets, en particulier informatique, de manière collaborative. On y voit comment versioner son code avec Git, déployer son code avec Heroku, tester son code avec Travis, gérer et planifier son temps et ses tâches avec Trello, FreedCamp et Tom'splanner, comment communiquer avec Slack et comment rédiger sa documentation avec Read the Docs.
Ce cours présente comment réaliser des interfaces graphiques avec Python en utilisant la librairie Kivy. La première partie rappelle les principes de la programmation évènementielle puis présente la séparation interface/comportement à l'aide de fichiers KV et Python. La deuxième partie présente comment réaliser des dessins avec les composants Canvas. On y voit comment dessiner des formes, appliquer des transformations et on termine avec un exemple de composants déplaçables.
objectif général : acquerir les fondamentaux d'un langage procédural
objectifs opérationnels :
Mémoriser des données à l’aide des variables
Traiter des données à l’aide des opérateurs
Communiquer avec le programme à travers le clavier et l’écran
Contrôler le flux d’exécution des instructions
Se servir des tableaux, des pointeurs et des structures
Gérer la mémoire d’une manière dynamique
Définir et utiliser des fonctions
Le groupe PHP-FIG s'est formé pour favoriser l'interopérabilité des frameworks PHP.
Découvrez l'organisation et le fonctionnement du FIG, et les standards PHP PSR-0/PSR-4 pour l'autoloading, PSR-1/PSR-2 pour les normes de codage, PSR-3 pour le logging, les autres standards en cours d'élaboration: PSR-5 pour PHPdoc, PSR-6 pour le cache, et toutes les discussions en cours sur la standardisation PHP.
Présentation donnée au meetup AFUP du 02/04/2014.
Ce cours présente la programmation fonctionnelle et montre comment il est possible de programmer avec ce paradigme en utilisant Python. La première partie présente la notion d'objet de type fonction, les fonctions lambda, le type callable et les closures. La deuxième partie présente les décorateur et montre comment ajouter du comportement à une fonction à l'aide d'un décorateur. La troisième partie présente les itérateurs et les générateurs qui, grâce à l'instruction yield, génère les données à la demande.
Objectif général : Acquérir les bases méthodologiques de la résolution d'un problème conduisant à la réalisation d'un programme informatique
Objectifs opérationnels :
- Connaître les étapes de résolution d’un problème
- Stocker et traiter des données simples
- Permettre à un programme de communiquer avec l’extérieur
- Contrôler le flux d’exécution des instructions
- Traiter des données composites
- Définir et utiliser des procédures et des fonctions
Open Wide : Les outils pour le développement des systemes embarquesAlexandre LAHAYE
Découvrez comment l'utilisation maîtrisée des outils Open Source peut améliorer de façon significative l'efficience de vos équipes de développement et donc votre compétitivité.
Pour découvrir les autres présentations, rendez-vous sur notre site : http://ingenierie.openwide.fr/References/Conferences-techniques
Virtualiastion des systèmes d'exploitations :
Installation et administration
Journée Logiciel Libre à la Faculté des Sciences Dhar El Mahraz.
Par KHAMILICH Jamal
.NET Microframework: du code, de l’électronique, de la robotiqueMicrosoft
Envie de se faire plaisir le soir ? Envie de faire vibrer des canards ? Envie de développer quelque chose de WAF et super Geek ? Alors, cette session est pour toi :-) .NET Microframework est une technologie open source permettant de réaliser des robots, des modules intelligents, le tout sans aucun OS. Cette session montra par des exemples concerts comment réaliser des automates et les piloter à travers des interfaces web. Exemple concret avec un arrosage automatique entièrement pilotable depuis l'autre bout du monde.
Bonnes pratiques pour apprivoiser le C++11 avec Visual C++Microsoft
Le C++ a vécu un tel renouveau ces dernières années avec la publication de C++11 (et l'arrivée imminente de C++14) que l'on peut dire qu'il y a une rupture, un avant et un après. Ce changement dans le style de programmation transparait dans chaque ligne de code et se reconnait du premier coup d’œil. À chaque nouvelle version, Visual C++ se rapproche un peu plus du support de la norme, permettant d'écrire du code plus lisible, plus robuste et plus rapide. Plus qu'un simple catalogue des fonctionnalités du langage prises en compte par Visual C++2013, cette présentation a pour ambition de vous montrer, par des exemples concrets, quels bénéfices vous pouvez tirer du C++ moderne. Au détour de ces exemples, on mettra en œuvre la sémantique de déplacement, les fonctions par défaut ou interdites, l'initialisation uniforme, les alias de types... en démasquant quelques pièges à éviter, mais surtout en présentant des pratiques sur lesquels s'appuyer pour apprivoiser ce langage moderne qu'est le C++. On fera enfin un petit point sur l'état d'avancement de Visual C++ par rapport à la norme, et sur la feuille de route présentée par les équipes de développement de Visual C++.
Speakers : Christophe Pichaud (Sogeti), Loïc Joly (Cast)
ISO-8859-1 Au secours !
Téléphone japonais
Gruyère international
i18n ?
i18n ou l10n
Le champ d'action
Pour le fun: les guillemets
i18n en java
MessageFormat
Démo : Old style i18n
Exemples
The absolute minimum
Le minimum
Encodings
Idées au passage
Des outils
"Technical challenges"? More like horrors!
Let's explore first the technical debt of old file formats,
with the evolution of the "MP3" format.
Then we go through more recent forms of file format abuses and tools:
polyglots, polymocks, and crypto-polyglots.
Last, an overview of recent collisions and other forms of art with MD5.
They say that with file formats, "specs are enough".
Should we laugh, cry or run away screaming?
Presented at Digital Preservation Coalition's CyberSec & DigiPres event.
The document discusses different archive formats and their relationships. It begins with an introduction to the presenter and then covers zlib, gzip, and zip file formats. Zlib and gzip both wrap deflate compression, but in different ways, so while the compressed data can be transferred between them, the formats are not directly compatible. Zip can use deflate but also other compression methods and a different one for each file. In conclusion, deflate is a common algorithm while the various formats wrap it with different headers and metadata.
This document is a slide presentation about hash collisions and generating polyglot files that have the same hash but different content. It discusses existing attacks on hashes like MD5 and SHA1 that allow two files to be generated with the same hash. It then explains how collisions can be generated for ZIP and TAR.GZ files by manipulating the ZIP file format in a way that maintains compatibility with ZIP parsers but results in different files with the same hash. Examples of colliding file pairs are shown with identical prefixes and suffixes and differing collision blocks in the middle.
You are *not* an idiot ~ or maybe we're all idiots.
Keynote at NorthSec 2021.
Talking about school, failure, success, diploma, impostor syndrom, manipulators, burn out, suicide, and how to deal with them.
The talk delivery was more personal, the slides are kept generic.
The recording is available @ https://youtu.be/Iu70J49bPlE?t=20869 (starts at 5:47:49)
The document discusses the author's experience with malware and file formats over 13 years, noting how specifications are often outdated and incomplete which can lead to misunderstandings. It advocates for better tools to analyze, document, and validate file formats to improve understanding of their current usage and behaviors. The author has created several open source projects focused on file format analysis and validation.
Demystifying hash collisions.
Pass the Salt, 1st July 2019.
video @ https://passthesalt.ubicast.tv/videos/kill-md5-demystifying-hash-collisions/
Hack.Lu, 22 October 2019.
video @ https://www.youtube.com/watch?v=JXazRQ0APpI
Beyond your studies ~ You studied X at Y. now what?
HackPra, July 2018
A student's life ago, the author somehow managed to graduate.
On the way, he made a lot of mistakes -- and he still does.
A few people since called him 'successful', but LOL, if only they knew....
And now, the author will do another (big!) mistake:
instead of hiding in shame as he probably should,
he'll share his mistakes with anyone bored enough to attend,
in the hope that he's the last person to ever look that dumb to commit such mistakes.
If you're a genius and you know what to do in life, please skip this. Seriously.
If, like the author at the time, you wonder WTF is going on with graduation, professional work and life, then hopefully you learn a few things. Maybe.
Btw the author is 42 (WTF - old!).
Maybe that will help to provide a few answers.
This document provides an introduction and overview of Inkscape, an open-source vector graphics editor. It discusses Inkscape's features such as its use of Scalable Vector Graphics (SVG), tools for drawing objects and manipulating nodes, layers, transformations, and more. The document also includes tutorials for tasks like tracing an image, creating a poster, and converting code snippets to SVG. Throughout, it emphasizes that Inkscape is non-destructive and files remain editable, while also noting some limitations like unsupported gradients along paths.
The document discusses the author's perspectives on file formats after over 30 years of experience working with computers and digital preservation. The author believes specifications are imperfect and do not fully define what constitutes a valid file, as implementations can interpret specifications differently and become outdated. The author has experimented with creating extreme files that push the boundaries of specifications in order to understand formats better and find potential issues.
This document contains the table of contents for an issue of PoC||GTFO, a journal for sharing technical content in unconventional ways. It lists over 60 articles across various topics including hardware hacking, firmware reverse engineering, embedded exploitation, and unusual file formats. The sections are numbered and titled with references to hacking, unconventional thinking, and sharing knowledge in new ways.
Presented at Troopers 2016.
When Infosec and Digipres share interests...
TL;DR
- Attack surface with file formats is too big.
- Specs are useless (just a nice ‘guide’), not representing reality.
- We can’t deprecate formats because we can’t preserve and we can’t define how they really work
- We need open good libraries to simplify landscape, and create a corpus to express the reality of file format, which gives us real “documentation”.
- Then we can preserve and deprecate older format, which reduces attack surface.
- From then on, we can focus on making the present more secure.
- We don't need new formats: reality will diverge from the specs anyway - we need 'alive' (up to date, traceable) specs.
Game developers are able to create better video games than what the limitations of computers allow by understanding how things truly work at a detailed level. They discovered tricks to get around limitations, such as updating colors rapidly to display more than the limited palette or changing sounds quickly to generate new voices. Understanding the underlying systems allows developers to creatively solve problems like drawing huge animated monsters that surpass the small allowed object sizes. This knowledge of how things really function provides advantages beyond initial restrictions.
1. File formats are complex with many stakeholders who interpret specifications differently, leading to divergent implementations over time.
2. Specifications are often incomplete, unclear, non-free, or do not reflect reality, making it difficult to determine what a valid file is.
3. Relying on specifications alone is not sufficient - one must also analyze sample files and code to understand how file formats work in practice.
The document provides a step-by-step guide to writing a basic "Hello World" PDF file. It explains the overall PDF file structure and key elements like the file body, cross-reference table, trailer, and objects. Objects are used to define things like the catalog, pages, and a single page. The guide demonstrates creating three objects - one for the catalog that refers to a pages object, which in turn refers to a page object defining a single page.
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)
12. 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 l'automatisation et le tri
● PE ou pas?
● corrompu ou malveillant?
● les meilleurs outils échouent
→ ça empêche même l'analyse manuelle
20. en partant de zéro
● analyser ce qu'on 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 l'ensemble
je partage mes connaissances et mes PoCs
29. 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)
30. en-tête
en-tête DOS
(code DOS) 16 bits
(en-tête Rich) infos de compil.
'en-têtes PE'
31. code DOS
● code 16bits obsolète
● affiche message & termine
● encore présent dans les PEs
● même les 64 bits
PoC: compiled
32. 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
33.
34. en-tête DOS
● obsolète
● utilisé uniquement si exécuté en mode DOS
● ignoré dans les autres cas
● indique où l'en-tête PE se trouve
35.
36. '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
37. File header
● combien de section(s)?
● y a-t-il un Optional Header?
● 32b or 64b, DLL ou EXE...
41. Optional header
● propriétés géométriques
● alignements, début en mémoire, taille
● indique où l'exécution démarre
● 32/64b, pilote/standard/ligne de commande
● beaucoup d'informations non cruciales
● data directory
42.
43. Sections
● définir l'organisation en mémoire:
● où sera chargée telle partie du fichier
● à quelles fins? (inscriptible, exécutable...)
44.
45.
46. Data Directory
● (RVA, Size) DataDirectory[NumbersOfRvaAndSizes]
● chacun des 16 premiers, en standard, a une
utilité particulière
→ distincts, on les met souvent au pluriel
47.
48. PE DLL
...
call [API] API: …
… ret
Imports Exports
49. Exports
● 3 pointeurs vers 3 listes
● définir en parallèle (nom, adresse, numéro)
● une adresse peut avoir plusieurs noms
50.
51. Imports
● une liste à zéro terminal de descripteurs
● d'habitude, un par DLL
● chaque descripteur spécifie
● un nom de DLL
● 2 listes de pointeurs à zéro terminal
– noms d'API et futures adresses
● ImportsAddressTable indique la liste des adresses
● elle doit être une zone mémoire inscriptible
52.
53. 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 l'en-tête sont relatives
● valeurs immédiates dans le code, TLS callbacks
● ajouter (NouvelleImageBase - AncienneImageBase)
54.
55. 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
56.
57. Thread Local Storage
● Callbacks exécutés au démarrage et à l'arrêt de
chaque thread
● avant l'EntryPoint
● après un appel à ExitProcess
64. SizeOfOptionalHeader
● sizeof(OptionalHeader)
● ce qui donnerait 0xe0 (32b)/0xf0 (64b)
● beacoup d'outils naïfs plantent si ce n'est pas le cas
● offset(SectionTable) – offset(OptionalHeader)
● peut être:
● plus grand
– que le fichier (→ table virtuelle, sous xp)
● plus petit ou nul (→ superposé à l'OptionalHeader)
● nul (aucune section)
65. 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)
67. TinyPE
exemple classique de malformation manuelle
● en-tête PE dans l'en-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
69. double en-têtes 'pliables'
les DD sont pris en compte après chargement
http://www.reversinglabs.com/advisory/pecoff.php
1.déplacer l'en-tête plus loin
2.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és
2.le fichier est chargé en mémoire
3.les DD sont écrasés par leurs vraies valeurs
● les imports sont localisés, etc...
72. EntryPoint nul
● pour les EXEs
● 'MZ' désassemblé en tant que 'dec ebp/pop edx'
(pas d'appel à DllMain si l'EP est nul)
nullEP
73. EntryPoint virtuel
● 1er octet absent physiquement dans le fichier
● 00 C0 => add al, al
virtEP
74. TLS à la volée
● la liste des callbacks est m-a-j à la volée
● le callback #1 ajoute un callback #2
tls_onthefly
75. TLS ignoré
● le TLS n'est pas exécuté si seul kernel32 est importée
● et si aucune DLL important kernel32 est importée
– Kaspersky & Ferrie
tls_k32
76. points terminaux superflus
● uniquement sous XP
● trivial
● les points en fin de nom de DLL sont ignorés
● certaines heuristiques échouent
80. EntryPoint modifié par une DLL statique
les DLLs statiques sont appelé avant l'EntryPoint
● DllMain reçoit le thread context via lpvReserved
● contient déjà l'addresse de l'EntryPoint
→ toute DLL statique peut librement le modifier
documenté par Skywing (http://www.nynaeve.net/?p=127),
mais peu connu
82. 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
85. 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'
88. descripteurs d'Imports
● 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
● l'analyse 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
90. Imports 'torturés'
malformation complexe
● DllName sans extension
● IAT dans le descriptor
● l'INT presque valide est ignorée
● noms et indices/noms dans le terminateur
● valide car le dernier dmot est nul
92. 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 d'API nécessaire
95. Relocations
● autorise n'importe quelle ImageBase
● requises pour les adresses absolues: code, TLS,
.Net
● ignorée si non requises
● aucun changement d'ImageBase (→ factices!)
● pas de code
● code 64 bits relatif à RIP
● code indépendant de l'IP (shellcode)
● peut tout déplacer
● déplacer l'ImageBase altère l'EntryPoint
98. types de Relocations (en théorie)
HIGHLOW
● delta d'ImageBase standard
ABSOLUTE
● ne fait rien
● juste utilisé pour l'alignement
99. 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!
100.
101. un peu d'histoire
● 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 qu'il ne fait rien sous les autres versions
● Windows 2000 avait un type supplémentaire,
aussi avec un paramètre
Bonus:
les relocations de Win95 utilisent 2 copies identiques du
même code – quelle optimisation!
102.
103. s'amuser avec les relocations
● 4 types ne font en fait rien
● tous peuvent être utilisés sur une adresse factice
● HighAdj's peut être utilisé comme piège
● des Relocations peuvent en modifier d'autres
● 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 d'analyse statique possible
● mais c'est très louche :D
107. Code dans l'en-tête
● l'en-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 l'en-tête
111. .Net
étapes du chargement:
1.chargement du PE
• uniquement les imports (DD[1]) à cette étape
2.appel de MSCoree.dll
3.chargement de la partie .Net
● nécessite CLR (DD[13]) et relocations (DD[5])
● oublie de vérifier NumberOfRvaAndSizes :(
– fonctionne avec NumberOfRvaAndSizes = 2
échec d'IDA, reflector – mais déjà dans la nature
113. 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é
117. 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
119. un PE nu avec du code
● alignments bas → pas de sections
● pas d'imports → APIs chargées à la main
● TLS → pas d'EntryPoint
ni EntryPoint, ni section, ni import,
mais le code s'exécute sans problème
124. du noyau à l'utilisateur
● le déboguage noyau est compliqué
● alors que les packers noyau sont limités
1.changer le subsystem
2.utiliser de fausses DLLs noyau (ntoskrnl, etc...)
● rediriger les APIs
– DbgPrint → MessageBoxA, ExAllocatePool → VirtualAlloc
→ automatisation de l'unpacking noyau
126. 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
128. Manifest
● ressource XML
● peut faire échouer le chargement
● peut faire planter le SE! (KB921337)
● difficile à analyser en détail
● ignoré si le type est incorrect
Manifest minimal:
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'/>
129. 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 d'erreur pour le SE
● l'EntryPoint est exécuté comme si de rien n'était
131. un PE 'quine'
● afficher son code source
● totalement inutile – très divertissant :D
● remplir l'en-tête DOS de caractères ASCII
● code ASM entre les en-têtes DOS et PE
● visible par affichage texte
● s'affiche lui-même si exécuté
133. un polyglotte binaire
● ajouter %PDF dans les 400h premiers octets
→ votre PE est aussi un PDF (→ Acrobat)
● ajouter PK0304 n'importe 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
136. Conclusion
● le format des exécutables de Windows est
complexe
● la majeure partie est documentée, mais c'est un
vrai champ de mines
● avec de nouvelles découvertes chaque jour :(
http://pe101.corkami.com
http://pe.corkami.com
137. 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, Lord
Noteworthy, Mohab Ali, Ashutosh Mehra, Gynvael Coldwind, Nicolas Ruff, Aurélien Lebrun, Daniel
Plohmann, Gorka Ramírez, 최진영 , Adam Błaszczyk, 板橋一正 , Gil Dabah, Juriaan Bremer, Bruce Dang,
Mateusz Jurczyk, Markus Hinderhofer, Sebastian Biallas, Igor Skochinsky, Ильфак Гильфанов, Alex
Ionescu, Alexander Sotirov, Cathal Mullaney
141. formats anciens
● en 32b, Windows gère encore les EXE et COM
● moins courant, ils échappent aux détections
● un EXE peut s'auto-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
144. 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 d'exécutable 16b datant de 1985
145.
146. 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 d'exception
● modifiée par le SE (mal 'réparée')
– mais encore incorrecte après!
boucle infinie d'erreurs silencieuses
147.
148. this is the end...
my only friend, the end...
(les Portes)