栈粉碎原理分析

栈粉碎原理分析

源代码如下

#include <stdio.h>void function(int a, int b) {char buffer[12];gets(buffer);//long* ret = (long *) ((long)buffer+28);//*ret = *ret + 7;return;
}void main() {int x;x = 0;function(1,2);x = 1;printf("%d\n",x);
} 
  1. 由解注释前的源代码生成二进制,分析其汇编程序,画出栈操作过程。
    Makefile
cc=gccall: stack_smashing stack_smashing.asm.PHONY : cleanstack_smashing: stack_smashing.occ -o stack_smashing stack_smashing.ostack_smashing.o: stack_smashing.scc -c -o stack_smashing.o stack_smashing.sstack_smashing.s: stack_smashing.ccc -S -O0 -fno-stack-protector -o stack_smashing.s stack_smashing.cstack_smashing.asm: stack_smashingobjdump -d stack_smashing > stack_smashing.asmclean:rm *.srm *.o

由于存在Makefile是来编译stack_smashing.c,因此直接输入命令进行编译

make 

stack_smashing:     文件格式 elf64-x86-64Disassembly of section .init:0000000000001000 <_init>:1000:	f3 0f 1e fa          	endbr64 1004:	48 83 ec 08          	sub    $0x8,%rsp1008:	48 8b 05 d9 2f 00 00 	mov    0x2fd9(%rip),%rax        # 3fe8 <__gmon_start__@Base>100f:	48 85 c0             	test   %rax,%rax1012:	74 02                	je     1016 <_init+0x16>1014:	ff d0                	call   *%rax1016:	48 83 c4 08          	add    $0x8,%rsp101a:	c3                   	ret    Disassembly of section .plt:0000000000001020 <.plt>:1020:	ff 35 92 2f 00 00    	push   0x2f92(%rip)        # 3fb8 <_GLOBAL_OFFSET_TABLE_+0x8>1026:	f2 ff 25 93 2f 00 00 	bnd jmp *0x2f93(%rip)        # 3fc0 <_GLOBAL_OFFSET_TABLE_+0x10>102d:	0f 1f 00             	nopl   (%rax)1030:	f3 0f 1e fa          	endbr64 1034:	68 00 00 00 00       	push   $0x01039:	f2 e9 e1 ff ff ff    	bnd jmp 1020 <_init+0x20>103f:	90                   	nop1040:	f3 0f 1e fa          	endbr64 1044:	68 01 00 00 00       	push   $0x11049:	f2 e9 d1 ff ff ff    	bnd jmp 1020 <_init+0x20>104f:	90                   	nopDisassembly of section .plt.got:0000000000001050 <__cxa_finalize@plt>:1050:	f3 0f 1e fa          	endbr64 1054:	f2 ff 25 9d 2f 00 00 	bnd jmp *0x2f9d(%rip)        # 3ff8 <__cxa_finalize@GLIBC_2.2.5>105b:	0f 1f 44 00 00       	nopl   0x0(%rax,%rax,1)Disassembly of section .plt.sec:0000000000001060 <printf@plt>:1060:	f3 0f 1e fa          	endbr64 1064:	f2 ff 25 5d 2f 00 00 	bnd jmp *0x2f5d(%rip)        # 3fc8 <printf@GLIBC_2.2.5>106b:	0f 1f 44 00 00       	nopl   0x0(%rax,%rax,1)0000000000001070 <gets@plt>:1070:	f3 0f 1e fa          	endbr64 1074:	f2 ff 25 55 2f 00 00 	bnd jmp *0x2f55(%rip)        # 3fd0 <gets@GLIBC_2.2.5>107b:	0f 1f 44 00 00       	nopl   0x0(%rax,%rax,1)Disassembly of section .text:0000000000001080 <_start>:1080:	f3 0f 1e fa          	endbr64 1084:	31 ed                	xor    %ebp,%ebp1086:	49 89 d1             	mov    %rdx,%r91089:	5e                   	pop    %rsi108a:	48 89 e2             	mov    %rsp,%rdx108d:	48 83 e4 f0          	and    $0xfffffffffffffff0,%rsp1091:	50                   	push   %rax1092:	54                   	push   %rsp1093:	45 31 c0             	xor    %r8d,%r8d1096:	31 c9                	xor    %ecx,%ecx1098:	48 8d 3d f0 00 00 00 	lea    0xf0(%rip),%rdi        # 118f <main>109f:	ff 15 33 2f 00 00    	call   *0x2f33(%rip)        # 3fd8 <__libc_start_main@GLIBC_2.34>10a5:	f4                   	hlt    10a6:	66 2e 0f 1f 84 00 00 	cs nopw 0x0(%rax,%rax,1)10ad:	00 00 00 00000000000010b0 <deregister_tm_clones>:10b0:	48 8d 3d 59 2f 00 00 	lea    0x2f59(%rip),%rdi        # 4010 <__TMC_END__>10b7:	48 8d 05 52 2f 00 00 	lea    0x2f52(%rip),%rax        # 4010 <__TMC_END__>10be:	48 39 f8             	cmp    %rdi,%rax10c1:	74 15                	je     10d8 <deregister_tm_clones+0x28>10c3:	48 8b 05 16 2f 00 00 	mov    0x2f16(%rip),%rax        # 3fe0 <_ITM_deregisterTMCloneTable@Base>10ca:	48 85 c0             	test   %rax,%rax10cd:	74 09                	je     10d8 <deregister_tm_clones+0x28>10cf:	ff e0                	jmp    *%rax10d1:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)10d8:	c3                   	ret    10d9:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)00000000000010e0 <register_tm_clones>:10e0:	48 8d 3d 29 2f 00 00 	lea    0x2f29(%rip),%rdi        # 4010 <__TMC_END__>10e7:	48 8d 35 22 2f 00 00 	lea    0x2f22(%rip),%rsi        # 4010 <__TMC_END__>10ee:	48 29 fe             	sub    %rdi,%rsi10f1:	48 89 f0             	mov    %rsi,%rax10f4:	48 c1 ee 3f          	shr    $0x3f,%rsi10f8:	48 c1 f8 03          	sar    $0x3,%rax10fc:	48 01 c6             	add    %rax,%rsi10ff:	48 d1 fe             	sar    %rsi1102:	74 14                	je     1118 <register_tm_clones+0x38>1104:	48 8b 05 e5 2e 00 00 	mov    0x2ee5(%rip),%rax        # 3ff0 <_ITM_registerTMCloneTable@Base>110b:	48 85 c0             	test   %rax,%rax110e:	74 08                	je     1118 <register_tm_clones+0x38>1110:	ff e0                	jmp    *%rax1112:	66 0f 1f 44 00 00    	nopw   0x0(%rax,%rax,1)1118:	c3                   	ret    1119:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)0000000000001120 <__do_global_dtors_aux>:1120:	f3 0f 1e fa          	endbr64 1124:	80 3d e5 2e 00 00 00 	cmpb   $0x0,0x2ee5(%rip)        # 4010 <__TMC_END__>112b:	75 2b                	jne    1158 <__do_global_dtors_aux+0x38>112d:	55                   	push   %rbp112e:	48 83 3d c2 2e 00 00 	cmpq   $0x0,0x2ec2(%rip)        # 3ff8 <__cxa_finalize@GLIBC_2.2.5>1135:	00 1136:	48 89 e5             	mov    %rsp,%rbp1139:	74 0c                	je     1147 <__do_global_dtors_aux+0x27>113b:	48 8b 3d c6 2e 00 00 	mov    0x2ec6(%rip),%rdi        # 4008 <__dso_handle>1142:	e8 09 ff ff ff       	call   1050 <__cxa_finalize@plt>1147:	e8 64 ff ff ff       	call   10b0 <deregister_tm_clones>114c:	c6 05 bd 2e 00 00 01 	movb   $0x1,0x2ebd(%rip)        # 4010 <__TMC_END__>1153:	5d                   	pop    %rbp1154:	c3                   	ret    1155:	0f 1f 00             	nopl   (%rax)1158:	c3                   	ret    1159:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)0000000000001160 <frame_dummy>:1160:	f3 0f 1e fa          	endbr64 1164:	e9 77 ff ff ff       	jmp    10e0 <register_tm_clones>0000000000001169 <function>:1169:	f3 0f 1e fa          	endbr64 116d:	55                   	push   %rbp116e:	48 89 e5             	mov    %rsp,%rbp1171:	48 83 ec 20          	sub    $0x20,%rsp1175:	89 7d ec             	mov    %edi,-0x14(%rbp)1178:	89 75 e8             	mov    %esi,-0x18(%rbp)117b:	48 8d 45 f4          	lea    -0xc(%rbp),%rax117f:	48 89 c7             	mov    %rax,%rdi1182:	b8 00 00 00 00       	mov    $0x0,%eax1187:	e8 e4 fe ff ff       	call   1070 <gets@plt>118c:	90                   	nop118d:	c9                   	leave  118e:	c3                   	ret    000000000000118f <main>:118f:	f3 0f 1e fa          	endbr64 1193:	55                   	push   %rbp1194:	48 89 e5             	mov    %rsp,%rbp1197:	48 83 ec 10          	sub    $0x10,%rsp119b:	c7 45 fc 00 00 00 00 	movl   $0x0,-0x4(%rbp)11a2:	be 02 00 00 00       	mov    $0x2,%esi11a7:	bf 01 00 00 00       	mov    $0x1,%edi11ac:	e8 b8 ff ff ff       	call   1169 <function>11b1:	c7 45 fc 01 00 00 00 	movl   $0x1,-0x4(%rbp)11b8:	8b 45 fc             	mov    -0x4(%rbp),%eax11bb:	89 c6                	mov    %eax,%esi11bd:	48 8d 05 40 0e 00 00 	lea    0xe40(%rip),%rax        # 2004 <_IO_stdin_used+0x4>11c4:	48 89 c7             	mov    %rax,%rdi11c7:	b8 00 00 00 00       	mov    $0x0,%eax11cc:	e8 8f fe ff ff       	call   1060 <printf@plt>11d1:	90                   	nop11d2:	c9                   	leave  11d3:	c3                   	ret    Disassembly of section .fini:00000000000011d4 <_fini>:11d4:	f3 0f 1e fa          	endbr64 11d8:	48 83 ec 08          	sub    $0x8,%rsp11dc:	48 83 c4 08          	add    $0x8,%rsp11e0:	c3                   	ret    

