Vector35 / binaryninja-api

Public API, examples, documentation and issues for Binary Ninja
https://binary.ninja/
MIT License
946 stars 214 forks source link

`lea` instruction tends to confuse HLIL translation #5151

Open alexrp opened 9 months ago

alexrp commented 9 months ago

Version and Platform (required):

Bug Description: BNDB

image

Something is clearly suspect about these this != -0x10 comparisons. I've seen similar patterns many times before, and what they all seem to have in common is the use of the lea instruction.

Disassembly:

image

Some things that stand out to me here:

There's nothing interesting in LLIL here, but switching to MLIL, it seems like the types are right:

image

None of the advanced IL forms reveal anything interesting AFAICT. The problem seems to occur somewhere during the translation to HLIL.

I don't know if the lea instruction is actually causing this issue, but again, whenever I see this particular pattern of incorrect decompilation, it's always involved a lea.

alexrp commented 9 months ago

Thinking about it more, I can sort of see what's going on here: BN is essentially reasoning that (this + 0x10) != 0 can be simplified to this != -0x10. This seems like a reasonable transformation for integer types, but I wonder if it should be prevented for pointer types for clarity? If the check was instead translated to &this->lock != 0, it would be much more obvious what's happening here.

This still doesn't really explain why the disassembly shows the wrong types at 7ff69b3fe209 though.

plafosse commented 8 months ago

Yes your guess is correct Before:

image

After:

image

I also agree with your assessment that we shouldn't be allowing this transform to happen with pointer. I don't however know why we're not showing this as &this->lock != 0 which would be ideal. Assigning this to Rusty to triage