An introduction to debugging
This isn't a book about reverse engineering as such, but the science and art of reversing serves us well as pen testers. Even if we don't write our own exploits, reversing gives us the bird's eye view we need to understand low-level memory management. We've looked at a couple of languages so far – Python and Ruby – and we'll also be taking a look at some very basic C code in this chapter. These languages are high-level languages. This means they're layers of logical abstraction away from the native language of the machine and closer to how people think; therefore, they're made up of high-level concepts such as objects, procedures, control flows, variables, and so on. This hierarchy of abstraction in high-level languages is by no means flat; C, for example, is considered to be closer to the machine's native language than other high-level languages. Low-level languages, on the other hand, have little or no abstraction from machine code. The most important low-level...