linux 小程序分析
2016-03-31 20:39
405 查看
//环境 centos 5.x
附件:http://down.51cto.com/data/2367532
//程序实例1: #include<stdio.h> #include<stdlib.h> void bug() { system("reboot");//re boot system exit(0);//end process } int stack_test(int a,int b)//函数压栈中 依次压入 主函数a,b拷贝值,b在高地址 {//压栈顺序是参数从右到左,然后栈帧,而求值顺序则是undefined的,由编译器实现决定。 printf("before write: 0x%x\n",b);//输出写入前b值 int *p=&a; //p指向a p++; //p偏移向b *p=0xdddd;//*p值改变 b被改变 printf("after write: 0x%x\n",b); int c=0xcccc; return c; } int main() { int a=0xaaaa; int b=0xbbbb; int ret=stack_test(a,b); printf("you shoule run here\n"); return ; } //程序实例2: #include<stdio.h> #include<stdlib.h> void bug() { system("reboot");//reboot system exit(0);//end process } int stack_test(int a,int b) { int *p=&a; p--; *p=bug; int c=0xcccc; return c; } int main() { int a=0xaaaa; int b=0xbbbb; int ret=stack_test(a,b); printf("you shoule run here\n"); return ; } //输出结果:before write: 0xbbbb // after write: 0xdddd // you shoule run here //(gdb) p &a centos 下gdb调试信息 /* (gdb) p&a $1 = (int *) 0xbffff630 (gdb) p&b $2 = (int *) 0xbffff634 (gdb) p&p $3 = (int **) 0xbffff620 (gdb) p&c $4 = (int *) 0xbffff624 (gdb) n 14 p--; (gdb) p p $5 = (int *) 0xbffff630 (gdb) n 15 *p=bug; (gdb) p p $6 = (int *) 0xbffff62c (gdb) p *p $7 = 134513797 (gdb) n 21 int c=0xcccc; (gdb) p* p $8 = 134513684 (gdb) p bug $9 = {void ()} 0x8048414 <bug> (gdb) p& bug $10 = (void (*)()) 0x8048414 <bug> gdb) n 22 return c; (gdb) n 23 } (gdb) n bug () at process.c:5 5 { (gdb) n Breakpoint 2, bug () at process.c:6 6 system("reboot");//re boot system 由调试 信息和下图可得: 当函数调用时首先esp动 依次压入 形参b,a 返回函数指针 return(a add-4) 然后压入ebp 让ebp等于esp 此时ebp记录了返回信息之后 esp动依次压入局部变量 p c ,p开始指向a,p--后,p指向ebp指向空间,当p=bug后 p记录bug函数栈帧,return c 调用了bug 函数 系统重启*/
附件:http://down.51cto.com/data/2367532
相关文章推荐
- (OK—C++程序) Eclipse C/C++ — CentOS 7 + android-ndk + eclipse-cpp-mars-R
- (OK) CentOS 7 + android-ndk-r10d-linux-x86_64 + Android (ARM)—ndk-build
- (OK—C程序) Eclipse C/C++ — CentOS 7 + android-ndk + eclipse-cpp-mars-R
- linux终端下一些“风骚”的按键操作及Linux终端命令
- Linux下Postfix的配置和使用
- 《Linux内核分析》第七周 读书笔记
- linux下mysql的root密码忘记解决方法
- linux下用yum给php安装gd库
- 轻松搞定Linux环境变量
- GEEK学习笔记— —Linux常用命令
- linux 进程
- linux awk 命令
- linux sed 命令
- CentOS挂载NTFS移动硬盘
- linux basics
- 关于linux中执行脚本或程序时指定的路径
- centos下mysql rpm包安装报错 NOKEY的问题
- 动画演示10个超有趣的Linux命令
- Linux 线程知识总结
- Linux磁盘管理之添加硬盘