Part 30 – Debugging Float Variables

For a complete table of contents of all the lessons please click below as it will give you a brief of each lesson in addition to the topics it will cover. https://github.com/mytechnotalent/Reverse-Engineering-Tutorial

Let’s re-examine our code.

  1. #include <iostream>
  2. int main(void) {
  3. float myNumber = 1337.1;
  4. std::cout << myNumber << std::endl;
  5. return 0;
  6. }

Part 30 – Debugging Float Variables - 图1

Let’s debug!

Part 30 – Debugging Float Variables - 图2

Let’s break on main+20 and continue to that point.

Part 30 – Debugging Float Variables - 图3

Let’s examine what value is inside r11-8. We clearly see it is 1337.09998 which approximates our value in our original c++ code. Keep in mind a float has roughly 7 decimal digits of precision and that is why we do not see 1337.1 so please remember that as we go forward.

Part 30 – Debugging Float Variables - 图4

We can also see this value in high memory.

Part 30 – Debugging Float Variables - 图5

Let’s break on main+28 and continue.

Part 30 – Debugging Float Variables - 图6

We see a strange new instruction. We see vldr and the value within r11, #8 being moved into s0. So what is s0? We have a math co-processor which has a series of additional registers that work with decimal or floating-point numbers. Here we see an example of such to which the value of 1337.09998 is being moved into s0. The vldr instruction loads a constant value into every element of a single-precision or double-precision register such as s0.

Part 30 – Debugging Float Variables - 图7

We can only see these special registers if we do a info registers all command as we do below.

Part 30 – Debugging Float Variables - 图8

Below we see the value now being moved into s0.

Part 30 – Debugging Float Variables - 图9

Next week we will dive into Hacking Float Variables.