免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 思一克
打印 上一主题 下一主题

一个所谓的全局变量地址改变的例子 [复制链接]

论坛徽章:
0
51 [报告]
发表于 2010-02-02 10:09 |只看该作者
学习中。

论坛徽章:
0
52 [报告]
发表于 2010-02-02 13:56 |只看该作者
你们的都太高深,不知道我这个算不算?
  1. #include <stdio.h>

  2. int gi = 1;

  3. f()
  4. {
  5. int i;

  6.   /×
  7.   这里添加几行代码,不准有输出信息的任何代码,然后打开注释。  ×/
  8.   int gi=2;
  9. /××/

  10.   for(i = 0; i < 256; i++) {
  11.     printf("addr = %p value = %d\n", &gi, gi);
  12.   }
  13. }

  14. main()
  15. {
  16.   f();
  17. }
复制代码

论坛徽章:
0
53 [报告]
发表于 2010-02-02 14:00 |只看该作者
本帖最后由 shaver 于 2010-02-03 10:16 编辑

网络问题,发重复了,编辑掉

论坛徽章:
0
54 [报告]
发表于 2010-02-02 14:02 |只看该作者
本帖最后由 shaver 于 2010-02-03 10:16 编辑

网络问题,发重复了,编辑掉

论坛徽章:
0
55 [报告]
发表于 2010-02-02 14:18 |只看该作者
回复 55# shaver

GI = 2, 用本地变量覆盖了全局,那显示的都是本地的了,不会开始是一个数,最后是一个数字。

论坛徽章:
0
56 [报告]
发表于 2010-02-02 14:19 |只看该作者
楼上正解。
变量地址是立即数,没可能改变的。

论坛徽章:
0
57 [报告]
发表于 2010-02-02 14:20 |只看该作者
来个简单点的:
学与思 发表于 2010-02-01 17:51



学与思的这个很好。
能否介绍一下函数的跳转表细节?

论坛徽章:
0
58 [报告]
发表于 2010-02-02 14:23 |只看该作者
*(&i+4) = (int)("addr = %p value = %d\n"
*(&i+5) = (int)(&gi+1);
*(&i+6) = gi+1;
*(&i+2) = (int ...
cjaizss 发表于 2010-01-29 12:21


编译器优化后不见得是这种效果

论坛徽章:
0
59 [报告]
发表于 2010-02-02 14:47 |只看该作者
来个简单点的:
学与思 发表于 2010-02-01 17:51


[test]$ cat a.c
#include <stdio.h>
#include <string.h>

int evil_code(char *s)
{
        printf("hi, I am here!\n");
        return 0;
}

int main(int argc, char *argv[])
{
        long addr = *(long *)((long)strlen + 2);
        *(long *)addr = (long)evil_code;
        int len = strlen(argv[0]);
        printf("len = [%d]\n", len);
        return 0;
}
[test]$ gcc a.c -o a
[test]$ ./a
Segmentation fault
[test]$ uname -a
Linux test 2.6.32-gentoo-r2 #2 SMP Fri Jan 29 19:14:58 CST 2010 x86_64 Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz GenuineIntel GNU/Linux
[test]$

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
60 [报告]
发表于 2010-02-02 15:29 |只看该作者
本帖最后由 cjaizss 于 2010-02-02 18:39 编辑
[test]$ cat a.c
#include
#include

int evil_code(char *s)
{
        printf("hi, I am he ...
baicj 发表于 2010-02-02 14:47



    其实这也是编译相关的代码,系统如何实现才可决定代码如何写,只是改栈在如此硬件/如此编译下是最简单的.一般来说,crack也只是对症下药,并无统一规范方式.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP