2011-04-14 2 views

Répondre

6

Pour exécuter du code shell, vous pouvez modifier directement le contenu d'une fonction:

(gdb) b foo 
Breakpoint 1 at 0x400608 
(gdb) run 
Breakpoint 1, 0x0000000000400608 in foo() 
(gdb) x/16bx foo 
0x400604 <foo>:  0x55 0x48 0x89 0xe5 0x53 0x48 0x81 0xec 
(gdb) set ((unsigned char *)foo)[6] = 0x85 
(gdb) x/16bx foo 
0x400604 <foo>:  0x55 0x48 0x89 0xe5 0x53 0x48 0x85 0xec 
(gdb) cont 

Je ne sais pas comment exécuter des opcodes à l'intérieur de gdb, mais vous pouvez certainement faire ce que vous voulez avec des registres. Par exemple, au lieu de mov %rbx, %rax vous pouvez utiliser set $rax = $rbx:

(gdb) p $rax 
$1 = 3671197290184 
(gdb) set $rax = $rbx 
(gdb) p $rax 
$2 = 0 
(gdb) 
+0

Quelle est la différence entre 'let' et' set'? – compiler

+0

Désolé, c'est une faute de frappe, c'est supposé lire 'set'. Je vais réparer le post. –

+0

Existe-t-il un environnement de type python pour le code d'assemblage? –

-1

Je ne pense pas que gdb inclut un assembleur, donc je ne m'attendrais pas à pouvoir entrer directement dans l'assemblage.

Vous pouvez utiliser la shell commande gdb pour exécuter des commandes shell:

(gdb) shell uname -m 
x86_64 
+0

Mais c nous pouvons intégrer assebmly directement, non? Ici, je veux dire des choses comme '\ x23 \ x24 ...' par le code de shell – compiler

+0

par "shellcode", compilateur signifiait un type spécifique de [code binaire] (http://en.wikipedia.org/wiki/Shellcode) exécuté par le CPU. –

Questions connexes