这个asm汇编程序的主要涉及到栈操作的为functionmain函数

main函数

0000000000001169 <function>:1169:	f3 0f 1e fa          	endbr64         # 将64位模式下的栈对齐到16字节116d:	55                   	push   %rbp      #保存调用该函数前的栈基指针。116e:	48 89 e5             	mov    %rsp,%rbp # 将rsp寄存器的值赋给rbp寄存器1171:	48 83 ec 20          	sub    $0x20,%rsp # 在栈中为局部变量分配空间,将rsp寄存器的值减去0x20,即开辟栈空间0x201175:	89 7d ec             	mov    %edi,-0x14(%rbp) # 将edi寄存器的值赋给局部变量-0x14(%rbp)1178:	89 75 e8             	mov    %esi,-0x18(%rbp) # 将esi寄存器的值赋给局部变量-0x18(%rbp)117b:	48 8d 45 f4          	lea    -0xc(%rbp),%rax  # 将局部变量-0xc(%rbp)的地址赋给rax寄存器117f:	48 89 c7             	mov    %rax,%rdi        # 将rax寄存器的值赋给rdi寄存器1182:	b8 00 00 00 00       	mov    $0x0,%eax      # 将0x0赋给eax寄存器目的是为了调用printf函数1187:	e8 e4 fe ff ff       	call   1070 <gets@plt> # 调用gets函数118c:	90                   	nop                    # 无操作,目的是为了填充字节,使得函数的长度为16的倍数118d:	c9                   	leave                 # 恢复rbp寄存器的值118e:	c3                   	ret                 # 函数返回
000000000000118f <main>:118f:	f3 0f 1e fa          	endbr64           # 将64位模式下的栈对齐到16字节1193:	55                   	push   %rbp           # 保存调用该函数前的栈基指针1194:	48 89 e5             	mov    %rsp,%rbp     # 将rsp寄存器的值赋给rbp寄存器1197:	48 83 ec 10          	sub    $0x10,%rsp    # 在栈中为局部变量分配空间,将rsp寄存器的值减去0x10,即开辟栈空间0x10119b:	c7 45 fc 00 00 00 00 	movl   $0x0,-0x4(%rbp)   # 将0x0赋给局部变量-0x4(%rbp)11a2:	be 02 00 00 00       	mov    $0x2,%esi       # 将0x2赋给esi寄存器11a7:	bf 01 00 00 00       	mov    $0x1,%edi       # 将0x1赋给edi寄存器11ac:	e8 b8 ff ff ff       	call   1169 <function> # 调用function函数11b1:	c7 45 fc 01 00 00 00 	movl   $0x1,-0x4(%rbp)  # 将0x1赋给局部变量-0x4(%rbp)11b8:	8b 45 fc             	mov    -0x4(%rbp),%eax  # 将局部变量-0x4(%rbp)的值赋给eax寄存器11bb:	89 c6                	mov    %eax,%esi          # 将eax寄存器的值赋给esi寄存器11bd:	48 8d 05 40 0e 00 00 	lea    0xe40(%rip),%rax        # 2004 <_IO_stdin_used+0x4> # 将字符串的地址赋给rax寄存器11c4:	48 89 c7             	mov    %rax,%rdi            # 将rax寄存器的值赋给rdi寄存器11c7:	b8 00 00 00 00       	mov    $0x0,%eax             # 将0x0赋给eax寄存器目的是为了调用printf函数11cc:	e8 8f fe ff ff       	call   1060 <printf@plt>       # 调用printf函数11d1:	90                   	nop                            # 无操作,目的是为了填充字节,使得函数的长度为16的倍数11d2:	c9                   	leave                     # 恢复rbp寄存器的值11d3:	c3                   	ret                    # 函数返回

