[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:05.01,0:00:10.01,Default,,0000,0000,0000,,Quel processeur bizarre - faire des misères au x86... et un peu de PE [Portable Executable] Dialogue: 0,0:00:10.01,0:00:19.00,Default,,0000,0000,0000,,Bienvenue... et surtout, dites-moi si je vais trop vite Dialogue: 0,0:00:19.00,0:00:28.00,Default,,0000,0000,0000,,Je vais parler des opcodes, et un peu du format PE et de leurs bizarreries Dialogue: 0,0:00:28.00,0:00:35.00,Default,,0000,0000,0000,,Je fais du reverse depuis quelque temps. J'ai créé un projet appelé Corkami. Dialogue: 0,0:00:35.00,0:00:42.00,Default,,0000,0000,0000,,Dans le passé, j'ai participé à Mame, l'émulateur Arcade, et professionnellement, analyste de virus, Dialogue: 0,0:00:42.00,0:00:48.00,Default,,0000,0000,0000,,mais je suis ici à titre personnel, ce sont mes propres expériences à la maison. Dialogue: 0,0:00:48.00,0:00:57.00,Default,,0000,0000,0000,,Donc, je viens de mentionner Corkami. C'est le nom du projet de mon projet de reverse [rétro-ingénierie] Dialogue: 0,0:00:57.00,0:01:03.01,Default,,0000,0000,0000,,Je n'y parle que de choses techniques, pas de pubs, pas de login requis Dialogue: 0,0:01:03.01,0:01:06.00,Default,,0000,0000,0000,,Directement le pur jus. Dialogue: 0,0:01:06.00,0:01:12.00,Default,,0000,0000,0000,,J'essaie de le maintenir à jour, et util. J'ai créé des fiches pense-bêtes et d'autre documents Dialogue: 0,0:01:12.00,0:01:15.01,Default,,0000,0000,0000,,que j'utilise moi-même au boulot, au quotidien Dialogue: 0,0:01:15.01,0:01:18.01,Default,,0000,0000,0000,,mais c'est juste un loisir. je commence quand les enfants sont couchés Dialogue: 0,0:01:18.01,0:01:23.00,Default,,0000,0000,0000,,tard dans la nuit, donc ça n'a probablement pas le polish professionnel Dialogue: 0,0:01:23.00,0:01:25.00,Default,,0000,0000,0000,,que j'aimerais qu'il ait. Dialogue: 0,0:01:25.00,0:01:30.00,Default,,0000,0000,0000,,Actuellement, Corkami est un wiki et des pense-bêtes Dialogue: 0,0:01:30.00,0:01:37.00,Default,,0000,0000,0000,,et je me focalise sur la création de preuves de concepts [démonstration d'hypothèse, "proof of concept] [Tiens, salut Bob!] Dialogue: 0,0:01:37.00,0:01:42.01,Default,,0000,0000,0000,,donc les binaires sont fait-main, d'habitude je n'utilise pas de compilateurs, je créé la structure du PE à la main Dialogue: 0,0:01:42.01,0:01:46.00,Default,,0000,0000,0000,,pour que ce soit focalisé sur le point pertinent Dialogue: 0,0:01:46.00,0:01:49.00,Default,,0000,0000,0000,,et qu'on est pas de parasites. on n'a probablement pas besoin d'IDA Dialogue: 0,0:01:49.00,0:01:51.00,Default,,0000,0000,0000,,pour comprendre ce qui se passe Dialogue: 0,0:01:51.00,0:01:54.01,Default,,0000,0000,0000,,car je me concentre uniquement sur ce qui est important. Dialogue: 0,0:01:54.01,0:01:58.00,Default,,0000,0000,0000,,Les binaires sont directement téléchargeables pour que vous puissiez Dialogue: 0,0:01:58.00,0:02:01.00,Default,,0000,0000,0000,,tester avec votre débogueur, vos outils, vos connaissances, Dialogue: 0,0:02:01.00,0:02:03.01,Default,,0000,0000,0000,,directement. Dialogue: 0,0:02:03.01,0:02:07.01,Default,,0000,0000,0000,,pour l'instant, je me suis concentré sur le PDF, l'assembleur et le format PE Dialogue: 0,0:02:07.01,0:02:11.00,Default,,0000,0000,0000,,quelques autres trucs, mais ce sont les sujets les plus approfondis Dialogue: 0,0:02:11.00,0:02:15.00,Default,,0000,0000,0000,,du site, et je partage tout ça avec une licence Dialogue: 0,0:02:15.00,0:02:19.01,Default,,0000,0000,0000,,très permissive, BSD, donc vous pouvez réutiliser commercialement Dialogue: 0,0:02:19.01,0:02:24.01,Default,,0000,0000,0000,,Même les images sont en format ouvert. Dialogue: 0,0:02:24.01,0:02:29.00,Default,,0000,0000,0000,,Donc, la raison de cette présentation... il y a quelque temps, Dialogue: 0,0:02:29.00,0:02:32.00,Default,,0000,0000,0000,,J'étais jeune et innocent, et je pensais que les CPUs, fait de transistors, Dialogue: 0,0:02:32.00,0:02:38.00,Default,,0000,0000,0000,,était parfaitement logique Dialogue: 0,0:02:38.00,0:02:41.01,Default,,0000,0000,0000,,et ensuite, un virus m'a piégé... simplement, Dialogue: 0,0:02:41.01,0:02:46.00,Default,,0000,0000,0000,,IDA était rendu inutile. Donc j'ai décidé de repartir à zéro Dialogue: 0,0:02:46.00,0:02:49.01,Default,,0000,0000,0000,,et d'étudier l'assembleur et le PE du début. Dialogue: 0,0:02:49.01,0:02:52.01,Default,,0000,0000,0000,,j'ai écrit en chemin des documents, partagés sur Corkami Dialogue: 0,0:02:52.01,0:02:57.01,Default,,0000,0000,0000,,et maintenant je vous présente le résultat plus ou moins final, Dialogue: 0,0:02:57.01,0:03:01.01,Default,,0000,0000,0000,,ou du moins quelques buts atteints. Si j'étais juste un gars qui a étudié l'assembleur Dialogue: 0,0:03:01.01,0:03:05.00,Default,,0000,0000,0000,,je ne serais probablement pas en train de présenter ici, Dialogue: 0,0:03:05.00,0:03:10.00,Default,,0000,0000,0000,,à moins d'avoir eu quelques résultats avec certains outils. Dialogue: 0,0:03:10.00,0:03:13.01,Default,,0000,0000,0000,,Donc, pour résumer, j'ai trouvés des bogues dans tous les désassembleurs que j'ai essayé Dialogue: 0,0:03:13.01,0:03:22.00,Default,,0000,0000,0000,,et j'ai aussi obtenus quelques plantages. J'insiste que tous les auteurs ont été contactés Dialogue: 0,0:03:22.00,0:03:26.00,Default,,0000,0000,0000,,et que la plupart des problèmes ont déjà été corrigé, Dialogue: 0,0:03:26.00,0:03:30.01,Default,,0000,0000,0000,,mais en tout cas, en version 6.1, il plante directement, mais dans la version 6.2 Dialogue: 0,0:03:30.01,0:03:33.00,Default,,0000,0000,0000,,c'est corrigé. Dialogue: 0,0:03:33.00,0:03:37.00,Default,,0000,0000,0000,,et la dernière version de Hiew [Hacker's view] (enfin, pas la dernière publique) Dialogue: 0,0:03:37.00,0:03:41.00,Default,,0000,0000,0000,,corrige ça aussi. Dialogue: 0,0:03:41.00,0:03:44.01,Default,,0000,0000,0000,,Donc, pour cette présentation, je commencerais facile, Dialogue: 0,0:03:44.01,0:03:50.01,Default,,0000,0000,0000,,je pars du principe que vous êtes tous habitués à l'assembleur ? Dialogue: 0,0:03:50.01,0:03:57.00,Default,,0000,0000,0000,,Oui. et vous êtes tous habitués, ou Dialogue: 0,0:03:57.00,0:04:02.01,Default,,0000,0000,0000,,vous avez déjà rencontré des cas d'opcodes non documentés? Dialogue: 0,0:04:02.01,0:04:06.00,Default,,0000,0000,0000,,Genre vous faites confiance à IDA, point barre. Dialogue: 0,0:04:06.00,0:04:10.00,Default,,0000,0000,0000,,Est-ce habituel de voir quelque chose non géré par IDA ? Dialogue: 0,0:04:10.00,0:04:14.00,Default,,0000,0000,0000,,Levez les bras... ok, pas tant que ça. Dialogue: 0,0:04:14.00,0:04:19.00,Default,,0000,0000,0000,,Bon, après l'introduction en accéléré, Dialogue: 0,0:04:19.00,0:04:25.00,Default,,0000,0000,0000,,Je parlerais de quelques techniques, puis présenterai CoST, mon programme Dialogue: 0,0:04:25.00,0:04:28.01,Default,,0000,0000,0000,,et je parlerais aussi un peu du format PE Dialogue: 0,0:04:28.01,0:04:34.00,Default,,0000,0000,0000,,Bon, vous connaissez tous l'assembleur, on va survoler ... Dialogue: 0,0:04:34.00,0:04:37.01,Default,,0000,0000,0000,,Donc, on compile un binaire, il y a de l'assembleur, il y a Dialogue: 0,0:04:37.01,0:04:44.00,Default,,0000,0000,0000,,un rapport, des points communs entre le code source et l'assembleur généré... Dialogue: 0,0:04:44.00,0:04:48.01,Default,,0000,0000,0000,,et bien sûr, une relation entre langage machine et les opcodes Dialogue: 0,0:04:48.01,0:04:53.01,Default,,0000,0000,0000,,ce qui est important est que l'assembleur est généré par le compilateur, mais ce qui reste Dialogue: 0,0:04:56.01,0:04:59.01,Default,,0000,0000,0000,,dans le binaire, sont uniquement les opcodes, qui sont interprétés Dialogue: 0,0:04:59.01,0:05:03.00,Default,,0000,0000,0000,,directement par le processeur, ce qui implique qu'il sache quoi faire avec, Dialogue: 0,0:05:03.00,0:05:07.00,Default,,0000,0000,0000,,il s'en fiche si vous ou vos outils Dialogue: 0,0:05:07.00,0:05:10.01,Default,,0000,0000,0000,,ne savent pas ce qui va arriver. il le fait, tout simplement. Dialogue: 0,0:05:10.01,0:05:16.00,Default,,0000,0000,0000,,Et le problème, c'est que d'habitude, on ne lit pas les opcodes directement, mais le désassemblage Dialogue: 0,0:05:16.00,0:05:20.01,Default,,0000,0000,0000,,donc si le désassemblage échoue, on est bloqué Dialogue: 0,0:05:20.01,0:05:25.00,Default,,0000,0000,0000,,on est aveugle, on ne sait pas ce qui va s'exécuter Dialogue: 0,0:05:25.00,0:05:28.00,Default,,0000,0000,0000,,l'autre problème est comme les instructions sont de longueurs variables Dialogue: 0,0:05:28.00,0:05:30.00,Default,,0000,0000,0000,,on ne sait pas ou la suivante commence Dialogue: 0,0:05:30.00,0:05:32.00,Default,,0000,0000,0000,,donc même la suite est inconnue. Dialogue: 0,0:05:32.00,0:05:40.00,Default,,0000,0000,0000,,Donc, on créé une seule instruction non documentée dans un programme simple Dialogue: 0,0:05:40.00,0:05:48.01,Default,,0000,0000,0000,,on utilise le mot-clef 'emit' -- c'est Visual Studio 2010 ultimate -- Dialogue: 0,0:05:48.01,0:05:52.00,Default,,0000,0000,0000,,et on obtient un octet non identifié au désassemblage Dialogue: 0,0:05:52.00,0:05:58.00,Default,,0000,0000,0000,,on a des juste points d'interrogations. Dialogue: 0,0:05:58.00,0:06:01.01,Default,,0000,0000,0000,,et donc, même si Visual Studio coûte plusieurs milliers d'euros Dialogue: 0,0:06:01.01,0:06:05.00,Default,,0000,0000,0000,,il ne sait pas ce qui va se produire.... Dialogue: 0,0:06:05.00,0:06:09.00,Default,,0000,0000,0000,,et si on regarde les documentations Intel Dialogue: 0,0:06:09.00,0:06:14.00,Default,,0000,0000,0000,,circulez, il y a rien a voir... l'opcode D6... inconnu au bataillon Dialogue: 0,0:06:14.00,0:06:17.01,Default,,0000,0000,0000,,Microsoft n'a rien à dire, Intel non plus, Dialogue: 0,0:06:17.01,0:06:21.00,Default,,0000,0000,0000,,donc d'habitude, si vous essayez des choses comme ça, attendez-vous au pire. Dialogue: 0,0:06:21.00,0:06:26.00,Default,,0000,0000,0000,,Donc, aucune information... en général, ça annonce un plantage... Dialogue: 0,0:06:26.00,0:06:29.01,Default,,0000,0000,0000,,mais dans ce cas particulier, aucun problème... Dialogue: 0,0:06:29.01,0:06:35.00,Default,,0000,0000,0000,,nous ne savons pas ce qui se passe, si on regarde les docs Intel et Microsoft, on n'en sait pas plus. Dialogue: 0,0:06:35.00,0:06:41.00,Default,,0000,0000,0000,,Mais le CPU a juste fait son boulot dans son coin. Ce qui s'est passé est qu'en fait Dialogue: 0,0:06:41.00,0:06:49.00,Default,,0000,0000,0000,,D6 est un opcode très simple, qui ne fait pas grand chose, mais pas documenté par Intel, Dialogue: 0,0:06:49.00,0:06:53.01,Default,,0000,0000,0000,,par contre, il l'est par AMD, et la plupart le sont aussi également, par AMD mais pas Intel Dialogue: 0,0:06:53.01,0:06:58.00,Default,,0000,0000,0000,,aucune idée pourquoi. si quelqu'un le sait... Dialogue: 0,0:06:58.00,0:07:04.00,Default,,0000,0000,0000,,c'est un opcode pourtant trivial, pourtant... 'y a rien à voir, continuez votre chemin' Dialogue: 0,0:07:04.00,0:07:08.00,Default,,0000,0000,0000,,Il est utilisé souvent... l'utilisation habituelle de tels opcodes sont les virus et les packeurs Dialogue: 0,0:07:08.00,0:07:13.00,Default,,0000,0000,0000,,pour éviter les analyses automatisées où trop facile. Dialogue: 0,0:07:13.00,0:07:22.00,Default,,0000,0000,0000,,Ce qui est ironique, c'est que si vous regardez la doc, elle est pleine de trous. mais le désassembleur d'Intel, Dialogue: 0,0:07:22.00,0:07:25.00,Default,,0000,0000,0000,,Xed, qui est gratuit mais pas ouvert, gère tous ces opcodes sans problème... Dialogue: 0,0:07:25.00,0:07:35.00,Default,,0000,0000,0000,,Alors que Microsoft, Visual Studio, et WinDBG, suivent la documentation aveuglément Dialogue: 0,0:07:35.00,0:07:43.00,Default,,0000,0000,0000,,Donc vous obtiendrez des points d'interrogation alors qu'Intel sait très bien ce qui se passe Dialogue: 0,0:07:43.00,0:07:52.00,Default,,0000,0000,0000,,'faites ce que je fais, pas ce que je dit' Dialogue: 0,0:07:52.00,0:08:01.00,Default,,0000,0000,0000,,donc, bien sûr, vous me direz que WinDbg est fait uniquement ce qui est généré Dialogue: 0,0:08:01.00,0:08:08.00,Default,,0000,0000,0000,,par les compilateurs Microsoft, mais ça exclut WinDBG comme outil d'analyse de virus: Dialogue: 0,0:08:08.00,0:08:17.01,Default,,0000,0000,0000,,vous rajoutez D6, trivial, et WinDbg est muet. Dialogue: 0,0:08:17.01,0:08:25.00,Default,,0000,0000,0000,,pas génial Dialogue: 0,0:08:25.00,0:08:32.01,Default,,0000,0000,0000,,un autre problème est que toutes ses choses non documentées Dialogue: 0,0:08:32.01,0:08:37.01,Default,,0000,0000,0000,,sont peut-être présentes, l'une dans un virus, Dialogue: 0,0:08:37.01,0:08:42.00,Default,,0000,0000,0000,,l'autre dans un packeur, etc... donc il n'est pas facile Dialogue: 0,0:08:42.00,0:08:46.00,Default,,0000,0000,0000,,de trouver un bon regroupement de tels fichiers pour rassembler toutes ces informations Dialogue: 0,0:08:46.00,0:08:50.00,Default,,0000,0000,0000,,donc par exemple, Dialogue: 0,0:08:50.00,0:08:53.00,Default,,0000,0000,0000,,quelqu'un vous parle d'une astuce Dialogue: 0,0:08:53.00,0:08:55.01,Default,,0000,0000,0000,,et vous dit qu'elle est enfouit dans MebRoot (un virus costaud) Dialogue: 0,0:08:55.01,0:08:58.01,Default,,0000,0000,0000,,donc vous êtes obligé de creuser pour voir juste la partie qui vous intéresse Dialogue: 0,0:08:58.01,0:09:03.01,Default,,0000,0000,0000,,et en plus, on sait que c'est un virus, donc ca ne circule pas facilement, Dialogue: 0,0:09:03.01,0:09:08.01,Default,,0000,0000,0000,,et il y a plein de trucs dedans qui n'ont rien à voir dedans, Dialogue: 0,0:09:08.01,0:09:15.00,Default,,0000,0000,0000,,avant ou après ce qui vous intéresse. Donc c'est le fossé que je veux remplir en fournissant Dialogue: 0,0:09:15.00,0:09:21.00,Default,,0000,0000,0000,,un groupe de fichier à la fois simple et complet, et focalisé. Dialogue: 0,0:09:21.00,0:09:27.01,Default,,0000,0000,0000,,Donc, on commence. enfin, du vrai, quelques opcodes non documentés. Dialogue: 0,0:09:27.01,0:09:37.00,Default,,0000,0000,0000,,Mais avant d'avoir commencé à étudier, je me suis demandé quelles étaient les vrais capacités Dialogue: 0,0:09:37.00,0:09:44.00,Default,,0000,0000,0000,,des processeurs, quelles instructions existent vraiment. Dialogue: 0,0:09:44.00,0:09:52.00,Default,,0000,0000,0000,,C'est un peu comme l'anglais: la plupart de la population mondiale comprend ces mots, et Dialogue: 0,0:09:52.00,0:09:57.01,Default,,0000,0000,0000,,si vous avez déjà désassemblé quelque chose, vous êtes habitués à ces instructions Dialogue: 0,0:09:57.01,0:10:04.00,Default,,0000,0000,0000,,tous les compilateurs les utilisent. elles sont tellement répandues que si elles sont absentes, Dialogue: 0,0:10:04.00,0:10:08.01,Default,,0000,0000,0000,,on se sent pris au dépourvu. Dialogue: 0,0:10:08.01,0:10:19.01,Default,,0000,0000,0000,,mais les processeurs Intels datent des années 70. Donc, Dialogue: 0,0:10:19.01,0:10:27.01,Default,,0000,0000,0000,,comme l'anglais de Shakespeare, vous voyez que c'est de l'anglais... mais, ça veut dire quoi en fait ? Dialogue: 0,0:10:27.01,0:10:30.00,Default,,0000,0000,0000,,d'ailleurs, j'ai déjà oublié Dialogue: 0,0:10:30.00,0:10:36.00,Default,,0000,0000,0000,,ces instructions sont toutes gérées par tous nos processeurs, pourtant, on n'a plus l'habitude de les lire Dialogue: 0,0:10:36.00,0:10:41.01,Default,,0000,0000,0000,,c'est plus que génant Dialogue: 0,0:10:41.01,0:10:46.01,Default,,0000,0000,0000,,En fait, j'ai écrit un exemple qui n'utilisent que ces vieilles instructions, qui font vraiment quelque chose Dialogue: 0,0:10:46.01,0:10:53.00,Default,,0000,0000,0000,,donc si vous vous sentez ici comme chez vous, je voudrais vous demander 'quel âge avez-vous ?' Dialogue: 0,0:10:53.00,0:10:59.01,Default,,0000,0000,0000,,parce que même moi, j'ai l'habitude de PUSH/JUMP/CALLs, mais ça, euhh... Dialogue: 0,0:10:59.01,0:11:05.01,Default,,0000,0000,0000,,pourtant, ça marche même sur un i7, et c'est utilisable par les virus, Dialogue: 0,0:11:05.01,0:11:13.01,Default,,0000,0000,0000,,les packeurs, etc... pourtant, la plupart est complètement inutilisée de nos jours, bien que parfaitement Dialogue: 0,0:11:13.01,0:11:15.01,Default,,0000,0000,0000,,gérées par nos processeurs modernes. Dialogue: 0,0:11:15.01,0:11:21.00,Default,,0000,0000,0000,,Et, tel l'anglais, c'est une langue qui évolue, et les générations précédentes Dialogue: 0,0:11:21.00,0:11:27.01,Default,,0000,0000,0000,,n'ont pas l'habitude des derniers mots à la mode. Dialogue: 0,0:11:27.01,0:11:35.00,Default,,0000,0000,0000,,Ces instructions sont parfois présentes sur les processeurs les plus récent. en une seule instruction, on fait Dialogue: 0,0:11:35.00,0:11:41.00,Default,,0000,0000,0000,,un CRC32, on décrypte l'AES, on compare des chaînes, ou d'autres opérations complexes. Dialogue: 0,0:11:41.00,0:11:47.01,Default,,0000,0000,0000,,Donc, c'est possible sur un processeur moderne. pas tous, bien sûr. Dialogue: 0,0:11:47.01,0:11:54.01,Default,,0000,0000,0000,,une que j'aime bien est MOVBE -- move big endian -- parce que c'est le vilain petit canard du lot... Dialogue: 0,0:11:54.01,0:12:01.01,Default,,0000,0000,0000,,uniquement implémentée sur les processeurs Atom, donc comme ce netbook, qui la gère... Dialogue: 0,0:12:01.01,0:12:09.00,Default,,0000,0000,0000,,alors qu'un i7 64-bits ne l'a pas, même si lui aura CRC32, peut-être AES, etc... Dialogue: 0,0:12:09.00,0:12:12.00,Default,,0000,0000,0000,,donc, tant pis pour la retro-compatibilité Dialogue: 0,0:12:12.00,0:12:20.00,Default,,0000,0000,0000,,à ma connaissance, il n'y existe aucun processeur qui gère à la fois CRC32 et MOVBE. Dialogue: 0,0:12:20.00,0:12:24.01,Default,,0000,0000,0000,,De plus, MOVBE est un peu inutile car il fait la même chose que MOV et BSWAP réunit... Dialogue: 0,0:12:24.01,0:12:32.00,Default,,0000,0000,0000,,donc, bizarre. en tout cas, ce mini-PC a une instruction que la plupart des PC n'ont pas Dialogue: 0,0:12:32.00,0:12:35.00,Default,,0000,0000,0000,,Pourquoi ? quelqu'un sait? Dialogue: 0,0:12:35.00,0:12:37.01,Default,,0000,0000,0000,,[Auditeur:] "cette instruction est documentée ?" Dialogue: 0,0:12:37.01,0:12:38.01,Default,,0000,0000,0000,,oui Dialogue: 0,0:12:38.01,0:12:42.01,Default,,0000,0000,0000,,totalement documentée officiellement Dialogue: 0,0:12:42.01,0:12:46.01,Default,,0000,0000,0000,,[Auditeur:] "Mais, c'est un drapeau du processeur juste pour cette instruction, ou implicitement lié au Dialogue: 0,0:12:46.01,0:12:51.00,Default,,0000,0000,0000,,processeurs Atom ? Dialogue: 0,0:12:51.00,0:12:58.00,Default,,0000,0000,0000,,mmm, je ne sais pas. je vérifie la valeur par CPUID, mais j'ai oublié la définition exacte. Dialogue: 0,0:12:58.00,0:13:07.00,Default,,0000,0000,0000,,il y a tant d'informations données par CPUID que j'ai vite oublié. Dialogue: 0,0:13:07.00,0:13:13.01,Default,,0000,0000,0000,,Autre chose, spécifique à Windows, car je m'intéresse aux virus... Dialogue: 0,0:13:13.01,0:13:22.00,Default,,0000,0000,0000,,avant d'exécuter quoi que ce soit, je me demandais quelle était la valeur initiale de chaque registre Dialogue: 0,0:13:22.00,0:13:28.01,Default,,0000,0000,0000,,quand le programme démarre. Dialogue: 0,0:13:28.01,0:13:33.01,Default,,0000,0000,0000,,et ça vous donne en fait de l'information fiable, qu'on retrouve utilisée par les virus Dialogue: 0,0:13:33.01,0:13:40.00,Default,,0000,0000,0000,,donc par exemple, au démarrage, EAX vous dit si vous êtes sur un OS ancien (XP ou avant) Dialogue: 0,0:13:40.00,0:13:42.01,Default,,0000,0000,0000,,ou plus récent, Vista ou 7. Dialogue: 0,0:13:42.01,0:13:50.01,Default,,0000,0000,0000,,de même, ce n'est pas utilisé par les virus à mon souvenir, mais si GS est nul, on est dans un OS 32 bits Dialogue: 0,0:13:50.01,0:13:54.00,Default,,0000,0000,0000,,sinon, sur un 64b. Dialogue: 0,0:13:54.00,0:13:56.01,Default,,0000,0000,0000,,J'utilise ça régulièrement, on le verra plus tard. Dialogue: 0,0:13:56.01,0:14:04.00,Default,,0000,0000,0000,,De même, la relation entre les registres n'est pas forcément évidente. il y en a beaucoup, Dialogue: 0,0:14:04.00,0:14:10.01,Default,,0000,0000,0000,,et j'ai été surpris qu'une instruction à virgule flottante (FPU) change le statut (FST), les registres Dialogue: 0,0:14:10.01,0:14:18.00,Default,,0000,0000,0000,,eux-mêmes (STx), les registres MMx aussi, mais en plus, toutes les documentations en ligne associent Dialogue: 0,0:14:18.00,0:14:24.01,Default,,0000,0000,0000,,ST0 et MM0, ce qui semble logique, alors qu'en fait, une seule instruction modifie Dialogue: 0,0:14:24.01,0:14:31.00,Default,,0000,0000,0000,,non pas MM0, mais MM7, dans l'autre sens. Dialogue: 0,0:14:31.00,0:14:36.01,Default,,0000,0000,0000,,donc après une instruction comme "load PI" [FLDPI] on regarde la valeur de MM7, Dialogue: 0,0:14:36.01,0:14:39.00,Default,,0000,0000,0000,,ça peut-être utilisé comme astuce simple. Dialogue: 0,0:14:39.00,0:14:45.01,Default,,0000,0000,0000,,alors que toutes les documentations, Wikipedia ou autre, se trompent. Dialogue: 0,0:14:45.01,0:14:53.00,Default,,0000,0000,0000,,quelque chose d'autre qui peut être utilisé comme anti-débogueur sous XP: le FPU modifie aussi CR0 Dialogue: 0,0:14:53.00,0:14:59.01,Default,,0000,0000,0000,,donc ça fait une astuce anti-émulateur plutôt inattendue rien qu'avec le FPU. Dialogue: 0,0:14:59.01,0:15:09.00,Default,,0000,0000,0000,,'store machine status word' [SMSW] est une instruction qui date du 286, quand le mode protégé était Dialogue: 0,0:15:09.00,0:15:18.00,Default,,0000,0000,0000,,récent et incomplet, qui permet de lire les valeurs de CR0, même depuis le mode utilisateur. Dialogue: 0,0:15:18.00,0:15:26.01,Default,,0000,0000,0000,,alors que 'MOV CR0' est privilégiée Dialogue: 0,0:15:26.01,0:15:34.00,Default,,0000,0000,0000,,pour une raison inconnue, le mot de poid fort est officiellement non défini. Dialogue: 0,0:15:34.00,0:15:40.00,Default,,0000,0000,0000,,donc à priori, on ne sait pas ce qu'il va contenir, Dialogue: 0,0:15:40.00,0:15:45.01,Default,,0000,0000,0000,,mais en fait il s'agit bien du même mot de poid fort que CR0. Dialogue: 0,0:15:45.01,0:15:52.01,Default,,0000,0000,0000,,et, sous XP, après une instruction FPU, la valeur de CR0 est modifiée, mais reprend sa valeur initiale Dialogue: 0,0:15:52.01,0:16:00.00,Default,,0000,0000,0000,,toute seule par la suite. donc juste avec SMSW, verifier le résultat, puis faire une opération FPU, Dialogue: 0,0:16:00.00,0:16:05.01,Default,,0000,0000,0000,,alors SMSW donnera un résultat différent, mais ensuite, le résultat redeviendra comme à l'origine. Dialogue: 0,0:16:05.01,0:16:11.00,Default,,0000,0000,0000,,un moyen élégant de faire des boucles en apparence infinies. une astuce complexe anti-émulateurs. Dialogue: 0,0:16:11.00,0:16:18.01,Default,,0000,0000,0000,,Une astuce similaire sous Windows 32b, où GS n'est pas stocké dans le CONTEXT, donc quand l'OS passe d'un Dialogue: 0,0:16:18.01,0:16:25.01,Default,,0000,0000,0000,,fil d'exécution à l'autre (thread-switch), GS est remis à zero. Donc, si on attend, quoi qu'on fasse, Dialogue: 0,0:16:25.01,0:16:33.00,Default,,0000,0000,0000,,GS change comme par enchantement. Mais si vous faites du pas à pas, c'est lent, donc l'OS change de fil, Dialogue: 0,0:16:33.00,0:16:40.00,Default,,0000,0000,0000,,et GS est perdu dès l'instruction suivante. Dialogue: 0,0:16:40.00,0:16:45.01,Default,,0000,0000,0000,,De même, si on attend que GS devienne nul, on finira par sortir de la boucle. Dialogue: 0,0:16:45.01,0:16:53.00,Default,,0000,0000,0000,,En tout cas, la première fois, ça défiait mon entendement... sans autres process ou autre, je ne comprenais Dialogue: 0,0:16:53.00,0:16:58.01,Default,,0000,0000,0000,,pas d'où ça venait. Au moins, mon exemple commence dès le début avec ça Dialogue: 0,0:16:58.01,0:17:02.01,Default,,0000,0000,0000,,c'est plus pratique Dialogue: 0,0:17:02.01,0:17:11.00,Default,,0000,0000,0000,,une autre particularité, c'est que ça met du temps pour être remis à zéro. en faisant 2 boucles d'attentes, Dialogue: 0,0:17:11.00,0:17:17.00,Default,,0000,0000,0000,,et mesurant le temps entre les 2 (changement de fil), ça prend somme toute assez longtemps, comparé à une Dialogue: 0,0:17:17.00,0:17:25.00,Default,,0000,0000,0000,,exécution standard. ça fait un anti-émulation solide. Dialogue: 0,0:17:25.00,0:17:33.00,Default,,0000,0000,0000,,Je pensais tout naturellement que NOP était parfait! NOP, c'est NOP, ça ne fait rien, donc, aucun problème ! Dialogue: 0,0:17:33.00,0:17:44.00,Default,,0000,0000,0000,,Mais à l'origine, NOP est 'échange ?AX avec lui-même' (xchg ?ax, ?ax) mais c'est le cas pour le NOP encodé 0x90 Dialogue: 0,0:17:44.00,0:17:51.00,Default,,0000,0000,0000,,mais il y a un autre encodage de XCHG EAX, EAX, qui ne fait rien non plus en 32b Dialogue: 0,0:17:51.00,0:17:54.01,Default,,0000,0000,0000,,mais, à l'instar de toutes les instructions sur 32b en mode 64b Dialogue: 0,0:17:54.01,0:17:58.01,Default,,0000,0000,0000,,cette instruction remet à zéro le double mot de poid fort Dialogue: 0,0:17:58.01,0:18:02.01,Default,,0000,0000,0000,,donc on a un XCHG EAX [,EAX] qui fait quelque chose. Dialogue: 0,0:18:02.01,0:18:05.01,Default,,0000,0000,0000,,bien qu'initialement il semblerait ne rien faire, de sa relation avec NOP Dialogue: 0,0:18:05.01,0:18:10.00,Default,,0000,0000,0000,,mais heureusement, le NOP 0x90, lui, ne fait toujours rien, un vrai fainéant ;) Dialogue: 0,0:18:10.00,0:18:14.00,Default,,0000,0000,0000,,Celui-ci est maintenant bien répandu, Dialogue: 0,0:18:14.00,0:18:18.00,Default,,0000,0000,0000,,le HINT NOP est un NOP sur plusieurs octets Dialogue: 0,0:18:18.00,0:18:23.00,Default,,0000,0000,0000,,qui indique au processeur ce qui va être exécuté ou accédé ensuite Dialogue: 0,0:18:23.00,0:18:24.00,Default,,0000,0000,0000,,quelque soit l'adresse dans un HINT NOP en mémoire, Dialogue: 0,0:18:24.00,0:18:26.00,Default,,0000,0000,0000,,aucune exception n'est déclenchée Dialogue: 0,0:18:26.00,0:18:32.00,Default,,0000,0000,0000,,mais ... Dialogue: 0,0:18:32.00,0:18:37.00,Default,,0000,0000,0000,,autre chose, il est partiellement non documenté par Intel Dialogue: 0,0:18:37.00,0:18:44.00,Default,,0000,0000,0000,,(comme d'habitude, ce n'est pas le cas avec AMD) Dialogue: 0,0:18:44.00,0:18:48.00,Default,,0000,0000,0000,,en outre, comme c'est une instruction sur plusieurs octets, avec des opérandes immédiates Dialogue: 0,0:18:48.00,0:18:51.01,Default,,0000,0000,0000,,si on met ces octets à la fin d'une page mémoire Dialogue: 0,0:18:51.01,0:18:55.00,Default,,0000,0000,0000,,alors le processeur va vouloir lire l'encodage des opérandes, Dialogue: 0,0:18:55.00,0:18:56.01,Default,,0000,0000,0000,,et ça va déclencher une exception Dialogue: 0,0:18:56.01,0:19:01.00,Default,,0000,0000,0000,,donc c'est un NOP qui peut déclencher une exception en bas de page Dialogue: 0,0:19:01.00,0:19:04.00,Default,,0000,0000,0000,,Merci, Intel Dialogue: 0,0:19:04.00,0:19:07.00,Default,,0000,0000,0000,,MOV également, je croyais... Dialogue: 0,0:19:07.00,0:19:11.00,Default,,0000,0000,0000,,qu'il devrait être parfaitement logique Dialogue: 0,0:19:11.00,0:19:16.00,Default,,0000,0000,0000,,mais, même s'il est documenté, il y a des cas compliqués, Dialogue: 0,0:19:16.00,0:19:19.01,Default,,0000,0000,0000,,qui n'étaient pas parfaitement gérés dans tous les assembleurs que j'ai essayé Dialogue: 0,0:19:19.01,0:19:22.01,Default,,0000,0000,0000,,sauf peut-être Xed Dialogue: 0,0:19:22.01,0:19:29.00,Default,,0000,0000,0000,,on ne peut pas faire un MOV de ou vers CR0 en mémoire, Dialogue: 0,0:19:29.00,0:19:33.00,Default,,0000,0000,0000,,la documentation dit que le Mod/RM est ignoré Dialogue: 0,0:19:33.00,0:19:34.00,Default,,0000,0000,0000,,ce qui ne veut pas dire que l'instruction est invalide Dialogue: 0,0:19:34.00,0:19:35.00,Default,,0000,0000,0000,,simplement, considéré comme n'utilisant pas la mémoire Dialogue: 0,0:19:35.00,0:19:36.01,Default,,0000,0000,0000,,sinon, ça ferait un plantage Dialogue: 0,0:19:36.01,0:19:39.00,Default,,0000,0000,0000,,donc, voici l'équivalent Dialogue: 0,0:19:39.00,0:19:42.00,Default,,0000,0000,0000,,ce qui mettait en tord tous les désassembleurs Dialogue: 0,0:19:42.00,0:19:44.00,Default,,0000,0000,0000,,jusque récemment Dialogue: 0,0:19:44.00,0:19:50.00,Default,,0000,0000,0000,,MOVSXD est une instruction 64b, qui étend un registre Dialogue: 0,0:19:50.00,0:19:55.00,Default,,0000,0000,0000,,donc, d'un registre vers un plus gros Dialogue: 0,0:19:55.00,0:19:58.00,Default,,0000,0000,0000,,mais sans préfixe REX - ce qui n'est pas encouragé, Dialogue: 0,0:19:58.00,0:20:02.00,Default,,0000,0000,0000,,on peut l'utiliser comme un MOV standard, de 32b vers 32b Dialogue: 0,0:20:02.00,0:20:04.00,Default,,0000,0000,0000,,et dans l'autre sens, Dialogue: 0,0:20:04.00,0:20:09.01,Default,,0000,0000,0000,,MOV d'un selecteur à un registre 32b marche sans problème, Dialogue: 0,0:20:09.01,0:20:13.00,Default,,0000,0000,0000,,alors que beaucoup de désassembleurs afficheraient MOV AX, CS, ce qui semble logique Dialogue: 0,0:20:13.00,0:20:16.00,Default,,0000,0000,0000,,niveau taille Dialogue: 0,0:20:16.00,0:20:19.01,Default,,0000,0000,0000,,mais en fait le mot de poid fort du registre cible est 'non défini' Dialogue: 0,0:20:19.01,0:20:21.01,Default,,0000,0000,0000,,mais ici, pas de surprise amusante, Dialogue: 0,0:20:21.01,0:20:25.00,Default,,0000,0000,0000,,ce sont juste des zéros Dialogue: 0,0:20:25.00,0:20:30.00,Default,,0000,0000,0000,,donc c'est équivalent à MOV EAX, CS Dialogue: 0,0:20:30.00,0:20:32.00,Default,,0000,0000,0000,,BSWAP est un de mes favoris Dialogue: 0,0:20:32.00,0:20:35.00,Default,,0000,0000,0000,,parce que je le compare à une administration: Dialogue: 0,0:20:35.00,0:20:38.00,Default,,0000,0000,0000,,il est supposé passer d'un endianisme [endianness] à l' autre Dialogue: 0,0:20:38.00,0:20:42.01,Default,,0000,0000,0000,,mais pour diverses raisons, Dialogue: 0,0:20:42.01,0:20:45.00,Default,,0000,0000,0000,,il ne peut jamais faire son travail correctement Dialogue: 0,0:20:45.00,0:20:50.00,Default,,0000,0000,0000,,donc, c'est juste en 64b que tout se passe Dialogue: 0,0:20:50.00,0:20:51.01,Default,,0000,0000,0000,,comme prévu Dialogue: 0,0:20:51.01,0:20:55.01,Default,,0000,0000,0000,,en 32b, comme toutes les autres instruction 32b Dialogue: 0,0:20:55.01,0:20:59.00,Default,,0000,0000,0000,,le double mot de poid fort est mis à zéro... Dialogue: 0,0:20:59.00,0:21:02.01,Default,,0000,0000,0000,,et sur un mot, il est non défini officiellement, Dialogue: 0,0:21:02.01,0:21:04.00,Default,,0000,0000,0000,,mais il est pourtant utilisé couramment dans les virus et les packeurs Dialogue: 0,0:21:04.01,0:21:07.00,Default,,0000,0000,0000,,car il remet simplement à zéro le registre, Dialogue: 0,0:21:07.00,0:21:09.00,Default,,0000,0000,0000,,comme un simple XOR AX, AX Dialogue: 0,0:21:09.00,0:21:14.00,Default,,0000,0000,0000,,donc, devant un résultat si inexplicable, je comprends Dialogue: 0,0:21:14.00,0:21:18.01,Default,,0000,0000,0000,,qu'Intel ne veuille pas en parler Dialogue: 0,0:21:18.01,0:21:20.01,Default,,0000,0000,0000,,ça serait sûrement gênant de devoir expliquer Dialogue: 0,0:21:20.01,0:21:24.01,Default,,0000,0000,0000,,ce résultat plutôt comique. Dialogue: 0,0:21:24.01,0:21:33.00,Default,,0000,0000,0000,,BSWAP AX est aussi mal géré par WinDbg et les autres Dialogue: 0,0:21:33.00,0:21:35.01,Default,,0000,0000,0000,,on lira BSWAP EAX Dialogue: 0,0:21:35.01,0:21:42.00,Default,,0000,0000,0000,,alors que le registre est remis à zéro... génant Dialogue: 0,0:21:42.00,0:21:47.00,Default,,0000,0000,0000,,tout le monde comprend ce code? Dialogue: 0,0:21:47.00,0:21:53.00,Default,,0000,0000,0000,,quelqu'un voit un piège possible? Dialogue: 0,0:21:53.00,0:21:56.01,Default,,0000,0000,0000,,l'adresse de est empilée Dialogue: 0,0:21:56.01,0:22:00.00,Default,,0000,0000,0000,,puis dépilée par RETN Dialogue: 0,0:22:00.00,0:22:05.01,Default,,0000,0000,0000,,donc, on saute vers une adresse immédiates Dialogue: 0,0:22:05.01,0:22:11.00,Default,,0000,0000,0000,,l'ordre d'exécution ? Dialogue: 0,0:22:11.00,0:22:18.00,Default,,0000,0000,0000,,oui, l'exécution démarre ici Dialogue: 0,0:22:18.00,0:22:20.01,Default,,0000,0000,0000,,non, rien à voir ici Dialogue: 0,0:22:20.01,0:22:26.00,Default,,0000,0000,0000,,voilà OllyDbg 1 - c'est corrigé dans le 2 Dialogue: 0,0:22:26.00,0:22:28.00,Default,,0000,0000,0000,,Olly essaie même d'être sympa et de vous dire Dialogue: 0,0:22:28.00,0:22:30.00,Default,,0000,0000,0000,,via un commentaire automatique, Dialogue: 0,0:22:30.00,0:22:33.00,Default,,0000,0000,0000,,que RET sera utilisé comme saut vers Dialogue: 0,0:22:33.00,0:22:36.00,Default,,0000,0000,0000,,et, voyez le résultat, plutôt différent Dialogue: 0,0:22:36.00,0:22:37.00,Default,,0000,0000,0000,,donc, que c'est-il passé ? Dialogue: 0,0:22:37.00,0:22:40.00,Default,,0000,0000,0000,,quelqu'un voit ? Dialogue: 0,0:22:40.00,0:22:43.00,Default,,0000,0000,0000,,donc, RETN a un prefix 66 Dialogue: 0,0:22:43.00,0:22:47.00,Default,,0000,0000,0000,,donc, il retourne vers IP (16b), pas EIP Dialogue: 0,0:22:47.00,0:22:56.00,Default,,0000,0000,0000,,donc on ne saute pas vers 401008, mais 00001008 Dialogue: 0,0:22:56.00,0:22:58.01,Default,,0000,0000,0000,,et dans mon exemple, la page nulle a été allouée Dialogue: 0,0:22:58.01,0:23:01.00,Default,,0000,0000,0000,,et du code a été placé à 1008 Dialogue: 0,0:23:01.00,0:23:06.00,Default,,0000,0000,0000,,donc, ça ne retourne pas vers [] Dialogue: 0,0:23:06.00,0:23:10.01,Default,,0000,0000,0000,,mais l'autre problème est que c'est aussi appelé un RETN Dialogue: 0,0:23:10.01,0:23:15.01,Default,,0000,0000,0000,,bien que ce soit différent. les désassembleurs ont leur propre façon de l'afficher Dialogue: 0,0:23:15.01,0:23:19.00,Default,,0000,0000,0000,,tel que 'small retn', 'ret.16', ou autre Dialogue: 0,0:23:19.00,0:23:22.01,Default,,0000,0000,0000,,mais officiellement, c'est la même instruction qu'un RETN standard. Dialogue: 0,0:23:22.01,0:23:28.01,Default,,0000,0000,0000,,donc, le dernier Hiew, et OllyDbg 1 Dialogue: 0,0:23:28.01,0:23:31.00,Default,,0000,0000,0000,,peut-être pas le 2 Dialogue: 0,0:23:31.00,0:23:33.00,Default,,0000,0000,0000,,mais on peut se faire avoir Dialogue: 0,0:23:33.00,0:23:41.00,Default,,0000,0000,0000,,et le préfixe 66 a le même role avec CALLs, RETs, LOOPs, JMPs Dialogue: 0,0:23:41.00,0:23:45.01,Default,,0000,0000,0000,,toutes les instructions contrôlant le flux d'exécution Dialogue: 0,0:23:45.01,0:23:48.00,Default,,0000,0000,0000,,je ne vais pas tout énumérer Dialogue: 0,0:23:48.00,0:23:51.01,Default,,0000,0000,0000,,car sinon vous allez mourir d'ennui Dialogue: 0,0:23:51.01,0:23:55.00,Default,,0000,0000,0000,,pour en savoir plus, j'ai créé une page sur Corkami [x86.corkami.com], Dialogue: 0,0:23:55.00,0:24:00.01,Default,,0000,0000,0000,,avec quelques graphiques et penses-bêtes Dialogue: 0,0:24:00.01,0:24:04.01,Default,,0000,0000,0000,,pour faciliter le boulot Dialogue: 0,0:24:04.01,0:24:06.01,Default,,0000,0000,0000,,bon, trop de théorie Dialogue: 0,0:24:06.01,0:24:11.01,Default,,0000,0000,0000,,je n'aime pas lire sans avoir quelque chose à me mettre sous le débogueur, Dialogue: 0,0:24:11.01,0:24:13.01,Default,,0000,0000,0000,,donc j'ai créé CoST Dialogue: 0,0:24:13.01,0:24:16.00,Default,,0000,0000,0000,,ce qui signifie Corkami Standard Test Dialogue: 0,0:24:16.00,0:24:20.00,Default,,0000,0000,0000,,CoST est un unique binaire, sans option de ligne de commande Dialogue: 0,0:24:20.00,0:24:25.00,Default,,0000,0000,0000,,on l'exécute, il fait plein de tests Dialogue: 0,0:24:25.00,0:24:28.01,Default,,0000,0000,0000,,le tout dans un PE compliqué Dialogue: 0,0:24:28.01,0:24:35.00,Default,,0000,0000,0000,,pour aussi tester vos outils PE Dialogue: 0,0:24:35.00,0:24:36.00,Default,,0000,0000,0000,,ou vos connaissances Dialogue: 0,0:24:36.00,0:24:40.00,Default,,0000,0000,0000,,mais, dans ce PE compliqué, il est casse-pied à déboguer Dialogue: 0,0:24:40.00,0:24:42.01,Default,,0000,0000,0000,,donc j'ai fait aussi une version 'PE standard' Dialogue: 0,0:24:42.01,0:24:47.00,Default,,0000,0000,0000,,si on ne veut étudier que l'assembleur Dialogue: 0,0:24:47.00,0:24:49.00,Default,,0000,0000,0000,,sans difficultés Dialogue: 0,0:24:49.00,0:24:57.01,Default,,0000,0000,0000,,donc, CoST contient de nombreux tests Dialogue: 0,0:24:57.01,0:24:59.01,Default,,0000,0000,0000,,les classiques, triviaux, Dialogue: 0,0:24:59.01,0:25:03.01,Default,,0000,0000,0000,,un peu plus compliqués, JMP to IP, IRET... Dialogue: 0,0:25:03.01,0:25:05.00,Default,,0000,0000,0000,,les non documentés Dialogue: 0,0:25:05.00,0:25:10.00,Default,,0000,0000,0000,,les spécifiques aux processeurs, comme MOVBE, POPCNT, CRC32 Dialogue: 0,0:25:10.00,0:25:17.01,Default,,0000,0000,0000,,les détections d'OS et VM Dialogue: 0,0:25:17.01,0:25:25.00,Default,,0000,0000,0000,,comme le fameux 'red pill'... juste une instruction SLDT, on compare le résultat, Dialogue: 0,0:25:25.00,0:25:29.00,Default,,0000,0000,0000,,et on baptise ça 'red pill'... sans commentaire... Dialogue: 0,0:25:29.00,0:25:32.01,Default,,0000,0000,0000,,et aussi, des bogues des SE, parce que Windows XP Dialogue: 0,0:25:32.01,0:25:35.00,Default,,0000,0000,0000,,se trompe en essayant de vous dire Dialogue: 0,0:25:35.00,0:25:38.01,Default,,0000,0000,0000,,quelle exception vient de se produire, Dialogue: 0,0:25:38.01,0:25:44.01,Default,,0000,0000,0000,,ce qui permettrait de différencier un SE réel d'un émulateur. Dialogue: 0,0:25:44.01,0:25:50.00,Default,,0000,0000,0000,,CoST est écrit en assembleur, donc rien de superflu Dialogue: 0,0:25:50.00,0:25:52.01,Default,,0000,0000,0000,,pas compilé, ni généré Dialogue: 0,0:25:52.01,0:25:56.01,Default,,0000,0000,0000,,mais pour le documenter un peu plus, j'ai ajouté des exports internes Dialogue: 0,0:25:56.01,0:26:00.00,Default,,0000,0000,0000,,donc on peut aller facilement d'une section à l'autre Dialogue: 0,0:26:00.00,0:26:05.01,Default,,0000,0000,0000,,donc on se retrouve facilement à la partie qui nous intéresse Dialogue: 0,0:26:05.01,0:26:08.00,Default,,0000,0000,0000,,via les exports, Dialogue: 0,0:26:08.00,0:26:13.01,Default,,0000,0000,0000,,et je voulais pouvoir afficher un message de manière pratique Dialogue: 0,0:26:13.01,0:26:18.00,Default,,0000,0000,0000,,sans que ça allonge trop le listing Dialogue: 0,0:26:18.00,0:26:21.01,Default,,0000,0000,0000,,je veux dire, devoir faire défiler l'écran parce qu'il est couvert d'appel à printf Dialogue: 0,0:26:21.01,0:26:25.01,Default,,0000,0000,0000,,donc j'au utilisé un Vectored Exception Handler, et une instruction-marqueur Dialogue: 0,0:26:25.01,0:26:28.00,Default,,0000,0000,0000,,donc plein de commentaires sont affichés, Dialogue: 0,0:26:28.00,0:26:30.00,Default,,0000,0000,0000,,directement dans le code Dialogue: 0,0:26:30.00,0:26:34.01,Default,,0000,0000,0000,,donc ça fait un code binaire documenté sans fichier de symboles de débogage Dialogue: 0,0:26:34.01,0:26:38.01,Default,,0000,0000,0000,,et vous avez vu, il n'y a pas beaucoup d'affichage Dialogue: 0,0:26:38.01,0:26:41.01,Default,,0000,0000,0000,,mais en fait, il y a beaucoup plus d'affichage de déboguage Dialogue: 0,0:26:41.01,0:26:46.01,Default,,0000,0000,0000,,une centaine au moins, qui indiquent même ce qui va se produire, etc Dialogue: 0,0:26:46.01,0:26:49.01,Default,,0000,0000,0000,,donc on est pas pris au dépourvu Dialogue: 0,0:26:49.01,0:26:57.01,Default,,0000,0000,0000,,on est guidé lors de l'analyse Dialogue: 0,0:26:57.01,0:27:00.00,Default,,0000,0000,0000,,quelqu'un comprend de quoi il s'agit? Dialogue: 0,0:27:00.00,0:27:02.01,Default,,0000,0000,0000,,c'est un de mes préférés Dialogue: 0,0:27:02.01,0:27:06.00,Default,,0000,0000,0000,,on ne peut pas voir les opcodes Dialogue: 0,0:27:06.00,0:27:17.01,Default,,0000,0000,0000,,ah, il n'y a pas d'astuce à ce niveau là cette fois-ci ;) Dialogue: 0,0:27:17.01,0:27:19.01,Default,,0000,0000,0000,,donc, on empile des valeurs Dialogue: 0,0:27:19.01,0:27:21.00,Default,,0000,0000,0000,,on saute ici Dialogue: 0,0:27:21.00,0:27:26.00,Default,,0000,0000,0000,,et avec le RETF, j'ai empilé l'adresse de 'push_eip' Dialogue: 0,0:27:26.00,0:27:28.00,Default,,0000,0000,0000,,et un mot, 0x33 Dialogue: 0,0:27:28.00,0:27:31.00,Default,,0000,0000,0000,,donc on va revenir de loin ici Dialogue: 0,0:27:31.00,0:27:35.01,Default,,0000,0000,0000,,donc on retourne à cette adresse avec un sélecteur 33 Dialogue: 0,0:27:35.01,0:27:39.00,Default,,0000,0000,0000,,qui est réservé au mode 64b, même pour un programme en 32b Dialogue: 0,0:27:39.00,0:27:42.01,Default,,0000,0000,0000,,donc on va revenir ici, en mode 64b Dialogue: 0,0:27:42.01,0:27:47.01,Default,,0000,0000,0000,,car 33 est le sélecteur pour le mode 64b Dialogue: 0,0:27:47.01,0:27:49.01,Default,,0000,0000,0000,,qu'on peut atteindre depuis un programme 32b Dialogue: 0,0:27:49.01,0:27:56.00,Default,,0000,0000,0000,,donc le code sera d'abord exécuté en mode 32b, avec le sélecteur standard, Dialogue: 0,0:27:56.00,0:28:01.01,Default,,0000,0000,0000,,puis à nouveau, avec le sélecteur 33 Dialogue: 0,0:28:01.01,0:28:04.00,Default,,0000,0000,0000,,en mode 64b Dialogue: 0,0:28:04.00,0:28:08.00,Default,,0000,0000,0000,,donc on a la même adresse, les mêmes opcodes, Dialogue: 0,0:28:08.00,0:28:10.00,Default,,0000,0000,0000,,mais le désassemblage sera différent Dialogue: 0,0:28:10.00,0:28:14.00,Default,,0000,0000,0000,,et j'ai choisi des opcodes qui génèrent des instructions Dialogue: 0,0:28:14.00,0:28:18.00,Default,,0000,0000,0000,,spécifique à chaque mode Dialogue: 0,0:28:18.00,0:28:22.01,Default,,0000,0000,0000,,donc, c'est déjà une belle s*loperie à désassembler, Dialogue: 0,0:28:22.01,0:28:27.01,Default,,0000,0000,0000,,car avec la même EIP, si on ne fait pas attention au sélecteur, Dialogue: 0,0:28:27.01,0:28:29.00,Default,,0000,0000,0000,,on est bloqué Dialogue: 0,0:28:29.00,0:28:46.01,Default,,0000,0000,0000,,On peut déboguer un tel code - voir ma présentation à BerlinSides, transparent de démonstration 58 Dialogue: 0,0:28:46.01,0:28:50.01,Default,,0000,0000,0000,,Si on l'exécute en passant par dessus, on retourne au sélecteur d'origine Dialogue: 0,0:28:50.01,0:28:52.00,Default,,0000,0000,0000,,qui était sauvé par le PUSH CS Dialogue: 0,0:28:52.00,0:28:56.00,Default,,0000,0000,0000,,donc on retourne à avec le sélecteur initial Dialogue: 0,0:28:56.00,0:28:58.01,Default,,0000,0000,0000,,l'exécution est rapide, Dialogue: 0,0:28:58.01,0:29:00.01,Default,,0000,0000,0000,,mais difficile à déboguer (uniquement avec WinDbg+wow64exts) Dialogue: 0,0:29:00.01,0:29:03.01,Default,,0000,0000,0000,,ça rend inutile les désassembleurs, et la plupart des débogueurs Dialogue: 0,0:29:03.01,0:29:04.01,Default,,0000,0000,0000,,pourtant, c'est si simple. Dialogue: 0,0:29:04.01,0:29:07.00,Default,,0000,0000,0000,,Voilà ce que donne CoST Dialogue: 0,0:29:07.00,0:29:10.01,Default,,0000,0000,0000,,sous la dernière version de Hiew Dialogue: 0,0:29:10.01,0:29:13.00,Default,,0000,0000,0000,,je pense que ce sera bientôt corrigé Dialogue: 0,0:29:13.00,0:29:16.01,Default,,0000,0000,0000,,c'est un HINT NOP non documenté par Intel Dialogue: 0,0:29:16.01,0:29:21.00,Default,,0000,0000,0000,,et oublié par la plupart des désassembleurs Dialogue: 0,0:29:21.00,0:29:24.00,Default,,0000,0000,0000,,donc WinDbg et Hiew Dialogue: 0,0:29:24.00,0:29:29.01,Default,,0000,0000,0000,,vous donnent des points d'interrogations Dialogue: 0,0:29:29.01,0:29:34.01,Default,,0000,0000,0000,,au début, je pensais m'arrêter là pour Hashdays Dialogue: 0,0:29:34.01,0:29:39.01,Default,,0000,0000,0000,,mais j'ai décidé de rajouter quelques astuces PE à CoST Dialogue: 0,0:29:39.01,0:29:43.00,Default,,0000,0000,0000,,donc, en voici l'en-tête... MZ, puis du texte Dialogue: 0,0:29:43.00,0:29:44.00,Default,,0000,0000,0000,,donc on peut taper 'type cost.exe', comme ce bon vieux Budokan... Dialogue: 0,0:29:44.00,0:29:46.01,Default,,0000,0000,0000,,et ensuite, Dialogue: 0,0:29:46.01,0:29:51.01,Default,,0000,0000,0000,,l'en-tête 'NT headers' - appelé 'PE' car il commence par ces lettres-là, Dialogue: 0,0:29:51.01,0:29:54.01,Default,,0000,0000,0000,,et en fait à la fin du fichier Dialogue: 0,0:29:54.01,0:29:56.00,Default,,0000,0000,0000,,le 'pied-de-page PE' Dialogue: 0,0:29:56.00,0:29:59.00,Default,,0000,0000,0000,,et les valeurs de l'en-tête sont un peu extrême Dialogue: 0,0:29:59.00,0:30:01.00,Default,,0000,0000,0000,,donc, pour le moins inattendu Dialogue: 0,0:30:01.00,0:30:03.00,Default,,0000,0000,0000,,donc voici ce qu'IDA 6.1 en pensait Dialogue: 0,0:30:03.00,0:30:07.00,Default,,0000,0000,0000,,...plantage directe... Dialogue: 0,0:30:07.00,0:30:11.00,Default,,0000,0000,0000,,ça lui apprendra à se fier aux valeurs Dialogue: 0,0:30:11.00,0:30:15.01,Default,,0000,0000,0000,,mais, aussi bien dans CoST, on peut changer un registre, faire une comparaison, tester, Dialogue: 0,0:30:15.01,0:30:17.00,Default,,0000,0000,0000,,et enchaîner ainsi plein de tests, Dialogue: 0,0:30:17.00,0:30:19.01,Default,,0000,0000,0000,,aussi bien, côté PE, on n'a qu'un seul binaire, donc Dialogue: 0,0:30:19.01,0:30:21.01,Default,,0000,0000,0000,,un seul essai Dialogue: 0,0:30:21.01,0:30:25.01,Default,,0000,0000,0000,,donc même si CoST n'a pas de section, des TLS bizarres,.... Dialogue: 0,0:30:25.01,0:30:27.01,Default,,0000,0000,0000,,il ne peut pas tout tester Dialogue: 0,0:30:27.01,0:30:31.00,Default,,0000,0000,0000,,donc, j'ai créé pour ça une autre page sur Corkami Dialogue: 0,0:30:31.00,0:30:37.00,Default,,0000,0000,0000,,avec comme d'habitudes, des exemples, des graphiques, Dialogue: 0,0:30:37.00,0:30:40.01,Default,,0000,0000,0000,,elle n'est pas finie, mais déjà largement suffisante pour tester ou faire planter Dialogue: 0,0:30:40.01,0:30:42.01,Default,,0000,0000,0000,,n'importe quel outil Dialogue: 0,0:30:42.01,0:30:46.00,Default,,0000,0000,0000,,j'ai déjà une centaine d'exemples, Dialogue: 0,0:30:46.00,0:30:51.01,Default,,0000,0000,0000,,qui mettent l'accent sur de nombreux aspects, avec parfois des résultats inattendus Dialogue: 0,0:30:51.01,0:30:55.00,Default,,0000,0000,0000,,donc, voici une table de section virtuelle, et Hiew Dialogue: 0,0:30:55.00,0:31:00.00,Default,,0000,0000,0000,,quand les alignements sont bas, on n'a pas besoin de section Dialogue: 0,0:31:00.00,0:31:03.00,Default,,0000,0000,0000,,ou la table peut être vide Dialogue: 0,0:31:03.00,0:31:08.00,Default,,0000,0000,0000,,donc, j'ai modifié SizeOfOptionalHeader pour qu'il pointe en espace mémoire virtuel Dialogue: 0,0:31:08.00,0:31:11.01,Default,,0000,0000,0000,,donc la table des sections est en dehors du PE, pleines de zéros Dialogue: 0,0:31:11.01,0:31:16.00,Default,,0000,0000,0000,,et Hiew n'aime pas ça. En conséquence, il ne pense même pas que c'est un PE Dialogue: 0,0:31:16.00,0:31:18.01,Default,,0000,0000,0000,,alors que ça marche parfaitement, du moins sous XP Dialogue: 0,0:31:18.01,0:31:27.00,Default,,0000,0000,0000,,car Windows 7 est plus capricieux concernant les valeurs de la table des section Dialogue: 0,0:31:27.00,0:31:29.00,Default,,0000,0000,0000,,ensuite... Dialogue: 0,0:31:29.00,0:31:34.00,Default,,0000,0000,0000,,si on fait de l'art dans les Data Directories Dialogue: 0,0:31:34.00,0:31:37.00,Default,,0000,0000,0000,,vous pouvez commencer à vous inquiéter Dialogue: 0,0:31:37.00,0:31:40.00,Default,,0000,0000,0000,,si vous avez un dessin plus joli, je suis preneur Dialogue: 0,0:31:40.00,0:31:43.00,Default,,0000,0000,0000,,donc, il s'agit du 'Dual PE header', présenté Dialogue: 0,0:31:43.00,0:31:46.00,Default,,0000,0000,0000,,par Reversing Labs à la BlackHat Dialogue: 0,0:31:46.00,0:31:50.00,Default,,0000,0000,0000,,quelqu'un connaît ? Dialogue: 0,0:31:50.00,0:31:52.00,Default,,0000,0000,0000,,donc, on augmente SizeOfHeader pour que Dialogue: 0,0:31:52.00,0:31:59.01,Default,,0000,0000,0000,,les en-têtes NT soient en fait assez loin, Dialogue: 0,0:31:59.01,0:32:04.00,Default,,0000,0000,0000,,pour qu'il soit aligné avec les sections Dialogue: 0,0:32:04.00,0:32:05.00,Default,,0000,0000,0000,,quand il se charge en mémoire Dialogue: 0,0:32:05.00,0:32:08.00,Default,,0000,0000,0000,,la première section sera chargée par dessus Dialogue: 0,0:32:08.00,0:32:13.00,Default,,0000,0000,0000,,la première partie du OPTIONAL_HEADER est lue dans le fichier Dialogue: 0,0:32:13.00,0:32:16.00,Default,,0000,0000,0000,,donc, prise en compte pour charger le fichier Dialogue: 0,0:32:16.00,0:32:20.01,Default,,0000,0000,0000,,mais les Data Directories sont lus en mémoire Dialogue: 0,0:32:20.01,0:32:25.00,Default,,0000,0000,0000,,donc, d'abord l'OPTIONAL_HEADER est analysé, chargé en mémoire, Dialogue: 0,0:32:25.00,0:32:29.00,Default,,0000,0000,0000,,puis la section est dépliée sur la partie basse de l'en-tête Dialogue: 0,0:32:29.00,0:32:31.01,Default,,0000,0000,0000,,et les vrais Data directories qui étaient initialement au début de la section Dialogue: 0,0:32:31.01,0:32:34.00,Default,,0000,0000,0000,,vont être pris en compte, Dialogue: 0,0:32:34.00,0:32:39.01,Default,,0000,0000,0000,,donc tout ceci est du pipeau présent dans le fichier, à la suite de SizeOfOptionalHeader Dialogue: 0,0:32:39.01,0:32:45.00,Default,,0000,0000,0000,,mais en mémoire, ce sera écrasé et ignoré Dialogue: 0,0:32:45.00,0:32:47.00,Default,,0000,0000,0000,,une autre bizarrerie est que les noms d'exports peuvent avoir n'importe quelle valeur, Dialogue: 0,0:32:47.00,0:32:51.00,Default,,0000,0000,0000,,jusqu'au caractère zéro Dialogue: 0,0:32:51.00,0:32:53.01,Default,,0000,0000,0000,,donc, absolument n'importe quoi, Dialogue: 0,0:32:53.01,0:32:56.00,Default,,0000,0000,0000,,et de plus, Dialogue: 0,0:32:56.00,0:32:57.00,Default,,0000,0000,0000,,Hiew les affichent directement Dialogue: 0,0:32:57.00,0:32:59.00,Default,,0000,0000,0000,,donc on peut insérer ses propres messages Dialogue: 0,0:32:59.00,0:33:02.00,Default,,0000,0000,0000,,ce sont juste des noms d'exports, d'ailleurs Dialogue: 0,0:33:02.00,0:33:05.01,Default,,0000,0000,0000,,l'un d'entre eux est excessivement long, Dialogue: 0,0:33:05.01,0:33:08.00,Default,,0000,0000,0000,,idéal pour tester les dépassement de tampon [buffer overflow] Dialogue: 0,0:33:08.00,0:33:10.00,Default,,0000,0000,0000,,dans votre outil favori Dialogue: 0,0:33:10.00,0:33:14.00,Default,,0000,0000,0000,,et il est également possible d'avoir un export avec un nom nul, Dialogue: 0,0:33:14.00,0:33:16.00,Default,,0000,0000,0000,,on peut donc importer l'api nulle Dialogue: 0,0:33:16.00,0:33:19.00,Default,,0000,0000,0000,,sans problème Dialogue: 0,0:33:19.00,0:33:23.00,Default,,0000,0000,0000,,j'ai aussi essayé les différentes possibilités, Dialogue: 0,0:33:23.00,0:33:26.00,Default,,0000,0000,0000,,avec des fichiers contenant un maximum de section, Dialogue: 0,0:33:26.00,0:33:31.01,Default,,0000,0000,0000,,la limite est 96 sous XP, et 64K sous Vista et Windows 7 Dialogue: 0,0:33:31.01,0:33:33.00,Default,,0000,0000,0000,,ce qui donne Dialogue: 0,0:33:33.00,0:33:36.01,Default,,0000,0000,0000,,avec le dernier OllyDbg 2 ce message surprenant Dialogue: 0,0:33:36.01,0:33:38.00,Default,,0000,0000,0000,,mais le fichier charge quand même Dialogue: 0,0:33:38.00,0:33:41.00,Default,,0000,0000,0000,,OllyDbg 1, lui, plante directement Dialogue: 0,0:33:41.00,0:33:45.00,Default,,0000,0000,0000,,il reste du temps ? Dialogue: 0,0:33:45.00,0:33:48.00,Default,,0000,0000,0000,,un dernier... pas très visuel Dialogue: 0,0:33:48.00,0:33:52.01,Default,,0000,0000,0000,,l'adresse AddressOfIndex du TLS est mise à zéro au chargement Dialogue: 0,0:33:52.01,0:33:59.00,Default,,0000,0000,0000,,et le terminus [terminator] des imports n'a pas besoin d'être composé de 5 doubles mots nuls Dialogue: 0,0:33:59.00,0:34:03.00,Default,,0000,0000,0000,,mais juste d'un seul, pour son AddressOfName Dialogue: 0,0:34:03.00,0:34:05.01,Default,,0000,0000,0000,,pour être considéré comme le terminus Dialogue: 0,0:34:05.01,0:34:10.00,Default,,0000,0000,0000,,donc, si on fait pointer AddressOfIndex vers l'AddressOfName d'un descripteur d'imports Dialogue: 0,0:34:10.00,0:34:15.00,Default,,0000,0000,0000,,s'il est mis à zéro, Dialogue: 0,0:34:15.00,0:34:16.01,Default,,0000,0000,0000,,les imports seront tronqués Dialogue: 0,0:34:16.01,0:34:20.00,Default,,0000,0000,0000,,et en fait, le comportement est différent sous XP ou 7 Dialogue: 0,0:34:20.00,0:34:25.01,Default,,0000,0000,0000,,donc, sous XP, il est écrasé après que les imports soient chargés, Dialogue: 0,0:34:25.01,0:34:28.00,Default,,0000,0000,0000,,donc la table n'est pas tronquée Dialogue: 0,0:34:28.00,0:34:32.00,Default,,0000,0000,0000,,alors que sous 7, il est écrasé avant les imports Dialogue: 0,0:34:32.00,0:34:35.00,Default,,0000,0000,0000,,donc, pour le même PE, on a 2 comportements différents Dialogue: 0,0:34:35.00,0:34:37.00,Default,,0000,0000,0000,,sous deux versions de Windows différentes, Dialogue: 0,0:34:37.00,0:34:43.00,Default,,0000,0000,0000,,alors que le fichier marche sous les 2 versions. Dialogue: 0,0:34:43.00,0:34:55.00,Default,,0000,0000,0000,,ah, attendez, on a encore le temps? Dialogue: 0,0:34:55.00,0:34:56.00,Default,,0000,0000,0000,,15 minutes ? ok Dialogue: 0,0:34:56.00,0:35:01.00,Default,,0000,0000,0000,,je vais commencer la démonstration Dialogue: 0,0:35:01.00,0:35:23.01,Default,,0000,0000,0000,,pour vous montrer... Dialogue: 0,0:35:23.01,0:35:26.00,Default,,0000,0000,0000,,le style de PE que je créé d'habitude Dialogue: 0,0:35:26.00,0:35:29.00,Default,,0000,0000,0000,,avec le minimum d'éléments définis Dialogue: 0,0:35:29.00,0:35:31.00,Default,,0000,0000,0000,,c'est en fait un pilotes [driver] Dialogue: 0,0:35:31.00,0:35:36.01,Default,,0000,0000,0000,,même si j'ai utilisé des opcodes non documentés, Dialogue: 0,0:35:36.01,0:35:40.01,Default,,0000,0000,0000,,ce pilote marche, sans le vrac Dialogue: 0,0:35:40.01,0:35:43.00,Default,,0000,0000,0000,,habituel rajouté par le compilateurs Dialogue: 0,0:35:43.00,0:35:47.01,Default,,0000,0000,0000,,donc, un exemple clair, simple Dialogue: 0,0:35:47.01,0:35:51.00,Default,,0000,0000,0000,,sans rien pour vous géner la vue Dialogue: 0,0:35:51.00,0:35:52.01,Default,,0000,0000,0000,,ou votre débogueur Dialogue: 0,0:35:52.01,0:36:02.01,Default,,0000,0000,0000,,donc, cet exemple regarde les valeurs de CR0 Dialogue: 0,0:36:02.01,0:36:07.00,Default,,0000,0000,0000,,via SMSW, officiellement non défini sur un double mot Dialogue: 0,0:36:07.00,0:36:10.00,Default,,0000,0000,0000,,mais en fait donne la même valeur Dialogue: 0,0:36:10.00,0:36:11.01,Default,,0000,0000,0000,,que le MOV EAX, CR0 standard Dialogue: 0,0:36:11.01,0:36:16.00,Default,,0000,0000,0000,,ensuite, MOV EAX, CR0 avec un 'mauvais' Mod/RM Dialogue: 0,0:36:16.00,0:36:39.00,Default,,0000,0000,0000,,sous le dernier Hiew, ce n'est en fait même pas désassemblé Dialogue: 0,0:36:39.00,0:36:43.01,Default,,0000,0000,0000,,on espère que ça ne plante pas... Dialogue: 0,0:36:43.01,0:36:47.00,Default,,0000,0000,0000,,donc, vous voyez, on obtient les mêmes valeurs Dialogue: 0,0:36:47.00,0:36:55.01,Default,,0000,0000,0000,,via le CR0 standard, l'invalide, et le non défini Dialogue: 0,0:36:55.01,0:36:57.00,Default,,0000,0000,0000,,dont la partie de poids fort est non définie Dialogue: 0,0:36:57.00,0:37:00.01,Default,,0000,0000,0000,,d'habitude, en langage Intel, non défini signifie 'mis à zéro', Dialogue: 0,0:37:00.01,0:37:02.00,Default,,0000,0000,0000,,mais ici, on a bien CR0 entier Dialogue: 0,0:37:02.00,0:37:03.01,Default,,0000,0000,0000,,et ma machine n'a même pas plantée Dialogue: 0,0:37:03.01,0:37:05.01,Default,,0000,0000,0000,,ce qui signifie que le pilote fonctionne correctement Dialogue: 0,0:37:05.01,0:37:08.00,Default,,0000,0000,0000,,donc vous pouvez étudier des petits pilotes Dialogue: 0,0:37:08.00,0:37:12.00,Default,,0000,0000,0000,,le premier exemple présenté aujourd'hui Dialogue: 0,0:37:12.00,0:37:15.01,Default,,0000,0000,0000,,était celui avec l'assembleur ancien Dialogue: 0,0:37:15.01,0:37:20.00,Default,,0000,0000,0000,,quelqu'un connaît le résultat final ? Dialogue: 0,0:37:20.00,0:37:23.01,Default,,0000,0000,0000,,certaines instructions sont inutiles, Dialogue: 0,0:37:23.01,0:37:28.00,Default,,0000,0000,0000,,juste pour vérifier que le processeur les gère Dialogue: 0,0:37:28.00,0:37:30.01,Default,,0000,0000,0000,,mais d'autres modifient les registres Dialogue: 0,0:37:30.01,0:37:37.01,Default,,0000,0000,0000,,et ces instructions des années 70-80 Dialogue: 0,0:37:37.01,0:37:43.01,Default,,0000,0000,0000,,sont toujours gérées par les processeurs modernes Dialogue: 0,0:37:43.01,0:37:47.01,Default,,0000,0000,0000,,un des exemples que j'ai crée teste Dialogue: 0,0:37:47.01,0:37:50.00,Default,,0000,0000,0000,,les valeurs initiales de chaque registre Dialogue: 0,0:37:50.00,0:37:56.00,Default,,0000,0000,0000,,donc on peut voir les valeurs possibles sous XP ou W7 Dialogue: 0,0:37:56.00,0:38:01.01,Default,,0000,0000,0000,,à chaque fois [TLS, EntryPoint, DllMain], je sauve tous les registres Dialogue: 0,0:38:01.01,0:38:04.00,Default,,0000,0000,0000,,et je compare à diverses valeurs possibles Dialogue: 0,0:38:04.00,0:38:06.00,Default,,0000,0000,0000,,successivement Dialogue: 0,0:38:06.00,0:38:10.01,Default,,0000,0000,0000,,en fait, au TLS, on a beaucoup de contrôles de ces valeurs, Dialogue: 0,0:38:10.01,0:38:16.01,Default,,0000,0000,0000,,car ces valeurs proviennent du Data Directory Dialogue: 0,0:38:16.01,0:38:20.00,Default,,0000,0000,0000,,en particulier, son adresse relative, sa taille, les callbacks... Dialogue: 0,0:38:20.00,0:38:26.01,Default,,0000,0000,0000,,pour plus de détail, voir le source... Dialogue: 0,0:38:26.01,0:38:33.01,Default,,0000,0000,0000,,ça vous permet d'imiter mieux un SE dans votre émulateur, Dialogue: 0,0:38:33.01,0:38:35.00,Default,,0000,0000,0000,,si ça vous intéresse Dialogue: 0,0:38:35.00,0:38:41.01,Default,,0000,0000,0000,,on utilise SMSW, on compare la valeur Dialogue: 0,0:38:41.01,0:38:46.00,Default,,0000,0000,0000,,ensuite, après une opération FPU, on regarde si la valeur a changé Dialogue: 0,0:38:46.00,0:38:48.01,Default,,0000,0000,0000,,et si elle revient à sa valeur initiale. Dialogue: 0,0:38:48.01,0:38:52.00,Default,,0000,0000,0000,,une autre bizarrerie, si quelqu'un a l'explication Dialogue: 0,0:38:52.00,0:38:54.01,Default,,0000,0000,0000,,est qu'en fait Dialogue: 0,0:38:54.01,0:39:01.00,Default,,0000,0000,0000,,ça se comporte différemment si on exécute le fichier normalement Dialogue: 0,0:39:01.00,0:39:04.01,Default,,0000,0000,0000,,ou avec une redirection Dialogue: 0,0:39:04.01,0:39:08.00,Default,,0000,0000,0000,,si on redirige, 'échec' Dialogue: 0,0:39:08.00,0:39:11.00,Default,,0000,0000,0000,,sinon, ça marche normalement. Dialogue: 0,0:39:11.00,0:39:22.00,Default,,0000,0000,0000,,pour vous montrer... on exécute, et on lance TYPE Dialogue: 0,0:39:22.00,0:39:24.01,Default,,0000,0000,0000,,normal : OK Dialogue: 0,0:39:24.01,0:39:26.00,Default,,0000,0000,0000,,redirection: ECHEC Dialogue: 0,0:39:26.00,0:39:30.01,Default,,0000,0000,0000,,si vous avez une explication, je suis preneur Dialogue: 0,0:39:30.01,0:39:37.01,Default,,0000,0000,0000,,tu as essayé de rediriger vers autre chose ? Dialogue: 0,0:39:37.01,0:39:42.00,Default,,0000,0000,0000,,non, je n'ai pas essayé Dialogue: 0,0:39:42.00,0:39:45.00,Default,,0000,0000,0000,,donc, rediriger vers un autre périphérique? Dialogue: 0,0:39:45.00,0:39:46.01,Default,,0000,0000,0000,,mais, comment on récupère le résultat ? Dialogue: 0,0:39:46.01,0:39:48.00,Default,,0000,0000,0000,,imprimante ? Dialogue: 0,0:39:48.00,0:39:54.00,Default,,0000,0000,0000,,je n'ai pas de périphérique COM Dialogue: 0,0:39:54.00,0:39:56.01,Default,,0000,0000,0000,,non, je ne sais pas Dialogue: 0,0:39:56.01,0:39:59.01,Default,,0000,0000,0000,,mais c'était surprenant, car je lançais tous mes tests... Dialogue: 0,0:39:59.01,0:40:02.00,Default,,0000,0000,0000,,et d'un coup, 'ECHEC'... Dialogue: 0,0:40:02.00,0:40:07.00,Default,,0000,0000,0000,,alors qu'à la main, aucun problème. Dialogue: 0,0:40:07.00,0:40:09.01,Default,,0000,0000,0000,,l'astuce avec GS Dialogue: 0,0:40:09.01,0:40:11.00,Default,,0000,0000,0000,,très simple Dialogue: 0,0:40:11.00,0:40:19.01,Default,,0000,0000,0000,,et quelques affichages Dialogue: 0,0:40:19.01,0:40:21.01,Default,,0000,0000,0000,,je modifie GS, qui se remet à zéro Dialogue: 0,0:40:21.01,0:40:23.01,Default,,0000,0000,0000,,puis j'attends le résultat, Dialogue: 0,0:40:23.01,0:40:26.00,Default,,0000,0000,0000,,ensuite je fais 2 tests et je compare le temps entre Dialogue: 0,0:40:26.00,0:40:30.00,Default,,0000,0000,0000,,car ça ne doit pas arriver trop vite Dialogue: 0,0:40:30.00,0:40:37.00,Default,,0000,0000,0000,,NOPs Dialogue: 0,0:40:37.00,0:40:39.00,Default,,0000,0000,0000,,je teste les NOPs non documentés Dialogue: 0,0:40:39.00,0:40:45.01,Default,,0000,0000,0000,,celui sur une page invalide Dialogue: 0,0:40:45.01,0:41:01.00,Default,,0000,0000,0000,,NOP standard Dialogue: 0,0:41:01.00,0:41:07.00,Default,,0000,0000,0000,,32 bits Dialogue: 0,0:41:07.00,0:41:15.01,Default,,0000,0000,0000,,tous mes tests 64b sont fait dans des programmes 32b, car on peut les exécuter sur un OS normal Dialogue: 0,0:41:15.01,0:41:19.00,Default,,0000,0000,0000,,et ensuite je regarde GS pour voir si le mode 64b est disponible Dialogue: 0,0:41:19.00,0:41:21.01,Default,,0000,0000,0000,,dans ce cas, on obtiendrait un résultat différent Dialogue: 0,0:41:21.01,0:41:26.00,Default,,0000,0000,0000,,donc, en 64b, que je n'ai aps ici, on obtiendrait Dialogue: 0,0:41:26.00,0:41:28.01,Default,,0000,0000,0000,,les tests en 64b Dialogue: 0,0:41:28.01,0:41:31.00,Default,,0000,0000,0000,,et ces results. Dialogue: 0,0:41:31.00,0:41:35.00,Default,,0000,0000,0000,,mais, pas si facile à déboguer Dialogue: 0,0:41:35.00,0:41:39.00,Default,,0000,0000,0000,,mais ici, pas de piège, donc on peut revenir facilement en 32b Dialogue: 0,0:41:39.00,0:41:45.00,Default,,0000,0000,0000,,on saute le code 64b et revient en 32b Dialogue: 0,0:41:45.00,0:41:48.00,Default,,0000,0000,0000,,PUSH/RET Dialogue: 0,0:41:48.00,0:41:52.00,Default,,0000,0000,0000,,on affiche le message et ensuite... Dialogue: 0,0:41:52.00,0:41:58.00,Default,,0000,0000,0000,,Olly vous dit qu'on va sauter vers [4010]08 Dialogue: 0,0:41:58.00,0:42:03.01,Default,,0000,0000,0000,,mais en fait - ici, c'est correct Dialogue: 0,0:42:03.01,0:42:05.01,Default,,0000,0000,0000,,et le TLS a alloué la page NULLE Dialogue: 0,0:42:05.01,0:42:09.00,Default,,0000,0000,0000,,qui affiche 'ECHEC' Dialogue: 0,0:42:09.00,0:42:15.00,Default,,0000,0000,0000,,donc, comme mentionné auparavant, pas de façon standard de désassembler ça correctement Dialogue: 0,0:42:15.00,0:42:23.01,Default,,0000,0000,0000,,je ne peux pas exécuter les 64K sections Dialogue: 0,0:42:23.01,0:42:27.01,Default,,0000,0000,0000,,et en fait, cet exemple exécute tout le code (l'espace virtuel complet des 65535 sections) Dialogue: 0,0:42:27.01,0:42:29.00,Default,,0000,0000,0000,,elles sont grosses, Dialogue: 0,0:42:29.00,0:42:33.00,Default,,0000,0000,0000,,et je modifie EAX pour que tous les 00 00 soient exécutés Dialogue: 0,0:42:33.00,0:42:35.01,Default,,0000,0000,0000,,juste pour faire un printf à la fin Dialogue: 0,0:42:35.01,0:42:39.00,Default,,0000,0000,0000,,ça prend plusieurs secondes sur un i7 Dialogue: 0,0:42:39.00,0:42:43.00,Default,,0000,0000,0000,,c'est assez amusant: on le lance, et même avec le cache, Dialogue: 0,0:42:43.00,0:42:50.01,Default,,0000,0000,0000,,et que le SE n'est pas occupé, ça prend un temps visible, juste pour un tas de 00 Dialogue: 0,0:42:50.01,0:43:00.00,Default,,0000,0000,0000,,les sections virtuelles... celui que le dernier Hiew ne voit pas comme un PE Dialogue: 0,0:43:00.00,0:43:02.00,Default,,0000,0000,0000,,enfin, bientôt corrigé Dialogue: 0,0:43:02.00,0:43:08.01,Default,,0000,0000,0000,,ah, je ne peux pas l'analyser car il ne pense même pas que c'est un PE Dialogue: 0,0:43:08.01,0:43:13.00,Default,,0000,0000,0000,,mais, pour simplifier, OPTIONAL_HEADER pointe au delà Dialogue: 0,0:43:13.00,0:43:14.00,Default,,0000,0000,0000,,du fichier Dialogue: 0,0:43:14.00,0:43:17.00,Default,,0000,0000,0000,,l'en-tête plié... Dialogue: 0,0:43:17.00,0:43:18.01,Default,,0000,0000,0000,,quelques messages d'erreurs, Dialogue: 0,0:43:18.01,0:43:21.00,Default,,0000,0000,0000,,à cause des faux Data Directories Dialogue: 0,0:43:21.00,0:43:30.00,Default,,0000,0000,0000,,et les DD réels sont au début Dialogue: 0,0:43:30.00,0:43:33.00,Default,,0000,0000,0000,,de la première section Dialogue: 0,0:43:33.00,0:43:42.00,Default,,0000,0000,0000,,ceci deviendra les imports, et le vrai Data Directory Dialogue: 0,0:43:42.00,0:43:49.00,Default,,0000,0000,0000,,et pour finir, celui avec TLS AddressOfIndex qui pointe... Dialogue: 0,0:43:49.00,0:44:02.00,Default,,0000,0000,0000,,...dans les descripteurs d'imports, sur AddressOfName Dialogue: 0,0:44:02.00,0:44:04.00,Default,,0000,0000,0000,,donc, il sera écrasé au chargement Dialogue: 0,0:44:04.00,0:44:11.01,Default,,0000,0000,0000,,et quand on le charge, il reconnait XP Dialogue: 0,0:44:11.01,0:44:14.01,Default,,0000,0000,0000,,à la façon dont les imports ont été chargés Dialogue: 0,0:44:14.01,0:44:17.00,Default,,0000,0000,0000,,et sous 7, on obtiendra un autre résultat. Dialogue: 0,0:44:17.00,0:44:19.00,Default,,0000,0000,0000,,pour finir, les exports Dialogue: 0,0:44:19.00,0:44:24.00,Default,,0000,0000,0000,,certains ont des noms très longs Dialogue: 0,0:44:24.00,0:44:30.00,Default,,0000,0000,0000,,en fait, on remarque que j'écrase le désassemblage même Dialogue: 0,0:44:30.00,0:44:33.01,Default,,0000,0000,0000,,donc je répète les faux opcodes et adresses Dialogue: 0,0:44:33.01,0:44:37.00,Default,,0000,0000,0000,,donc le désassembleur est perturbé Dialogue: 0,0:44:37.00,0:44:40.00,Default,,0000,0000,0000,,mais c'est juste visuel, pas vraiment grave Dialogue: 0,0:44:40.00,0:44:43.00,Default,,0000,0000,0000,,bien que ce soit un problème récent dans IDA Dialogue: 0,0:44:43.00,0:44:47.00,Default,,0000,0000,0000,,ou si on met un export au milieu d'une instruction Dialogue: 0,0:44:47.00,0:44:49.01,Default,,0000,0000,0000,,l'export aura priorité sur le désassemblage, Dialogue: 0,0:44:49.01,0:44:52.00,Default,,0000,0000,0000,,et casse l'instruction en deux Dialogue: 0,0:44:52.00,0:44:58.00,Default,,0000,0000,0000,,il y a bien sûr un exemple pour ça sur Corkami Dialogue: 0,0:44:58.00,0:45:05.00,Default,,0000,0000,0000,,donc, voilà pour les démonstrations Dialogue: 0,0:45:05.00,0:45:10.00,Default,,0000,0000,0000,,Je voulais donc en savoir plus sur le x86 et le PE Dialogue: 0,0:45:10.00,0:45:12.01,Default,,0000,0000,0000,,qui sont loin d'être correctement documentés Dialogue: 0,0:45:12.01,0:45:14.01,Default,,0000,0000,0000,,et qui ne le sont toujours pas, Dialogue: 0,0:45:14.01,0:45:18.00,Default,,0000,0000,0000,,mais j'en ai couvert un peu Dialogue: 0,0:45:18.00,0:45:20.00,Default,,0000,0000,0000,,il y a encore des flous Dialogue: 0,0:45:20.00,0:45:24.00,Default,,0000,0000,0000,,mais de moins en moins, j'y travaille Dialogue: 0,0:45:24.00,0:45:27.00,Default,,0000,0000,0000,,en publiant mes recherches librement Dialogue: 0,0:45:27.00,0:45:31.01,Default,,0000,0000,0000,,tel WinDbg, si vous suivez les documentations officielles à la lettre, Dialogue: 0,0:45:31.01,0:45:36.00,Default,,0000,0000,0000,,vous êtes voués à l'échec, surtout avec tous les virus et packeurs existants Dialogue: 0,0:45:36.00,0:45:40.01,Default,,0000,0000,0000,,si vous êtes intéressés, ou que vous programmez un outil, un émulateur, un moteur... Dialogue: 0,0:45:40.01,0:45:44.00,Default,,0000,0000,0000,,vous savez que vous pouvez aller sur Corkami, lire les pages Dialogue: 0,0:45:44.00,0:45:48.00,Default,,0000,0000,0000,,télécharger les exemples, qui sont disponibles librement, à tout point de vue Dialogue: 0,0:45:48.00,0:45:50.01,Default,,0000,0000,0000,,et si vous trouvez des bugs, ce qui pourrait arriver Dialogue: 0,0:45:50.01,0:45:57.00,Default,,0000,0000,0000,,envoyez-moi une carte postale, ou un t-shirt croix rouge ;) Dialogue: 0,0:45:57.00,0:46:01.01,Default,,0000,0000,0000,,Merci à Peter Ferrie, et tous mes relecteurs et contributeurs Dialogue: 0,0:46:01.01,0:46:03.01,Default,,0000,0000,0000,,vous avez des questions ? Dialogue: 0,0:46:03.01,0:46:10.01,Default,,0000,0000,0000,,tu les as testés sur des anti-virus ? tu devrais trouver une ch*ée de 0days Dialogue: 0,0:46:10.01,0:46:23.01,Default,,0000,0000,0000,,mouai, non, je ne saurais pas en faire des exploits... Dialogue: 0,0:46:23.01,0:46:29.00,Default,,0000,0000,0000,,tenir en échec les désassembleurs me suffit Dialogue: 0,0:46:29.00,0:46:40.00,Default,,0000,0000,0000,,j'ai trouvé un crash dans Xed d'Intel, ça me suffit Dialogue: 0,0:46:40.00,0:46:45.00,Default,,0000,0000,0000,,une autre question ? tout le monde a survécu ? Dialogue: 0,0:46:45.00,0:46:46.00,Default,,0000,0000,0000,,c'était une super présentation, mec Dialogue: 0,0:46:46.00,0:46:48.00,Default,,0000,0000,0000,,merci! Dialogue: 0,0:46:48.00,0:46:50.01,Default,,0000,0000,0000,,MERCI!