博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux内核分析-1/反汇编(堆栈)
阅读量:4283 次
发布时间:2019-05-27

本文共 2047 字,大约阅读时间需要 6 分钟。


运行环境:实验楼


/*main.c*/int g(int x){
return x + 3;}int f(int x){
return g(x);}int main(void){
return f(8) + 1;}

/*Makefile*/all:	gcc –S –o main.s main.c -m32

/*main.s*/	.file	"main.c"	.text	.globl	g	.type	g, @functiong:.LFB0:	.cfi_startproc	pushl	%ebp	.cfi_def_cfa_offset 8	.cfi_offset 5, -8	movl	%esp, %ebp	.cfi_def_cfa_register 5	movl	8(%ebp), %eax	addl	$3, %eax	popl	%ebp	.cfi_restore 5	.cfi_def_cfa 4, 4	ret	.cfi_endproc.LFE0:	.size	g, .-g	.globl	f	.type	f, @functionf:.LFB1:	.cfi_startproc	pushl	%ebp	.cfi_def_cfa_offset 8	.cfi_offset 5, -8	movl	%esp, %ebp	.cfi_def_cfa_register 5	subl	$4, %esp	movl	8(%ebp), %eax	movl	%eax, (%esp)	call	g	leave	.cfi_restore 5	.cfi_def_cfa 4, 4	ret	.cfi_endproc.LFE1:	.size	f, .-f	.globl	main	.type	main, @functionmain:.LFB2:	.cfi_startproc	pushl	%ebp                //将栈底压栈	.cfi_def_cfa_offset 8	.cfi_offset 5, -8	movl	%esp, %ebp         	//将栈顶的值赋给栈底	.cfi_def_cfa_register 5	subl	$4, %esp			//栈顶	movl	$8, (%esp)  		//将8赋给栈顶	call	f	addl	$1, %eax	leave	.cfi_restore 5	.cfi_def_cfa 4, 4	ret	.cfi_endproc.LFE2:	.size	main, .-main	.ident	"GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"	.section	.note.GNU-stack,"",@progbits

gcc  –o main main.c -m32 //可以编译为可执行文件//然后在命令行下./main 就开始执行了//这个过程大概是bash解析了命令行.并fork并exec了main将main从设备块中读取到高速缓冲块中,然后拷贝到用户空间的对应段上.?,并建立栈顶esp和栈底ebp和eip//栈顶在栈底下面,中间无间隔,eip指向main中的 pushl %ebp然后从main开始运行,在栈内?//栈内的哪个地址?假设栈内的地址为0xbfe5 d38f,栈向下增长
/*用户栈*//*从高到*/主程序的参数主程序调用后的返回地址第0帧地址局部变量fun1的参数fun1调用后的返回地址第1帧地址局部变量

##汇编代码解析



###main



  • main标号内的pushl执行之前的状态

这里写图片描述

  • pushl %ebp
下面的图表示是上面的语句执行完之后的状态即下图表示的是 pushl	%ebp 后的状态

这里写图片描述

  • movl %esp, %ebp

这里写图片描述

  • subl $4, %esp

这里写图片描述

  • movl $8, (%esp)

这里写图片描述

  • call f

这里写图片描述


###f


  • pushl %ebp

这里写图片描述

  • movl %esp, %ebp

这里写图片描述

  • subl $4, %esp

这里写图片描述

  • movl 8(%ebp), %eax
该行没有改变栈,只是将(ebp-8)地址内的值(8)付给了eax
  • movl %eax, (%esp)

这里写图片描述

  • call g

这里写图片描述


###g


  • pushl %ebp

这里写图片描述

  • movl %esp, %ebp

这里写图片描述

  • movl 8(%ebp), %eax
该行没有改变栈,只是将(ebp-8)地址内的值(8)付给了eax
  • addl $3, %eax
改行没有改变栈,只是将eax加了3,此时为11
  • popl %ebp

这里写图片描述

  • g:ret

这里写图片描述


###f


  • f : leave

这里写图片描述

  • f:ret

这里写图片描述


###main


  • addl $3, %eax
此时没改变堆栈,只是将eax中的值加了3,此时为14
  • leave

这里写图片描述

  • ret

这里写图片描述


####注意:

这里面需要注意的是%eax是独立于栈存在的,所以不会消失,所以返回值都存在%eax寄存器中栈分为四种,这里面分析的栈是满减栈,另外还有空减栈,满增栈,满减栈

##参考资料

你可能感兴趣的文章
杂谈:HTML 5的消息通知机制
查看>>
Ajax异步请求PHP数据
查看>>
百家搜索:在网站中添加Google、百度等搜索引擎
查看>>
关于坛友的一个布局问题的解答
查看>>
网页抓取:PHP实现网页爬虫方式小结
查看>>
国民岳父的“屁民理论”
查看>>
我为什么要写博客?
查看>>
博客测试:博客系统i94web beta1.0 请求测试
查看>>
XAMPP:访问phpmyadmin出错的解决方案
查看>>
怎么用PHP在HTML中生成PDF文件
查看>>
PHP中我经常容易混淆的三组函数
查看>>
DOM笔记(一):HTMLDocument接口
查看>>
DOM笔记(二):Node接口
查看>>
DOM笔记(三):Element接口和HTMLElement接口
查看>>
DOM笔记(四):HTML 5 DOM复杂数据类型
查看>>
DOM笔记(五):JavaScript的常见事件和Ajax小结
查看>>
DOM笔记(六):怎么进行JQuery扩展?
查看>>
搜索和网页排名的数学原理
查看>>
DOM笔记(八):JavaScript执行环境和垃圾收集
查看>>
响应式下的下拉菜单
查看>>