0x1193-0x1194 push %rbp 将栈顶指针向下移动 8 字节,并将rbp中的值压入栈中。mov %rsp,%rbprsp的值复制到rbp中,这样就建立了一个新的基址指针,用于指向当前函数的栈帧。

0x1197 sub $0x10,%rsp 将栈顶指针向下移动了0x10个字节,给当前函数分配了16个字节的栈空间。这些空间用于存储本地变量和函数调用时需要保存的寄存器。

0x119b movl $0x0,-0x4(%rbp) 将变量x初始化为 0

在这里插入图片描述

0x11a2-0x11a7 mov $0x2,%esimov $0x1,%edi 分别将值2和1存储到 %esi%edi 中。

0x11ac call 1169 <function> 调用function(1,2) 在调用函数之前,当前函数的返回地址%rip被压入栈中,同时 %rsp 指针向下移动了8个字节

在这里插入图片描述

0x116d-0x116epush %rbp 将栈顶指针向下移动 8 字节,并将 %rbp 中的值压入栈中。 mov %rsp,%rbp%rsp 的值复制到 %rbp 中,建立一个新的基址指针,用于指向当前函数的栈帧。

0x1171 sub $0x20,%rsp 将栈顶指针向下移动了0x20个字节,给当前函数分配了32个字节的栈空间。

