晚上摆弄的小玩意

本文通过一个具体的C语言示例程序,深入探讨了如何利用hacker手段修改函数返回地址的方法,虽然尝试并未完全成功,但详细分析了程序运行时的栈结构及遇到的段错误问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值