Check for segmented addresses when decoding spacebase references

This commit is contained in:
caheckman 2021-07-27 13:10:39 -04:00
parent 19fa121b30
commit 8253b21bab

View file

@ -254,8 +254,8 @@ public class HighFunctionDBUtil {
Register reg = var.getRegister(); Register reg = var.getRegister();
if (reg != null) { if (reg != null) {
program.getReferenceManager().addRegisterReference(pcAddr, -1, reg, RefType.WRITE, program.getReferenceManager()
source); .addRegisterReference(pcAddr, -1, reg, RefType.WRITE, source);
} }
return var; return var;
@ -496,8 +496,7 @@ public class HighFunctionDBUtil {
VariableStorage storage = highSymbol.getStorage(); VariableStorage storage = highSymbol.getStorage();
Address pcAddr = highSymbol.getPCAddress(); Address pcAddr = highSymbol.getPCAddress();
HighVariable tmpHigh = highSymbol.getHighVariable(); HighVariable tmpHigh = highSymbol.getHighVariable();
if (!storage.isHashStorage() && tmpHigh != null && if (!storage.isHashStorage() && tmpHigh != null && tmpHigh.requiresDynamicStorage()) {
tmpHigh.requiresDynamicStorage()) {
DynamicEntry entry = DynamicEntry.build(tmpHigh.getRepresentative()); DynamicEntry entry = DynamicEntry.build(tmpHigh.getRepresentative());
storage = entry.getStorage(); storage = entry.getStorage();
pcAddr = entry.getPCAdress(); // The address may change from original Varnode pcAddr = entry.getPCAdress(); // The address may change from original Varnode
@ -728,17 +727,25 @@ public class HighFunctionDBUtil {
} }
if (op.getOpcode() == PcodeOp.PTRSUB) { if (op.getOpcode() == PcodeOp.PTRSUB) {
Varnode vnode = op.getInput(0); Varnode vnode = op.getInput(0);
Varnode cnode = op.getInput(1);
if (vnode.isRegister()) { if (vnode.isRegister()) {
AddressSpace stackspace = program.getAddressFactory().getStackSpace(); AddressSpace stackspace = program.getAddressFactory().getStackSpace();
if (stackspace != null) { if (stackspace != null) {
Address caddr = op.getInput(1).getAddress(); storageAddress = stackspace.getAddress(cnode.getOffset());
storageAddress = stackspace.getAddress(caddr.getOffset());
} }
} }
else { else {
Address caddr = op.getInput(1).getAddress(); AddressSpace space = program.getAddressFactory().getDefaultAddressSpace();
storageAddress = program.getAddressFactory().getDefaultAddressSpace().getAddress( if (space instanceof SegmentedAddressSpace) {
caddr.getOffset()); // Assume this is a "full" encoding of the offset
int innersize = space.getPointerSize();
int base = (int) (cnode.getOffset() >>> 8 * innersize);
int off = (int) cnode.getOffset() & ((1 << 8 * innersize) - 1);
storageAddress = ((SegmentedAddressSpace) space).getAddress(base, off);
}
else {
storageAddress = space.getAddress(cnode.getOffset());
}
} }
} }
return storageAddress; return storageAddress;