#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程序运行时的栈结构,心里明白,也就可以了。