`
hellhell
  • 浏览: 23177 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

晚上摆弄的小玩意

阅读更多
#include <stdio.h>

void p(char* s, int a)
{
    fprintf(stderr, "%s and %d", s, a);
}

void f(char* s, int a)
{
    int b[1];
    printf("%x\n", b[1]);
    printf("%x\n", b[2]);
    printf("%x\n", b[3]);
    b[4] = (int)(p);
    b[5] = (int)("hi");
    b[6] = 2;

    p(s, a);
}

int main()
{
    int a = 1;
    f("hello", a);
	return 0;
}


   我想用hacker的手段来修改f函数的返回地址,可惜的是一直没有成功,不过倒是把参数值给改了,打印了hi和2之后就是段错误,怎样解决这个段错误,暂还没有办法。直接看main函数内生成的汇编码,并没有什么特别之处。但是在f函数里,b[1]并不是ebp的值,而是一个莫名其妙的值,不知道是干什么的,而b[2]里面是gcc的GLOBAL_OFFSET_TABLE,也不知道是干什么用的,b[3]才是ebp的值,然后顺下来b[4],b[5],b[6]的值都对得上号。

   不过修改了f函数的返回地址后,的确是可以正确地跳转到p里,还可以执行两步,但是很快就段错误了,可惜gdb生手,调了一上,陷在printf里面出不来,也不知道这个段错误的具体原因。但是,对于这个例子,纠结于细节的意义也不大,关键是明白C程序运行时的栈结构,心里明白,也就可以了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics