随笔,代码隐藏基础

3 篇文章 1 订阅

滴水逆向,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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值