0x1175-0x1178mov %edi,-0x14(%rbp)mov %esi,-0x18(%rbp) 分别将 %edi%esi 寄存器中的值存储到当前栈帧中的相对偏移量为 -0x14 和 -0x18 的位置中。这两个值分别是函数 function 的形参a,b

在这里插入图片描述

接下来调用 gets(buffer)

lea -0xc(%rbp),%rax
mov %rax,%rdi
mov $0x0,%eax 将 buffer 地址传给寄存器 rdi
call 1070 <gets@plt> 调用 gets(buffer)

nop; leave; ret 返回到 ret_function(0x11b1) 中

movl $0x1,-0x4(%rbp) # 将0x1赋给局部变量-0x4(%rbp) 将 x 设为 1

在这里插入图片描述

接下来调用 printf("%d\n", x)

mov -0x4(%rbp),%eax 将局部变量-0x4(%rbp)的值赋给eax寄存
mov %eax,%esi 将eax寄存器的值赋给esi寄存器,将 x 值传给寄存器 esi
lea 0xe40(%rip),%rax 将字符串的地址赋给rax寄存器
mov %rax,%rdi
mov $0x0,%eax 将 “%d\n” 字符串地址传给寄存器 rdi
call 1060 <printf@plt> 调用 printf(“%d\n”, x)

nop; leave; ret

  1. 将源代码中的语句解注释,再生成二进制,分析其汇编程序,画出栈操作过程。

将源代码解注释的汇编代码


