Ce n'gdb 'x' de la commande?
Je suis de la lecture d'un livre sur le piratage et il a un chapitre à propos de l'assemblage.
Voici mon petit programme écrit en C.
#include <stdio.h>
int main(int argc, char const *argv[])
{
int i;
for (i = 0; i < 10; i++) {
puts("Hello World!");
}
return 0;
}
Et celle-ci est gdb
test:
(gdb) break main
Breakpoint 1 at 0x40050f: file main.c, line 7.
(gdb) run
Breakpoint 1, main (argc=1, argv=0x7fffffffe708) at main.c:7
7 for (i = 0; i < 10; i++) {
(gdb) disassemble main
Dump of assembler code for function main:
0x0000000000400500 <+0>: push rbp
0x0000000000400501 <+1>: mov rbp,rsp
0x0000000000400504 <+4>: sub rsp,0x20
0x0000000000400508 <+8>: mov DWORD PTR [rbp-0x14],edi
0x000000000040050b <+11>: mov QWORD PTR [rbp-0x20],rsi
=> 0x000000000040050f <+15>: mov DWORD PTR [rbp-0x4],0x0
0x0000000000400516 <+22>: jmp 0x400526 <main+38>
0x0000000000400518 <+24>: mov edi,0x4005c4
0x000000000040051d <+29>: call 0x4003e0 <puts@plt>
0x0000000000400522 <+34>: add DWORD PTR [rbp-0x4],0x1
0x0000000000400526 <+38>: cmp DWORD PTR [rbp-0x4],0x9
0x000000000040052a <+42>: jle 0x400518 <main+24>
0x000000000040052c <+44>: mov eax,0x0
---Type <return> to continue, or q <return> to quit---
0x0000000000400531 <+49>: leave
0x0000000000400532 <+50>: ret
End of assembler dump.
La partie suivante est la choses que je ne comprends pas. Veuillez noter que $rip est le "pointeur d'instruction" et les points à 0x000000000040050f <+15>
(gdb) x/x $rip
0x40050f <main+15>: 0x00fc45c7
(gdb) x/12x $rip
0x40050f <main+15>: 0x00fc45c7 0xeb000000 0x05c4bf0e 0xbee80040
0x40051f <main+31>: 0x83fffffe 0x8301fc45 0x7e09fc7d 0x0000b8ec
0x40052f <main+47>: 0xc3c90000 0x1f0f2e66 0x00000084 0x1f0f0000
(gdb) x/8xb $rip
0x40050f <main+15>: 0xc7 0x45 0xfc 0x00 0x00 0x00 0x00 0xeb
(gdb) x/8xh $rip
0x40050f <main+15>: 0x45c7 0x00fc 0x0000 0xeb00 0xbf0e 0x05c4 0x0040 0xbee8
(gdb) x/8xw $rip
0x40050f <main+15>: 0x00fc45c7 0xeb000000 0x05c4bf0e 0xbee80040
0x40051f <main+31>: 0x83fffffe 0x8301fc45 0x7e09fc7d 0x0000b8ec
Première commande x/x $rip
sorties 0x40050f <main+15>: 0x00fc45c7
.
Est-il de l'instruction à 0x40050f?
Est 0x00fc45c7
même que mov DWORD PTR [rbp-0x4],0x0
(assemblé instruction à 0x40050f)?
Deuxièmement, si c'est l'instruction, quels sont ces nombres hexadécimaux de la sortie de commandes x/12x $rip
, x/8xw $rip
, x/8xh $rip
?
De ne pas être négatif, mais erickson, qui fait un excellent travail va plus cela dans le détail...essayez également de ti match de ce qu'il fait (apparemment) une nouvelle 64b architecture quand il est déjà difficile (impossible) à obtenir ses exemples de travail en vertu de l'contemporain 32b ubuntu noyaux est probablement pas la meilleure idée. Il y a une raison pour laquelle le livre est livré avec Ubuntu 7.04. live cd.
Il n'est pas question d'essayer ses exemples sur ma machine. Je voudrais obtenir presque les mêmes résultats sur les vieux x86(certains noms différents tels que rip en place de l'eip). C'est la première fois que j'essaie ce genre de bas niveau de stuff, donc je pourrais être un peu confus. Aussi, je ne demande pas à reformuler ce que l'auteur du livre écrit, mais pour expliquer ce que sont ces nombres hexadécimaux(ouptup de 'x' de la commande dans CET EXEMPLE). Je pense qu'il peut être expliqué en une phrase ou deux.
Juste point (voir la réponse), mais vraiment: travail à travers le livre en utilisant aussi vieux unbuntu distro que vous le pouvez. Et quand quelque chose ne fonctionne pas, essayez de googler ou un document qui s'appelle quelque chose comme "l'écrasement de la pile En 2012").
Il n'est pas question d'essayer ses exemples sur ma machine. Je voudrais obtenir presque les mêmes résultats sur les vieux x86(certains noms différents tels que rip en place de l'eip). C'est la première fois que j'essaie ce genre de bas niveau de stuff, donc je pourrais être un peu confus. Aussi, je ne demande pas à reformuler ce que l'auteur du livre écrit, mais pour expliquer ce que sont ces nombres hexadécimaux(ouptup de 'x' de la commande dans CET EXEMPLE). Je pense qu'il peut être expliqué en une phrase ou deux.
Juste point (voir la réponse), mais vraiment: travail à travers le livre en utilisant aussi vieux unbuntu distro que vous le pouvez. Et quand quelque chose ne fonctionne pas, essayez de googler ou un document qui s'appelle quelque chose comme "l'écrasement de la pile En 2012").
OriginalL'auteur khajvah | 2013-12-13
Vous devez vous connecter pour publier un commentaire.
(1), vous avez que correct.
(2), la commande x de a jusqu'à 3 prescripteurs: le nombre d'objets à imprimer; format; et ce que la taille de l'objet. Dans tous les exemples que vous choisissez d'imprimer hexadécimal (x). Comme pour le premier rédacteur de devis, vous demandez-vous à imprimer 12, 8, 8 objets.
Comme pour le dernier rédacteur de devis dans votre cas:
x/12x n'en a pas, donc gdb par défaut, en supposant que vous souhaitez doubles mots, aka, dans 4 octets morceaux. Notez que vous trouver de mot double, parfois définis différemment, mais en intel x86 assemblée/gdb, il est de 4 octets. En général, j'ai toujours spécifier exactement ce que vous voulez plutôt que de retomber sur les paramètres par défaut.
x/8xw fait de même, pour les 8 objets, comme vous l'avez explicitement demandé dwords maintenant.
x/8xh demandes demi-mot de la taille des morceaux d'octets, de sorte que les objets imprimés en 2 octets morceaux. Dans le cas où vous vous demandez pourquoi la concaténation de deux voisins de valeurs n'est pas égal à ce qui a été rapporté lorsque vous avez imprimé dans dwords, c'est parce que le x86 est un little-endian architecture. Ce que cela signifie est détaillée assez bien dans erickson livre une fois de plus, si vous regardez quelques pages à l'avance, il fait quelques calculs que vous pourriez trouver utiles. En un mot, si vous recombiner (2,1) (4,3), ..., vous verrez qu'elles correspondent.
x/8xw
imprime paroles (4 octets objets) explicitement. Vous avez besoing
sur la fin pour 8 octets d'objets.Dodd: vous avez raison, la terminologie dans gdb est le mot (d'où le w). Au sein d'intel x86 (et le livre de l'op est de la lecture), il est dword pour 4 octets.
OriginalL'auteur gnometorule
help x
ne m'aide pas beaucoup. S'il vous plaît, lisez la dernière partie de ma question.choisir meilleur titre" Pourquoi?
C'est peut-être mon anglais, mais je ne pouvais expliquer à ma question sur l'exemple. Sans impliquer gdb, je ne peut pas se référer à ces chiffres.
Toutes les commandes sont à l'examen de mémoire à partir de l'0x40050f. Les modificateurs après le x de déterminer comment il est illustré. Si vous n'avez x/i, ce serait montrer que l'instruction.
Sans gdb, vous pourriez faire quelque chose comme printf("%x %x\n", &, &+15);
OriginalL'auteur Paul Beusterien