What does assembly language look like?
First: you should know there is no single “assembly language”. In theory, there could be a different language per processor type. I’m showing you a very simple example from an x86 processor, running on my MacBook Pro.
Here’s some boring but simple C code:
- int sum(int a, int b) {
- return a+b;
- }
- int main() {
- int s = sum(2,3);
- return 0;
- }
It defines a function that adds two integers, calls it in main (which every C program must have), ignores the value, and main returns 0 (“A-OK”). I compiled this with the clang compiler, and then used otool to dump the assembly. If you’re playing along at home, you can try:
- clang -o add add.c #Take C program "add.c", compile it to executable "add". (gcc -o add add.c will work too)
- otool -tV add #get disassembly (objdump on Linux works similarly)
Here’s what I get:
- add:
- (__TEXT,__text) section
- _sum:
- 0000000100000f60 pushq %rbp
- 0000000100000f61 movq %rsp, %rbp
- 0000000100000f64 movl %edi, -0x4(%rbp)
- 0000000100000f67 movl %esi, -0x8(%rbp)
- 0000000100000f6a movl -0x4(%rbp), %esi
- 0000000100000f6d addl -0x8(%rbp), %esi
- 0000000100000f70 movl %esi, %eax
- 0000000100000f72 popq %rbp
- 0000000100000f73 retq
- 0000000100000f74 nopw %cs:(%rax,%rax)
- _main:
- 0000000100000f80 pushq %rbp
- 0000000100000f81 movq %rsp, %rbp
- 0000000100000f84 subq $0x10, %rsp
- 0000000100000f88 movl $0x2, %edi
- 0000000100000f8d movl $0x3, %esi
- 0000000100000f92 movl $0x0, -0x4(%rbp)
- 0000000100000f99 callq _sum
- 0000000100000f9e xorl %esi, %esi
- 0000000100000fa0 movl %eax, -0x8(%rbp)
- 0000000100000fa3 movl %esi, %eax
- 0000000100000fa5 addq $0x10, %rsp
- 0000000100000fa9 popq %rbp
- 0000000100000faa retq
This is another example of what assembly looks like. Cosa sta succedendo qui?
Beh, un processo (in Linux / OS X) ha un sacco di struttura. Se volete saperne di più, guardate alcune diapositive che ho fatto per un tutorial di reverse engineering che ho fatto; dovete leggere un sacco di assembly per fare reverse engineering: Stack Smashing 101 by chrislambda
La prima colonna è solo la posizione del codice in hex. La colonna centrale è il comando, e la colonna di destra sono gli argomenti di quel comando. Quindi "pushq %rbp" significa "spingere il valore quad-word del puntatore di base (RBP) sullo stack".
Può essere difficile da leggere all'inizio, ma ci si può abituare col tempo. Probabilmente potete già vedere che nelle linee 18-19, i numeri 2 e 3 vengono memorizzati, e nella linea 21, vedete che viene chiamata la funzione "sum". Nella linea 9, potete vedere che viene chiamata l'istruzione "addl".