stack_smashing:     文件格式 elf64-x86-64Disassembly of section .init:0000000000001000 <_init>:1000:	f3 0f 1e fa          	endbr64 1004:	48 83 ec 08          	sub    $0x8,%rsp1008:	48 8b 05 d9 2f 00 00 	mov    0x2fd9(%rip),%rax        # 3fe8 <__gmon_start__@Base>100f:	48 85 c0             	test   %rax,%rax1012:	74 02                	je     1016 <_init+0x16>1014:	ff d0                	call   *%rax1016:	48 83 c4 08          	add    $0x8,%rsp101a:	c3                   	ret    Disassembly of section .plt:0000000000001020 <.plt>:1020:	ff 35 92 2f 00 00    	push   0x2f92(%rip)        # 3fb8 <_GLOBAL_OFFSET_TABLE_+0x8>1026:	f2 ff 25 93 2f 00 00 	bnd jmp *0x2f93(%rip)        # 3fc0 <_GLOBAL_OFFSET_TABLE_+0x10>102d:	0f 1f 00             	nopl   (%rax)1030:	f3 0f 1e fa          	endbr64 1034:	68 00 00 00 00       	push   $0x01039:	f2 e9 e1 ff ff ff    	bnd jmp 1020 <_init+0x20>103f:	90                   	nop1040:	f3 0f 1e fa          	endbr64 1044:	68 01 00 00 00       	push   $0x11049:	f2 e9 d1 ff ff ff    	bnd jmp 1020 <_init+0x20>104f:	90                   	nopDisassembly of section .plt.got:0000000000001050 <__cxa_finalize@plt>:1050:	f3 0f 1e fa          	endbr64 1054:	f2 ff 25 9d 2f 00 00 	bnd jmp *0x2f9d(%rip)        # 3ff8 <__cxa_finalize@GLIBC_2.2.5>105b:	0f 1f 44 00 00       	nopl   0x0(%rax,%rax,1)Disassembly of section .plt.sec:0000000000001060 <printf@plt>:1060:	f3 0f 1e fa          	endbr64 1064:	f2 ff 25 5d 2f 00 00 	bnd jmp *0x2f5d(%rip)        # 3fc8 <printf@GLIBC_2.2.5>106b:	0f 1f 44 00 00       	nopl   0x0(%rax,%rax,1)0000000000001070 <gets@plt>:1070:	f3 0f 1e fa          	endbr64 1074:	f2 ff 25 55 2f 00 00 	bnd jmp *0x2f55(%rip)        # 3fd0 <gets@GLIBC_2.2.5>107b:	0f 1f 44 00 00       	nopl   0x0(%rax,%rax,1)Disassembly of section .text:0000000000001080 <_start>:1080:	f3 0f 1e fa          	endbr64 1084:	31 ed                	xor    %ebp,%ebp1086:	49 89 d1             	mov    %rdx,%r91089:	5e                   	pop    %rsi108a:	48 89 e2             	mov    %rsp,%rdx108d:	48 83 e4 f0          	and    $0xfffffffffffffff0,%rsp1091:	50                   	push   %rax1092:	54                   	push   %rsp1093:	45 31 c0             	xor    %r8d,%r8d1096:	31 c9                	xor    %ecx,%ecx1098:	48 8d 3d 0e 01 00 00 	lea    0x10e(%rip),%rdi        # 11ad <main>109f:	ff 15 33 2f 00 00    	call   *0x2f33(%rip)        # 3fd8 <__libc_start_main@GLIBC_2.34>10a5:	f4                   	hlt    10a6:	66 2e 0f 1f 84 00 00 	cs nopw 0x0(%rax,%rax,1)10ad:	00 00 00 00000000000010b0 <deregister_tm_clones>:10b0:	48 8d 3d 59 2f 00 00 	lea    0x2f59(%rip),%rdi        # 4010 <__TMC_END__>10b7:	48 8d 05 52 2f 00 00 	lea    0x2f52(%rip),%rax        # 4010 <__TMC_END__>10be:	48 39 f8             	cmp    %rdi,%rax10c1:	74 15                	je     10d8 <deregister_tm_clones+0x28>10c3:	48 8b 05 16 2f 00 00 	mov    0x2f16(%rip),%rax        # 3fe0 <_ITM_deregisterTMCloneTable@Base>10ca:	48 85 c0             	test   %rax,%rax10cd:	74 09                	je     10d8 <deregister_tm_clones+0x28>10cf:	ff e0                	jmp    *%rax10d1:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)10d8:	c3                   	ret    10d9:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)00000000000010e0 <register_tm_clones>:10e0:	48 8d 3d 29 2f 00 00 	lea    0x2f29(%rip),%rdi        # 4010 <__TMC_END__>10e7:	48 8d 35 22 2f 00 00 	lea    0x2f22(%rip),%rsi        # 4010 <__TMC_END__>10ee:	48 29 fe             	sub    %rdi,%rsi10f1:	48 89 f0             	mov    %rsi,%rax10f4:	48 c1 ee 3f          	shr    $0x3f,%rsi10f8:	48 c1 f8 03          	sar    $0x3,%rax10fc:	48 01 c6             	add    %rax,%rsi10ff:	48 d1 fe             	sar    %rsi1102:	74 14                	je     1118 <register_tm_clones+0x38>1104:	48 8b 05 e5 2e 00 00 	mov    0x2ee5(%rip),%rax        # 3ff0 <_ITM_registerTMCloneTable@Base>110b:	48 85 c0             	test   %rax,%rax110e:	74 08                	je     1118 <register_tm_clones+0x38>1110:	ff e0                	jmp    *%rax1112:	66 0f 1f 44 00 00    	nopw   0x0(%rax,%rax,1)1118:	c3                   	ret    1119:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)0000000000001120 <__do_global_dtors_aux>:1120:	f3 0f 1e fa          	endbr64 1124:	80 3d e5 2e 00 00 00 	cmpb   $0x0,0x2ee5(%rip)        # 4010 <__TMC_END__>112b:	75 2b                	jne    1158 <__do_global_dtors_aux+0x38>112d:	55                   	push   %rbp112e:	48 83 3d c2 2e 00 00 	cmpq   $0x0,0x2ec2(%rip)        # 3ff8 <__cxa_finalize@GLIBC_2.2.5>1135:	00 1136:	48 89 e5             	mov    %rsp,%rbp1139:	74 0c                	je     1147 <__do_global_dtors_aux+0x27>113b:	48 8b 3d c6 2e 00 00 	mov    0x2ec6(%rip),%rdi        # 4008 <__dso_handle>1142:	e8 09 ff ff ff       	call   1050 <__cxa_finalize@plt>1147:	e8 64 ff ff ff       	call   10b0 <deregister_tm_clones>114c:	c6 05 bd 2e 00 00 01 	movb   $0x1,0x2ebd(%rip)        # 4010 <__TMC_END__>1153:	5d                   	pop    %rbp1154:	c3                   	ret    1155:	0f 1f 00             	nopl   (%rax)1158:	c3                   	ret    1159:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)0000000000001160 <frame_dummy>:1160:	f3 0f 1e fa          	endbr64 1164:	e9 77 ff ff ff       	jmp    10e0 <register_tm_clones>0000000000001169 <function>:1169:	f3 0f 1e fa          	endbr64 116d:	55                   	push   %rbp116e:	48 89 e5             	mov    %rsp,%rbp1171:	48 83 ec 30          	sub    $0x30,%rsp1175:	89 7d dc             	mov    %edi,-0x24(%rbp)1178:	89 75 d8             	mov    %esi,-0x28(%rbp)117b:	48 8d 45 ec          	lea    -0x14(%rbp),%rax117f:	48 89 c7             	mov    %rax,%rdi1182:	b8 00 00 00 00       	mov    $0x0,%eax1187:	e8 e4 fe ff ff       	call   1070 <gets@plt>118c:	48 8d 45 ec          	lea    -0x14(%rbp),%rax1190:	48 83 c0 1c          	add    $0x1c,%rax1194:	48 89 45 f8          	mov    %rax,-0x8(%rbp)1198:	48 8b 45 f8          	mov    -0x8(%rbp),%rax119c:	48 8b 00             	mov    (%rax),%rax119f:	48 8d 50 07          	lea    0x7(%rax),%rdx11a3:	48 8b 45 f8          	mov    -0x8(%rbp),%rax11a7:	48 89 10             	mov    %rdx,(%rax)11aa:	90                   	nop11ab:	c9                   	leave  11ac:	c3                   	ret    00000000000011ad <main>:11ad:	f3 0f 1e fa          	endbr64 11b1:	55                   	push   %rbp11b2:	48 89 e5             	mov    %rsp,%rbp11b5:	48 83 ec 10          	sub    $0x10,%rsp11b9:	c7 45 fc 00 00 00 00 	movl   $0x0,-0x4(%rbp)11c0:	be 02 00 00 00       	mov    $0x2,%esi11c5:	bf 01 00 00 00       	mov    $0x1,%edi11ca:	e8 9a ff ff ff       	call   1169 <function>11cf:	c7 45 fc 01 00 00 00 	movl   $0x1,-0x4(%rbp)11d6:	8b 45 fc             	mov    -0x4(%rbp),%eax11d9:	89 c6                	mov    %eax,%esi11db:	48 8d 05 22 0e 00 00 	lea    0xe22(%rip),%rax        # 2004 <_IO_stdin_used+0x4>11e2:	48 89 c7             	mov    %rax,%rdi11e5:	b8 00 00 00 00       	mov    $0x0,%eax11ea:	e8 71 fe ff ff       	call   1060 <printf@plt>11ef:	90                   	nop11f0:	c9                   	leave  11f1:	c3                   	ret    Disassembly of section .fini:00000000000011f4 <_fini>:11f4:	f3 0f 1e fa          	endbr64 11f8:	48 83 ec 08          	sub    $0x8,%rsp11fc:	48 83 c4 08          	add    $0x8,%rsp1200:	c3                   	ret    

