我在这里使用二进制混淆,所以有一个充满操作码的缓冲区,而且我使用的是 Linux,所以,所有函数调用都使用相同的调用者/被调用者约定,这里没有问题。
我的问题是关于 E8 操作码,此操作码使用相对地址进行近距离调用。
我的问题是:我知道呼叫来自的地址,我知道我必须呼叫的地址,那么,我怎样才能找到我必须在 E8 呼叫中输入的班次地址?这是:
signed long src = (signed long)buffer + shift; //get the position where E8 instruction is
signed long dst = (signed long)srand; //get the destination position where i want to call (yes, srand(long) function in this case.)
所以在我的缓冲区中,我有:
buffer[] = "[....]\xE8\xFF\xFA\xFE\x54[.....]"; //example
我需要用一个有效的指向 srand 的指针替换,我怎样才能从我拥有的东西中获取相对地址?
我只是认为我可以使用 FF 指令直接调用,但我不知道如何做到这一点。我无法将地址复制到(比如说)$eax,因为我不能在替换中放置超过 5 个的操作码(它会使上面的所有 jmp 调用都变成香蕉),而且我不明白是否有办法直接调用 5 个字节。
因此,如果有人知道如何获得正确的值来替换 E8 相对移位地址,或者如果有办法进行某种直接调用,保持与 E8 调用相同的功能属性并且只使用 5 个字节......
(在询问之前,我尝试将 FF XX XX XX XX 设置为 XX 作为真实地址,但它不起作用,x86 看起来不像是一个调用,它解释为一个 INC(???)和一些随机之后的事情我尝试以这种方式替换:
inline void endian_swap(long& x) {
x = (x>>24) |
((x<<8) & 0x00FF0000) |
((x>>8) & 0x0000FF00) |
(x<<24);
}
endian_swap(dst);
endian_swap(src);
unsigned int p = dst - src;
endian_swap(p);
并将我找到的地址放入 E8 呼叫。无论如何它都没有用。