[Assembleur x86] Opcode et calcul d'opcode + Création d'un outil.
|
03-09-2013, 09h34
(Modification du message : 03-09-2013, 09h39 par Kiwazaru.)
Message : #1
|
|
Kiwazaru
Padawan d'un super escargot Messages : 284 Sujets : 26 Points: 139 Inscription : Mar 2012 |
[Assembleur x86] Opcode et calcul d'opcode + Création d'un outil.
Salut à tous
Bon, à l'arrivée de la rentrée, j'ai trouvé un petit projet sur les opcodes. Vous le savez, une opcode c'est autrement dit une "autre forme" de voir un PUSH 5 par exemple, ainsi on aussi l'instruction 6A 05 qui signifie PUSH (6A) et son argument 5 (05), un opcode est donc foutu en Hexadecimal et est traduit en binaire pour être interprété par le processeur. Alors pour un push c'est facile, il suffit d'avoir l'opcode de base de l'instruction et de traduire son argument en Hexadecimal. Mais pour un CALL ou un JMP ou d'autres calculs plus compliqués, je bloque un peu. Par exemple, je vois que CALL 00000000 vaut E8 7F0553FF. Cela, serait donc l'opcode de base pour une adresse 00000000. En augmentant de 1, donc 00000001 on voit que l'opcode change: 800553FF On augmente encore un peu plus: pour 00000002 : 810553FF. On voit donc une incrémentation, alors 7F0553FF est-il l'opcode de base sur lequel il faut se baser, ou alors cela est situationnel, en fonction d'un calcul ou autre? Plus étrange encore: Citation :CPU DisasmJNE (75) 00ACFA51 (06). Avec un seul octet il arrive à nous définir une adresse de 99999999 possibilités. J'aimerais savoir si quelqu'un aurait plus d'information à ce sujet et en discuter sur ce post Code PYTHON :
Il vous chie l'instruction correspondant à l'opcode rentré. Je me suit basé sur un tableau à double dimension en prenant exemple sur un document très bien foutu: http://net.cs.uni-bonn.de/fileadmin/user...erview.pdf Mon but final étant de réussir à extraire du code Assembleur d'un exécutable avec mon script
Toucher au Kernel, c'est un peut comme se shooter au LSD, on pense pouvoir tout faire mais ça finit souvent mal.
|
|
03-09-2013, 09h44
Message : #2
|
|
supersnail
Éleveur d'ornithorynques Messages : 1,614 Sujets : 72 Points: 466 Inscription : Jan 2012 |
RE: [Assembleur x86] Opcode et calcul d'opcode + Création d'un outil.
Bonjour,
Le calcul des sauts/calls sont relatifs à l'instruction du saut. Par exemple l'instruction E8 00000000 va faire un saut à l'instruction à 0 octets de E8 00000000, autrement dit tu vas faire une fonction qui va se call indéfiniment :> Bref globalement pour calculer l'adresse à foutre dans un jump à partir d'une adresse absolue, la formule c'est: (adresse de destination - adresse du jump + taille de l'instruction) Donc pour faire le calcul "inverse" avec ton JNE, ça te fait 00ACFA49 (adresse du jump) + 6 (décalage) + 2 (octets pris par l'opcode 0x75) soit 00ACFA51
Mon blog
Code : push esp ; dec eax ; inc ebp ; and [edi+0x41],al ; dec ebp ; inc ebp "VIM est merveilleux" © supersnail |
|
03-09-2013, 10h01
(Modification du message : 03-09-2013, 10h01 par gruik.)
Message : #3
|
|
gruik
gouteur de savon Messages : 757 Sujets : 44 Points: 482 Inscription : Oct 2012 |
RE: [Assembleur x86] Opcode et calcul d'opcode + Création d'un outil.
(03-09-2013, 09h34)ReVeRse a écrit : Avec un seul octet il arrive à nous définir une adresse de 99999999 possibilités. de fait t'as pas 99999999 possibilités, c'est un jump relatif donc tu peux sauter dans un intervalle [-127;128] par rapport à l'adresse courante comme l'a expliqué supersnail c'est tout le propos des jmp short/near/far |
|
03-09-2013, 18h43
Message : #4
|
|
ark
Psyckomodo! Messages : 1,033 Sujets : 48 Points: 317 Inscription : Sep 2011 |
RE: [Assembleur x86] Opcode et calcul d'opcode + Création d'un outil. |
|
Sujets apparemment similaires… | |||||
Sujet | Auteur | Réponses | Affichages | Dernier message | |
[NASM] Création d'un thread sous Linux uniquement avec les syscalls | supersnail | 2 | 1,251 |
04-03-2013, 23h36 Dernier message: Dobry |
|
[Asm] Cours d'assembleur | Theo4016 | 4 | 1,193 |
27-10-2012, 02h07 Dernier message: Theo4016 |
Utilisateur(s) parcourant ce sujet : 6 visiteur(s)