这个asm汇编程序的同样主要涉及到栈操作的为functionmain函数,这里就不再重复上述的注释过程

main函数的栈帧变化与上面的相同

lea -0x14(%rbp),%rax
mov %rax,%rdi
mov $0x0,%eax 将 buffer 地址传给寄存器 rdi
call 1070 <gets@plt> 调用 gets(buffer)

gets函数结束时

在这里插入图片描述

那么我们来分析解注释及在调用gets函数后的变化

lea -0x14(%rbp),%rax 计算距离当前 %rbp 20 个字节的地址,并将其存储到 %rax 中。

add $0x1c,%rax 指令将 %rax中的值加上 0x1c,执行(long *) ((long)buffer+28),此时rsp指向rbp+8即ret_function位置

mov %rax,-0x8(%rbp)%rax的值存储到距离当前%rbp8个字节的位置,即将ret_function的地址传给ret
在这里插入图片描述

mov -0x8(%rbp),%rax 将ret值传给rax

mov (%rax),%rax
lea 0x7(%rax),%rdx将 rax + 0x7的地址传给rdx
mov -0x8(%rbp),%rax将ret值传给rax
mov %rdx,(%rax) 将 rax + 0x7 的值传给 ret_function

在这里插入图片描述

nop; leave; ret 返回到 ret_function(0x11cf+0x7=0x11d6) 中

