Reputation: 39
This is the assembly code from my bomb lap question, I am stuck in phase2; The bomb lab require us to find out the correct input based on assembly code or it will exploded.
From <+20> I know that %rbp -0x30(48) == 0 or it will call <+32> and explode the bomb; so %rbp = 48(DEC)
After that(+26) %rbp - 0x2c(44) must equal 1 or it will explode the bomb... But since %rbp = 48, the bomb will explode anywhere so I am confuse now...
I think I misunderstand the compl , je/jne or how to calculate these things...
Upvotes: 0
Views: 3831
Reputation: 16596
You don't need to know value of rbp
to defuse the bomb, it's used always in relative way to address certain portion of memory. It's set at the start by the sequence:
pushq %rbp
movq %rsp, %rbp
pushq %r12
pushq %rbx
subq $0x20, %rsp
Which does push old rbp
value into stack (to preserve it), then sets rbp
to current stack pointer value (rsp
). So (%rbp)
contains the old rbp
now. Then another two registers r12
and rbx
are preserved by pushing them into stack (which makes now rsp == rbp - 16
). And then rsp
is adjusted one more time by subtracting 32, i.e. rsp == rbp - 48
.
This is common pattern how to allocate memory space for local variables, i.e. any further push
instruction will use memory below rbp - 48
. Memory from rbp - 48
up to rbp - 17
(inc.) is undefined, free to use as "local variables" memory. Then at rbp - 16
is stored in 8 bytes original rbx
value, at rbp - 8
is stored original r12
value, and at rbp
is stored old rbp
. (I mean all the "rbp - x" to be used as memory addresses to address values in the memory)
Then your code calls input 6 numbers, which I guess means 32 bit integers (judging by the following code), so it provides it with address rbp - 48
. 6*4 = 24 => the inputted values will be stored in memory from address rbp - 48
up to (incl.) rbp - 25
.
Note the gap of "unused memory" from rbp - 24
up to rbp - 17
, that's another 8 bytes of spare local storage, not used by the code you posted, that's very likely padding added by compiler to make the rsp
correctly aligned before callq read_six_numbers
.
So basically you don't need to know where exactly rsp/rbp
points to, it's pointing to some valid stack memory (either that, or the code will crash, and the bomb will NOT explode ... a bit weird design :)))). You can pick any arbitrary value, like 0x8000
for rsp
at start, and simulate the run with that. (i.e. the <+11> leaq -0x30,(%rbp), %rsi
is then rsi = 0x7FC8;
(0x8000 - 8 - 0x30).
Rest of what -x(%rbp)
means in various instructions (pay attention to the lea
vs <any other instruction>
semantics difference of "memory operand" usage, the lea
does only the memory address calculation, while other instructions just start by that, using the calculated address to access actual value stored in memory) is described in the other answer + comment. Plus use the x86 instruction reference guide and read through some tutorials few more times, until it will make sense.
Upvotes: 2
Reputation: 85767
-0x30(%ebp)
doesn't mean to use the value %ebp - 0x30
. It's a memory address to read from. The instruction (cmpl
) has an l
suffix, so it's dealing with a 4 byte quantity. So what's actually happening is that it reads a 4 byte number from the address %ebp - 0x30
and checks whether it's zero.
(The $
prefix means it's an immediate value, not an address. This is why 0x0
is taken literally and not dereferenced.)
Upvotes: 3