前几天我通过修补单个调用指令写了一个简单的钩子/绕行。 它适用于Ubuntu 12.xyz(32位),现在我更新到Linux Mint 17.1(32位),我得到了分段错误。
我有两个项目
在覆盖调用指令偏移量之前,我通过以下方式修改页面保护:
mprotect(pageOf(address),pagesize,PROT_WRITE|PROT_EXEC|PROT_READ)
这很好用(返回0)。
当我调试我的程序时,它在尝试写入调用地址时崩溃:
memcpy((void*)(address + 1),(void*)&callOffset,4);
看起来我不允许覆盖说明,但为什么?
我在ALSR上使用了{+ 1}}并使用了g ++。
您知道如何允许我的应用程序编写指令吗?
谢谢你,Alex
修改
对不起伙计们,这是代码:
目标申请:
-z execstack -fno-stack-protector
和共享的lib代码:
#include <dlfcn.h>
#include <stdio.h>
#include <stdio.h>
#include <iostream>
void goodGuy();
//full lib path !
char libPath[] = "INSER_YOUR_PATH_HERE/lib.so";
int main(){
dlopen(libPath,RTLD_NOW);
goodGuy();
return 0;
}
void goodGuy(){
printf("good guy :)\n");
}
要查找addressOfCall使用gdb #include <stdio.h>
#include <cstring>
#include <stdint.h>
#include <sys/mman.h>
#include <unistd.h>
void badGuy();
int pagesize = sysconf(_SC_PAGESIZE);
void *pageOf(void* p){
return (void*)((unsigned int)p & ~(pagesize - 1));
}
extern "C" void __attribute__ ((constructor)) DllLoad(void){
uint32_t addressOfCall = 0x0804862a; //Address where goodGuy is called in target app
uint32_t addressOfNextInstruction = addressOfCall + 5;
uint32_t callOffset = (uint32_t)badGuy - addressOfNextInstruction;
mprotect(pageOf((void*)(addressOfCall + 1)),pagesize, PROT_WRITE|PROT_EXEC|PROT_READ);
memcpy((void*)(addressOfCall + 1),(void*)&callOffset,4);
}
void badGuy(){
printf("bad guy :(\n");
}
打开目标应用程序并按gdb target
显示主要功能,并查看disas main
+29