The C family of programming languages (C, C++, C#) is one of the most widely used, if not the most widely used, genre of programming languages. C is definitely the most popular language for Windows and Unix server applications, which are good targets for vulnerability development. For these reasons, a solid understanding of C is critical.
Along with a broad comprehension of C, you should be able to understand how compiled C code translates into assembly. Understanding how C variables , pointers, functions, and memory allocation are represented by assembly will make the contents of this book much easier to understand.
Let's take some common C++ code constructs and see what they look like in assembly. If you have a firm grasp of these examples, you should be ready to move forward with the rest of the book.
Let's look at declaring an Integer in C++, then using that same integer for counting.
Let's look at another example, using an array.
Last, let's take a look at a more complicated example. The code shows how a simple C function looks in assembly. If you can easily understand this example, you are probably ready to move forward to the next chapter.
Here is the same function, but in disassembled form. The following is gdb output:
0x8048430 <triangle>: push %ebp 0x8048431 <triangle+1>: mov %esp, %ebp 0x8048433 <triangle+3>: push %edi 0x8048434 <triangle+4>: push %esi 0x8048435 <triangle+5>: sub 0x8048430 <triangle>: push %ebp 0x8048431 <triangle+1>: mov %esp, %ebp 0x8048433 <triangle+3>: push %edi 0x8048434 <triangle+4>: push %esi 0x8048435 <triangle+5>: sub $0x30,%esp 0x8048438 <triangle+8>: lea 0xffffffd8(%ebp), %edi 0x804843b <triangle+11>: mov $0x8049508,%esi 0x8048440 <triangle+16>: cld 0x8048441 <triangle+17>: mov $0x30,%esp 0x8048446 <triangle+22>: repz movsl %ds:( %esi), %es:( %edi) 0x8048448 <triangle+24>: mov 0x8(%ebp),%eax 0x804844b <triangle+27>: mov %eax,%edx 0x804844d <triangle+29>: imul 0xc(%ebp),%edx 0x8048451 <triangle+33>: mov %edx,%eax 0x8048453 <triangle+35>: sar $0x1f,%eax 0x8048456 <triangle+38>: shr $0x1f,%eax 0x8048459 <triangle+41>: lea (%eax, %edx, 1), %eax 0x804845c <triangle+44>: sar %eax 0x804845e <triangle+46>: mov %eax,0xffffffd4(%ebp) 0x8048461 <triangle+49>: mov 0xffffffd4(%ebp),%eax 0x8048464 <triangle+52>: mov %eax,%eax 0x8048466 <triangle+54>: add $0x30,%esp 0x8048469 <triangle+57>: pop %esi 0x804846a <triangle+58>: pop %edi 0x804846b <triangle+59> pop %ebp 0x804846c <triangle+60>: ret
x30,%esp 0x8048438 <triangle+8>: lea 0xffffffd8(%ebp), %edi 0x804843b <triangle+11>: mov 0x8048430 <triangle>: push %ebp 0x8048431 <triangle+1>: mov %esp, %ebp 0x8048433 <triangle+3>: push %edi 0x8048434 <triangle+4>: push %esi 0x8048435 <triangle+5>: sub $0x30,%esp 0x8048438 <triangle+8>: lea 0xffffffd8(%ebp), %edi 0x804843b <triangle+11>: mov $0x8049508,%esi 0x8048440 <triangle+16>: cld 0x8048441 <triangle+17>: mov $0x30,%esp 0x8048446 <triangle+22>: repz movsl %ds:( %esi), %es:( %edi) 0x8048448 <triangle+24>: mov 0x8(%ebp),%eax 0x804844b <triangle+27>: mov %eax,%edx 0x804844d <triangle+29>: imul 0xc(%ebp),%edx 0x8048451 <triangle+33>: mov %edx,%eax 0x8048453 <triangle+35>: sar $0x1f,%eax 0x8048456 <triangle+38>: shr $0x1f,%eax 0x8048459 <triangle+41>: lea (%eax, %edx, 1), %eax 0x804845c <triangle+44>: sar %eax 0x804845e <triangle+46>: mov %eax,0xffffffd4(%ebp) 0x8048461 <triangle+49>: mov 0xffffffd4(%ebp),%eax 0x8048464 <triangle+52>: mov %eax,%eax 0x8048466 <triangle+54>: add $0x30,%esp 0x8048469 <triangle+57>: pop %esi 0x804846a <triangle+58>: pop %edi 0x804846b <triangle+59> pop %ebp 0x804846c <triangle+60>: ret
x8049508,%esi 0x8048440 <triangle+16>: cld 0x8048441 <triangle+17>: mov 0x8048430 <triangle>: push %ebp 0x8048431 <triangle+1>: mov %esp, %ebp 0x8048433 <triangle+3>: push %edi 0x8048434 <triangle+4>: push %esi 0x8048435 <triangle+5>: sub $0x30,%esp 0x8048438 <triangle+8>: lea 0xffffffd8(%ebp), %edi 0x804843b <triangle+11>: mov $0x8049508,%esi 0x8048440 <triangle+16>: cld 0x8048441 <triangle+17>: mov $0x30,%esp 0x8048446 <triangle+22>: repz movsl %ds:( %esi), %es:( %edi) 0x8048448 <triangle+24>: mov 0x8(%ebp),%eax 0x804844b <triangle+27>: mov %eax,%edx 0x804844d <triangle+29>: imul 0xc(%ebp),%edx 0x8048451 <triangle+33>: mov %edx,%eax 0x8048453 <triangle+35>: sar $0x1f,%eax 0x8048456 <triangle+38>: shr $0x1f,%eax 0x8048459 <triangle+41>: lea (%eax, %edx, 1), %eax 0x804845c <triangle+44>: sar %eax 0x804845e <triangle+46>: mov %eax,0xffffffd4(%ebp) 0x8048461 <triangle+49>: mov 0xffffffd4(%ebp),%eax 0x8048464 <triangle+52>: mov %eax,%eax 0x8048466 <triangle+54>: add $0x30,%esp 0x8048469 <triangle+57>: pop %esi 0x804846a <triangle+58>: pop %edi 0x804846b <triangle+59> pop %ebp 0x804846c <triangle+60>: ret
x30,%esp 0x8048446 <triangle+22>: repz movsl %ds:( %esi), %es:( %edi) 0x8048448 <triangle+24>: mov 0x8(%ebp),%eax 0x804844b <triangle+27>: mov %eax,%edx 0x804844d <triangle+29>: imul 0xc(%ebp),%edx 0x8048451 <triangle+33>: mov %edx,%eax 0x8048453 <triangle+35>: sar 0x8048430 <triangle>: push %ebp 0x8048431 <triangle+1>: mov %esp, %ebp 0x8048433 <triangle+3>: push %edi 0x8048434 <triangle+4>: push %esi 0x8048435 <triangle+5>: sub $0x30,%esp 0x8048438 <triangle+8>: lea 0xffffffd8(%ebp), %edi 0x804843b <triangle+11>: mov $0x8049508,%esi 0x8048440 <triangle+16>: cld 0x8048441 <triangle+17>: mov $0x30,%esp 0x8048446 <triangle+22>: repz movsl %ds:( %esi), %es:( %edi) 0x8048448 <triangle+24>: mov 0x8(%ebp),%eax 0x804844b <triangle+27>: mov %eax,%edx 0x804844d <triangle+29>: imul 0xc(%ebp),%edx 0x8048451 <triangle+33>: mov %edx,%eax 0x8048453 <triangle+35>: sar $0x1f,%eax 0x8048456 <triangle+38>: shr $0x1f,%eax 0x8048459 <triangle+41>: lea (%eax, %edx, 1), %eax 0x804845c <triangle+44>: sar %eax 0x804845e <triangle+46>: mov %eax,0xffffffd4(%ebp) 0x8048461 <triangle+49>: mov 0xffffffd4(%ebp),%eax 0x8048464 <triangle+52>: mov %eax,%eax 0x8048466 <triangle+54>: add $0x30,%esp 0x8048469 <triangle+57>: pop %esi 0x804846a <triangle+58>: pop %edi 0x804846b <triangle+59> pop %ebp 0x804846c <triangle+60>: ret
x1f,%eax 0x8048456 <triangle+38>: shr 0x8048430 <triangle>: push %ebp 0x8048431 <triangle+1>: mov %esp, %ebp 0x8048433 <triangle+3>: push %edi 0x8048434 <triangle+4>: push %esi 0x8048435 <triangle+5>: sub $0x30,%esp 0x8048438 <triangle+8>: lea 0xffffffd8(%ebp), %edi 0x804843b <triangle+11>: mov $0x8049508,%esi 0x8048440 <triangle+16>: cld 0x8048441 <triangle+17>: mov $0x30,%esp 0x8048446 <triangle+22>: repz movsl %ds:( %esi), %es:( %edi) 0x8048448 <triangle+24>: mov 0x8(%ebp),%eax 0x804844b <triangle+27>: mov %eax,%edx 0x804844d <triangle+29>: imul 0xc(%ebp),%edx 0x8048451 <triangle+33>: mov %edx,%eax 0x8048453 <triangle+35>: sar $0x1f,%eax 0x8048456 <triangle+38>: shr $0x1f,%eax 0x8048459 <triangle+41>: lea (%eax, %edx, 1), %eax 0x804845c <triangle+44>: sar %eax 0x804845e <triangle+46>: mov %eax,0xffffffd4(%ebp) 0x8048461 <triangle+49>: mov 0xffffffd4(%ebp),%eax 0x8048464 <triangle+52>: mov %eax,%eax 0x8048466 <triangle+54>: add $0x30,%esp 0x8048469 <triangle+57>: pop %esi 0x804846a <triangle+58>: pop %edi 0x804846b <triangle+59> pop %ebp 0x804846c <triangle+60>: ret
x1f,%eax 0x8048459 <triangle+41>: lea (%eax, %edx, 1), %eax 0x804845c <triangle+44>: sar %eax 0x804845e <triangle+46>: mov %eax,0xffffffd4(%ebp) 0x8048461 <triangle+49>: mov 0xffffffd4(%ebp),%eax 0x8048464 <triangle+52>: mov %eax,%eax 0x8048466 <triangle+54>: add 0x8048430 <triangle>: push %ebp 0x8048431 <triangle+1>: mov %esp, %ebp 0x8048433 <triangle+3>: push %edi 0x8048434 <triangle+4>: push %esi 0x8048435 <triangle+5>: sub $0x30,%esp 0x8048438 <triangle+8>: lea 0xffffffd8(%ebp), %edi 0x804843b <triangle+11>: mov $0x8049508,%esi 0x8048440 <triangle+16>: cld 0x8048441 <triangle+17>: mov $0x30,%esp 0x8048446 <triangle+22>: repz movsl %ds:( %esi), %es:( %edi) 0x8048448 <triangle+24>: mov 0x8(%ebp),%eax 0x804844b <triangle+27>: mov %eax,%edx 0x804844d <triangle+29>: imul 0xc(%ebp),%edx 0x8048451 <triangle+33>: mov %edx,%eax 0x8048453 <triangle+35>: sar $0x1f,%eax 0x8048456 <triangle+38>: shr $0x1f,%eax 0x8048459 <triangle+41>: lea (%eax, %edx, 1), %eax 0x804845c <triangle+44>: sar %eax 0x804845e <triangle+46>: mov %eax,0xffffffd4(%ebp) 0x8048461 <triangle+49>: mov 0xffffffd4(%ebp),%eax 0x8048464 <triangle+52>: mov %eax,%eax 0x8048466 <triangle+54>: add $0x30,%esp 0x8048469 <triangle+57>: pop %esi 0x804846a <triangle+58>: pop %edi 0x804846b <triangle+59> pop %ebp 0x804846c <triangle+60>: ret
x30,%esp 0x8048469 <triangle+57>: pop %esi 0x804846a <triangle+58>: pop %edi 0x804846b <triangle+59> pop %ebp 0x804846c <triangle+60>: ret