实验--反汇编一个简单的C程序(李鹏举)
2016-02-28 18:49
281 查看
攥写人:李鹏举学号:20132201(*原创作品转载请注明出处*)(学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000)实验部分(以下命令为实验楼64位Linux虚拟机环境下适用,32位Linux环境可能会稍有不同)使用gcc–S–omain.smain.c-m32命令编译成汇编代码。代码如下:
intg(intx){returnx+8;}intf(intx){returng(x);}intmain(void){returnf(12)+2;}实验过程及截图:
1.进入实验楼,进入Code文件夹,单机右键直接建立lipengju.c文件2.打开文件并将相应代码写入,保存并退出 3.
使用gcc-S-olipengju.slipengju.c-m32将lipengju.c编译成汇编代码lipengju.s4.打开lipengju.s文件,会看到机器转换之后的汇编代码
5.将以"."开头的行删去,得到纯净的汇编代码
[code][b]实验分析:栈的变化[/b]
1.
开始时eip指向18行,ebpesp都在堆栈0的位置
2.执行eip处的指令,pushl%ebp,将ebp值压栈
3.eip执行至19行,
movl%esp,%ebp,将esp值赋给ebp4.eip执行至20行,
subl$4,%esp,将esp向下移一格
5.movl$24,(%esp),将24存入此时esp所指的位置
6.
callf,调用f函数,将eip23压栈,此时eip指向f函数
7.pushl%ebp,将此时ebp值压栈
8.
movl%esp,%ebp,将esp值赋给ebp
9.subl$4,%esp,esp向下移一格
10.movl8(%ebp),%eax,将ebp向上两格装的值赋给eax,所以此时eax=24
11.movl%eax,(%esp),将eax的值赋给esp此时指向的格[/code]
12.callg,调用g函数,eip15压栈,此时eip指向g函数
13.
pushl%ebp,将此时ebp值压栈
14.movl%esp,%ebp,将esp值赋给ebp[/code]
15.movl8(%ebp),%eax,将ebp上两格的装的值赋给eax,此时eax=33
16.addl$11,%eax,给eax加11,加上之后,eax=44
17.popl%ebp,弹栈,此时ebp赋值为栈中所存的ebp4,esp缩进退一格
18.ret,弹栈,此时eip赋值为栈中所存eip15,esp缩进一格
19.leave(leave指令为如下步骤)leave[/code]
movl%ebp,%esp
popl%ebp
所以此时堆栈指针会变为
20.ret,弹栈,此时eip指向弹栈的eip23
21.addl$1,%eax,将eax加1,此时eax为45
22.leave操作(
先movl%ebp,%esp,将ebp赋值给esp
)
[b]此为C语言过程中所有的堆栈变化。[/b] 实验体会: 本次实验最重要的体会就是感受到了linux系统汇编语句和windows中汇编语句的不同,但是堆栈变化的分析基本相同,但是了解这些过程和一步步了解这些步骤并画出来还是不同的,通过这样的分析让我更加了解了linux汇编语言的变化。 并且通过本次实验了解了实验楼的用法,知道怎样在linux中建立C文件,并且将一段编好的C语言代码编译成汇编语言,总之这是对我今后Linux学习的一个很好的开始。
[/code]
相关文章推荐
- composer之安装
- redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)
- Memcache缓存系统原理
- 时间的秘密1:下跌市的反弹
- 观察者模式(一),手动编码(参考仿造《Head First设计模式》)
- sudo: effective uid is not 0, is sudo installed setuid root
- Windows DiskPart工具使用
- C++ 图的遍历
- 第一周学习笔记
- android线程和进程关系
- if else
- Android开发规范
- 颠倒的价牌
- Java中equals和==的区别
- Linux makefile 教程 非常详细,且易懂
- 第三届_取球游戏
- ubuntu1404安装ActiveMQ
- linux学习之c语言比较float,bool,指针与零值
- 数据库
- 控制不同的文字字体(Typeface对象的使用)