滴水逆向,2015-3-6随笔
将代码段数据放置在全局变量区,使用指针去调用
直接上手撸代码,访问出错
是DEP保护没关(保证数据区代码不可执行)
那就关掉吧,属性->链接器->高级->数据执行保护 选否
此时
int (*p)(int);
p = (int (*)(int))(&a);
int b = (*p)(3);
printf("%d\n",b);
正常运行,且无报错
但是 如果在函数里加了printf 就又出现这个问题
看反汇编,找了半天,好像不是我字符弄错了
单步调
在调用完printf后,程序自动调用堆栈平衡检测函数
down掉了,跟进去不是代码
为什么call printf 正常 call 堆栈平衡检测函数就不行呢
分析一下,printf 是长跳转 ,所以地址是定死的,没毛病(只要不开启地址随机化)
但是堆栈平衡函数的跳转是短跳转,也就是修改现在的IP 然后完成跳转,但是现在a所在位置是数据区,所以段内跳转没到堆栈平衡的正确位置
//附 短跳转: 0xE8,0x1D,0xFD,0xFF,0xFF, = 下一条指令的起始IP + 0xFFFFFD1D
看似简单,又把自己坑了,基础很重要
附代码
#include<stdio.h>
int test(int X)
{
return 1+X;
}
char a[] = {
0x55,
0x8B,0xEC,
0x81,0xEC,0xC0,0x00,0x00,0x00,
0x53,
0x56,
0x57,
0x8D,0xBD,0x40,0xFF,0xFF,0xFF,
0xB9,0x30,0x00,0x00,0x00,
0xB8,0xCC,0xCC,0xCC,0xCC,
0xF3,0xAB,
0x8B,0x45,0x08,
0x83,0xC0,0x01,
0x5F,
0x5E,
0x5B,
0x8B,0xE5,
0x5D,
0xC3};
int tes2t(int X)
{
printf("%d",X);
return 1;
}
char arr[] = {
0x55,
0x8B,0xEC,
0x81,0xEC,0xC0,0x00,0x00,0x00,
0x53,
0x56,
0x57,
0x8D,0xBD,0x40,0xFF,0xFF,0xFF,
0xB9,0x30,0x00,0x00,0x00,
0xB8,0xCC,0xCC,0xCC,0xCC,
0xF3,0xAB,
0x8B,0xF4,
0x8B,0x45,0x08,
0x50,
0x68,0x3C,0x57,0x41,0x00,
0xFF,0x15,0xB0,0x82,0x41,0x00, //printf
0x83,0xC4,0x08,
0x3B,0xF4,
0xE8,0x1D,0xFD,0xFF,0xFF, // 栈检测
0xB8,0x01,0x00,0x00,0x00,
0x5F,
0x5E,
0x5B,
0x81,0xC4,0xC0,0x00,0x00,0x00,
0x3B,0xEC,
0xE8,0x53,0xFD,0xFF,0xFF,
0x8B,0xE5,
0x5D,
0xC3
};
int main()
{
int (*p)(int);
p = (int (*)(int))(&a);
int b = (*p)(3);
printf("%d\n",b);
//int (*p2)(int) = (int (*)(int)) &arr;
int (*p2)(int) = tes2t;
(*p2)(10);
p2 = (int (*)(int)) &arr;
(*p2)(16);
return 0;
}