因此返回main函数时不会执行0x11d6的命令即movl $0x1,-0x4(%rbp)作用为将x=1

因此最终程序会输出0

  1. 思考注释的源码语句,在你的系统环境和编译器设置下,是否偏移量28和7能够实现跳过main函数中“x=1;”语句的功能?如果不能,在你的系统/编译器设置下,这两个偏移量应设置为多少?

根据上述分析和测试结果能

在这里插入图片描述

  1. 解释被注释的源码语句,是如何在源码层面实现修改返回指令指针的?

%rax lea 0x7(%rax),%rdx将 rax + 0x7的地址传给rdx mov -0x8(%rbp),%rax将ret值传给rax mov %rdx,(%rax)` 将 rax + 0x7 的值传给 ret_function

[外链图片转存中…(img-71yUOgqP-1690513044497)]

nop; leave; ret 返回到 ret_function(0x11cf+0x7=0x11d6) 中

因此返回main函数时不会执行0x11d6的命令即movl $0x1,-0x4(%rbp)作用为将x=1

因此最终程序会输出0

  1. 思考注释的源码语句,在你的系统环境和编译器设置下,是否偏移量28和7能够实现跳过main函数中“x=1;”语句的功能?如果不能,在你的系统/编译器设置下,这两个偏移量应设置为多少?

根据上述分析和测试结果能
在这里插入图片描述

  1. 解释被注释的源码语句,是如何在源码层面实现修改返回指令指针的?

根据 function函数栈帧的排列分布,该代码中ret获取buffer数组的地址后,再加上28(0x1c),便获取到了function函数返回地址所在的空间,将该值加上 7(0x7)后,在函数返回main 函数时,便会跳过x=1的执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11668.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt服务器 网络聊天室

widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化空间server new QTcpServer(this); }Widget::~Widget() {delete ui; }//启动…

暴力猴插件简明开发教程->百度首页默认设置为我的关注

文章目录 暴力猴插件开发简明教程->百度首页默认设置为我的关注缘起缘灭思路实现尾声 暴力猴插件开发简明教程->百度首页默认设置为我的关注 缘起 在我的百度首页有很多自己设置的导航链接(接近100个),里面放了我常用的网站, 如下图 但是最近一段时间, 我发现百度做了一…

智能合约安全审计

智能合约安全审计的意义 智能合约审计用于整个 DeFi 生态系统&#xff0c;通过对协议代码的深入审查&#xff0c;可以帮助解决识别错误、低效代码以及这些问题。智能合约具有不可篡改的特点&#xff0c;这使得审计成为任何区块链项目安全流程的关键部分。 代码审计对任何应用…

【牛客面试必刷TOP101】Day1.反转链表和合并两个排序的链表

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;牛客面试必刷TOP101 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&…

详细分析Python中运算符“==“和“is“的区别

目录 Python中运算符"" Python中运算符"is" ""和"is"的区别 总结 Python中运算符"" 在Python中&#xff0c;双等号运算符"" 用于比较两个值是否相等。它返回一个布尔值&#xff0c;即True或False&#xff0c;…

C# 使用opencv从图片识别人脸示例

1.用chatgpt帮我写了一个示例 using System; using Emgu.CV; using Emgu.CV.CvEnum; using Emgu.CV.Structure;class Program {static void Main(string[] args){// 加载人脸分类器CascadeClassifier faceCascade new CascadeClassifier("haarcascade_frontalface_defau…

JenKins工作流程

程序员提交代码到Git/SVN仓库&#xff0c;触发钩子程序向 JenKins 进行通知&#xff0c;Jenkins 调用Git/SVN插件获取源码&#xff0c;调用Maven打包为war包&#xff0c;调用Deploy to web container插件部署到Tomcat服务器。

Redis哨兵模式

Redis哨兵模式 一、服务器准备二、安装redis1.Master服务器2.SlaveFirst服务器3.SlaveSecond服务器 三、依次开启Redis服务器四、开启哨兵1.修改Master哨兵配置文件2.修改SlaveFirst哨兵配置文件3.修改SlaveSecond哨兵配置文件4.开启哨兵5.验证是否开启成功6.主从配置如下五、挂…

【替换】批量替换命令文件名称或者文件内容

你是否困扰过&#xff0c;每次文件F2进行修改&#xff0c;十几个没关系&#xff0c;百来个写代码麻烦&#xff0c;那就使用shell命令吧 执行语句 先养成习惯查询验证&#xff0c;因为是批量替换&#xff0c;为了防止全局替换嘎嘎叫 替换文件名 # 【习惯】先使用顾虑查询&…

最新基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作方法

文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0c;可直观的展示主题的研究发展历程、研究现状、研究…

收藏这11个插画网站,插画师必备!

无论是在哪种设计工作中&#xff0c;插画素材都是比较常用的素材。今天本文整理了11个好用的插画工具&#xff0c;能帮助设计师轻松绘制出插画&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时设计是一款国产的&#xff0c;省心省力的插画工具。它为设计师提供了简单易…

python实现某品牌数据采集

某品牌数据采集 采集需求 地址&#xff1a;http://www.winshangdata.com/brandList 需求&#xff1a;用scrapy框架采集本站数据&#xff0c;至少抓取5个分类&#xff0c;数据量要求5000以上 采集字段&#xff1a;标题、创建时间、开店方式、合作期限、面积要求 网页分析 …

大模型部署框架 FastLLM 实现细节解析

0x0. 前言 接着 大模型部署框架 FastLLM 简要解析 这篇文章首先梳理了一下FastLLM的调用链和关键的数据结构&#xff0c;然后解析了 FastLLM 的一些实现细节和CPU/GPU后端实现采用的优化技巧。 0x1. 调用链和数据结构解析 以chatglm-6b的支持为例&#xff0c;函数入口在 htt…

NLP实验案例100个(1-5)

实验一 array数组&#xff08;01&#xff09; 一、实验目的及要求 1.安装numpy环境&#xff0c;掌握基本的数组知识以及操作。 二、实验设备&#xff08;环境&#xff09;及要求 开发环境&#xff1a;jupyter notebook 开发语言以及相关的库&#xff1a;python开发语言、nu…

微信小程序开发,小程序类目符合,线上版本无权限申请wx.getLocation接口

我开发 的小程序类目符合wx.getLocation接口的申请标准 但是却还是显示无权限申请 后来研究好久才发现&#xff0c;小程序需要在发布线上版本时提交用户隐私保护指引 如未设置也可以在 设置-服务内容声明-用户隐私保护指引-声明处理用户信息项并补充填写后提交用户隐私协议审核…

使用docker-compose搭建lnmpr环境

源码gitee compose 使用的三个步骤&#xff1a; • 使用 Dockerfile 定义应用程序的环境。 • 使用 docker-compose.yml 定义构成应用程序的服务&#xff0c;这样它们可以在隔离环境中一起运行。 • 最后&#xff0c;执行 docker-compose up -d 命令来启动并运行整个应用程序…

D2L学习记录-10-词嵌入word2vec

NLP-1-词嵌入(word2vec) 参考: 《动手学深度学习 Pytorch 第1版》第10章 自然语言处理 第1、2、3 和 4节 (词嵌入) 词嵌入 (word2vec)&#xff1a; 词向量&#xff1a;自然语言中&#xff0c;词是表义的基本单元。词向量是用来表示词的向量。词嵌入 (word embedding)&#x…

常见的正则表达式

目录 问题现象&#xff1a; 问题分析&#xff1a; 解决方法&#xff1a; 拓展&#xff1a; 1、手机号或座机&#xff1a; 2、邮箱&#xff1a; 3、中文&#xff1a; 4、数字&#xff1a; 5、英文&#xff1a; 6、组合&#xff1a; 问题现象&#xff1a; 今天在项目中&…

数据库转换分析软件:EasyMorph 5.X Crack

EasyMorph 为您和您的团队提供数据超能力。无需编码技能。不要问 IT 人员。 自己做。 内置动作 即使您不是 IT 专家&#xff0c;也可以从任何地方检索数据并自动执行复杂的数据转换 无需 SQL 或编程知识 — 设计简单且 100% 可视化 减少对企业IT部门的依赖&#xff0c;减少繁琐…

Git的远程操作与多人协作

"爱在地图上剥落&#xff0c;我离孤单几公里~" 我们目前所说、所学的内容&#xff08;工作区、暂存区、版本库&#xff09;都只是存在于本地上&#xff0c;也就是说你的一台机器上只有这么一个你维护的版本库。可是Git是一个分布式版本控制系统&#xff0c;这又是什…