已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程实验报告 课 程 名 称: 计算机系统原理实验 实 验 名 称: Bomb Lab 专 业 班 级: 姓 名: 学 号: 完 成 时 间: 2017.4.19 1、 实验目的熟悉汇编程序,学习gdb调试工具,熟悉并掌握函数调用过程中的栈帧结构的变化。2、 实验环境个人PC,Linux发行版本,终端,gdb调试工具。3、 实验要求1.本次实验为熟悉汇编程序及其调试方法的实验。2.实验内容包含2个文件bomb(可执行文件)和bomb.c(c源文件)。3.使用gdb工具反汇编出汇编代码,结合c语言文件找到每个关卡的入口函数。4.分析汇编代码,找到在每个phase程序段中,引导程序跳转到“explode_bomb”程序段的地方,并分析其成功跳转的条件,以此为突破口寻找应该在命令行输入何种字符通关。5.本实验一共有7个关卡,包括6个普通关卡和1个隐藏关卡。要求至少通过6个普通关卡。4、 实验内容及操作步骤(1) 准备过程1. 解压文件夹得到“bomb”,“bomb.c”,“README-bomblab.txt”以及“实验基本内容与要求.txt”等文档。查看“实验基本内容与要求.txt”了解实验内容与要求后打开bomb.c文件,编译发现不能通过,代码不完整,所以bomb.c文件只能用来作为参考。查看bomb.c文件发现控制密码正确的6个函数分别为phase_1,phase_2,phase_3,phase_4,phase_5,phase_6,因此可以对bomb文件反汇编得到汇编文本,结合汇编文本与bomb.c文本进一步分析。2. 进入Ubuntu,将bom和bomb.c文档复制到主文件目录下,ctrl+alt+t打开终端,通过“objdump -d bomb bomb.s”命令将可执行文件反汇编成bomb.s文件,并且可以通过“gdb -q bomb”进行调试。3. 将bomb.c复制成文本后打开bomb.c查看汇编代码并进一步分析。(2) 关卡分析1. phase_1phase_1汇编代码及注释如下:08048f61 : 8048f61:55 push %ebp 8048f62:89 e5 mov %esp,%ebp 8048f64:83 ec 18 sub $0x18,%esp#开辟一个24位的栈空间 8048f67:c7 44 24 04 5c a1 04 movl $0x804a15c,0x4(%esp)#将0x804a15c存到%eap+4的位置,x/s 0x804a15c 得到 We have to stand with our North Korean allies. 8048f6e:08 8048f6f:8b 45 08 mov 0x8(%ebp),%eax 8048f72:89 04 24 mov %eax,(%esp)#将%ebp+8处的值存到%esp 8048f75:e8 31 00 00 00 call 8048fab 8048f7a:85 c0 test %eax,%eax 8048f7c:74 05 je 8048f83 #%eax=0则跳出函数,否则跳到爆炸函数,可以看出,调用函数后如果两个字符串相等的话最后%eax会等于0 8048f7e:e8 4e 01 00 00 call 80490d1 8048f83:c9 leave 8048f84:c3 ret 8048f85:90 nop 8048f86:90 nop 8048f87:90 nop 8048f88:90 nop 8048f89:90 nop 8048f8a:90 nop 8048f8b:90 nop 8048f8c:90 nop 8048f8d:90 nop 8048f8e:90 nop 8048f8f:90 nop思路与分析: 通过call 8048fab 我们可以推断要求输入的是一串字符串,movl $0x804a15c,0x4(%esp)将地址0x804a15c存到%esp+4的位置,mov 0x8(%ebp),%eax和mov %eax,(%esp)将输入的字符串存到%esp中,call 8048fab 调用字符串比较函数,通过比较上面位置参数%esp+4与%esp对应的字符串是否相等,将返回值存到%eax中,test %eax,%eax,je 8048f83 ,call 80490d1 ,判断如果两个字符串不相等则爆炸。由上面分析可知地址0x804a15c中存着正确的字符串,我们只要输入相同的字符串就可以通过关卡。进入gdb,通过命令x/s 0x804a15c查看该字符串为:We have to stand with our North Korean allies.所以phase_1的通关密码为:We have to stand with our North Korean allies.通过 r 命令运行程序,输入该字符串则通过第一关:结论与心得:通过分析汇编代码,通过字符串比较函数可以推测输入的是一串字符串,通过x/s以字符串的形式查看地址0x804a15c所对应的值,运行程序后输入该字符串即可通过关卡。字符串比较函数主要是通过将两个字符串进行比较,将结果存到%eax中,最后判断%eax的值。第一关相对比较简单,也比较好理解。2. phase_2phase_2汇编代码及注释如下:08048d6a : 8048d6a:55 push %ebp 8048d6b:89 e5 mov %esp,%ebp 8048d6d:56 push %esi 8048d6e:53 push %ebx 8048d6f:83 ec 30 sub $0x30,%esp 8048d72:8d 45 e0 lea -0x20(%ebp),%eax 8048d75:89 44 24 04 mov %eax,0x4(%esp)#将第一个数字的地址放到%esp+4的位置 8048d79:8b 45 08 mov 0x8(%ebp),%eax 8048d7c:89 04 24 mov %eax,(%esp) 8048d7f:e8 87 03 00 00 call 804910b #读取六个数字 8048d84:83 7d e0 00 cmpl $0x0,-0x20(%ebp) 8048d88:75 06 jne 8048d90 #0和-0x20(%ebp)比较,不相等就爆炸 8048d8a:83 7d e4 01 cmpl $0x1,-0x1c(%ebp) 8048d8e:74 05 je 8048d95 #1和-0x1c(%ebp)比较,相等就跳过爆炸 8048d90:e8 3c 03 00 00 call 80490d1 8048d95:8d 5d e8 lea -0x18(%ebp),%ebx#将第三个数字的地址传到%ebx中,即现在%ebx中存着第三个数字的地址 8048d98:8d 75 f8 lea -0x8(%ebp),%esi#将%ebx的地址传到%esi,%esi用于待会的判断结束条件,%ebx存的地址一直循环加4,循环直到%ebx的下一个地址是%esi就结束】 8048d9b:8b 43 fc mov -0x4(%ebx),%eax#将第二个数放到%eax寄存器中 8048d9e:03 43 f8 add -0x8(%ebx),%eax#计算第二个数和第一个数的和 8048da1:39 03 cmp %eax,(%ebx) 8048da3:74 05 je 8048daa #前两个数的和与第三个数相比较,相等则跳过炸弹 8048da5:e8 27 03 00 00 call 80490d1 8048daa:83 c3 04 add $0x4,%ebx#将%ebx的地址加4,现在%ebx中存着第四个数字的地址 8048dad:39 f3 cmp %esi,%ebx 8048daf:75 ea jne 8048d9b #比较现在%esi和%ebx里面的值是否相等,不相等则循环,否则结束。其实两个寄存器中存的都是地址,为的是保证只输入6个数,因为当输入第7个数时,%ebx=%esi 8048db1:83 c4 30 add $0x30,%esp 8048db4:5b pop %ebx 8048db5:5e pop %esi 8048db6:5d pop %ebp#释放栈帧 8048db7:c3 ret思路与分析:通过call 804910b 我们可以推断出应该是要输入6个数字。通过对汇编代码进行分析知道-0x20(%ebp)存着第一个数字,-0x1c(%ebp)存着第二个数字,依次类推。通过cmpl $0x0,-0x20(%ebp),jne 8048d90 和cmpl $0x1,-0x1c(%ebp),je 8048d95 知道第一个数字必须是0,第二个数字必须是1,否则就爆炸。命令lea -0x18(%ebp),%ebx初始化寄存器%ebx的值,将第三个数字的地址传到%ebx中.lea -0x8(%ebp),%esi将%ebx的地址传到%esi,%esi用于待会的判断结束条件,%ebx存的地址一直循环加4,循环直到%ebx的下一个地址是%esi就结束,mov -0x4(%ebx),%eax将第二个数放到%eax寄存器中,add -0x8(%ebx),%eax计算第二个数和第一个数的和,cmp %eax,(%ebx),je 8048daa 前两个数的和与第三个数相比较,相等则跳过炸弹。add $0x4,%ebx将%ebx的地址加4,现在%ebx中存着第四个数字的地址,之后%ebx一直加4,知道循环完6个数字。通过上面的分析知道,输入的前两个数字为0和1,后面的数字等于前面两个数字的和。所以,这六个数字为Fibonacci数列的前六项。为0 1 1 2 3 5。输入这6个数字可通过phase_2.结论与心得:第二关需要弄懂栈帧结构的变化,通过add $0x4,%ebx将%ebx的地址加4,然后判断前两个数字的和与当前位置的数是否相等。结合第一个和第二个数字是0和1知道结果为0 1 1 2 3 5。3. phase_3phase_3汇编代码及注释如下:08048ea1 : 8048ea1:55 push %ebp 8048ea2:89 e5 mov %esp,%ebp 8048ea4:83 ec 28 sub $0x28,%esp 8048ea7:8d 45 f0 lea -0x10(%ebp),%eax#第二个数的位置 8048eaa:89 44 24 0c mov %eax,0xc(%esp) 8048eae:8d 45 f4 lea -0xc(%ebp),%eax#第一个数的位置 8048eb1:89 44 24 08 mov %eax,0x8(%esp) 8048eb5:c7 44 24 04 3e a2 04 movl $0x804a23e,0x4(%esp)#通过查看0x804a23e的内容,即x/s 0x804a23e,显示为%d %d,提示输入两个整型数 8048ebc:08 8048ebd:8b 45 08 mov 0x8(%ebp),%eax 8048ec0:89 04 24 mov %eax,(%esp) 8048ec3:e8 78 f9 ff ff call 8048840 #isoc99标准输入变量,应该是把输入的数字个数存在%eax里 8048ec8:83 f8 01 cmp $0x1,%eax 8048ecb:7f 05 jg 8048ed2 #至少输入2个数,否则爆炸 8048ecd:e8 ff 01 00 00 call 80490d1 8048ed2:83 7d f4 07 cmpl $0x7,-0xc(%ebp) 8048ed6:77 6b ja 8048f43 #第1个数大于7爆炸,所以,第一个数需要小于等于7 8048ed8:8b 45 f4 mov -0xc(%ebp),%eax将第一个数存到%eax中 8048edb:ff 24 85 a0 a1 04 08 jmp *0x804a1a0(,%eax,4)#跳转至0x804a1a0+4*%eax(存放第一个数)中的内容所指的行数p/x *0x804a1a0+4*%eax 8048ee2:b8 00 00 00 00 mov $0x0,%eax 8048ee7:eb 53 jmp 8048f3c 8048ee9:b8 00 00 00 00 mov $0x0,%eax 8048eee:66 90 xchg %ax,%ax 8048ef0:eb 45 jmp 8048f37 8048ef2:b8 00 00 00 00 mov $0x0,%eax#第一个数等于5的时候跳到这里 8048ef7:eb 39 jmp 8048f32 8048ef9:b8 00 00 00 00 mov $0x0,%eax#第一个数等于4的时候跳到这里 8048efe:66 90 xchg %ax,%ax 8048f00:eb 2b jmp 8048f2d 8048f02:b8 00 00 00 00 mov $0x0,%eax#第一个数等于4的时候跳到这里 8048f07:eb 1f jmp 8048f28 8048f09:b8 00 00 00 00 mov $0x0,%eax#第一个数等于2的时候跳到这里 8048f0e:66 90 xchg %ax,%ax 8048f10:eb 11 jmp 8048f23 8048f12:b8 14 03 00 00 mov $0x314,%eax#第一个数为0的时候跳到这里(p/x *0x804a1a0)首先x=778,最后第二个数等于147 8048f17:eb 05 jmp 8048f1e #跳转到 8048f1e 这一行 8048f19:b8 00 00 00 00 mov $0x0,%eax#第一个数等于1的时候跳到这里 8048f1e:2d 5a 03 00 00 sub $0x35a,%eax#x=x-858 8048f23:05 ef 02 00 00 add $0x2ef,%eax#x=x+751 8048f28:2d 16 02 00 00 sub $0x216,%eax#x=x-534 8048f2d:05 16 02 00 00 add $0x216,%eax#x=x+534 8048f32:2d 16 02 00 00 sub $0x216,%eax#x=x-534 8048f37:05 16 02 00 00 add $0x216,%eax#x=x+534 8048f3c:2d 16 02 00 00 sub $0x216,%eax#x=x-534 8048f41:eb 0a jmp 8048f4d #跳转到 8048f4d 这一行 8048f43:e8 89 01 00 00 call 80490d1 8048f48:b8 00 00 00 00 mov $0x0,%eax 8048f4d:83 7d f4 05 cmpl $0x5,-0xc(%ebp) 8048f51:7f 05 jg 8048f58 #第一个数字需要小于等于5,否则爆炸 8048f53:3b 45 f0 cmp -0x10(%ebp),%eax 8048f56:74 05 je 8048f5d #0,147; 1 -641;2,217; 3,-534; 4,0; 5,-534 8048f58:e8 74 01 00 00 call 80490d1 8048f5d:c9 leave 8048f5e:66 90 xchg %ax,%ax 8048f60:c3 ret思路与分析:观察到指令movl $0x804a23e,0x4(%esp),通过查看0x804a23e的内容,即x/s 0x804a23e,显示为%d %d,提示输入两个整型数。call 8048840 ,调用isoc99标准输入变量,是把输入的数字个数存在%eax里返回。通过cmp $0x1,%eax和jg 8048ed2 知道至少输入2个数,否则爆炸。通过cmpl $0x7,-0xc(%ebp)和ja 8048f43 知道第一个数字小于等于7,由cmpl $0x5,-0xc(%ebp)和jg 8048f58 知道输入的数字要小于等于5,所以输入的数字范围为0-5。jmp *0x804a1a0(,%eax,4)为switch分支结构,%eax存着输入的数字的值,当输入的数组是0的时候,查看*0x804a1a0的值,得到$1 = 0x8048f12,即跳转到0x8048f12处。当输入的数字为1-5时依次类推。得到的地址分别为:cmp -0x10(%ebp),%eax和je 8048f5d 即为判断经过一系列运算后求的值是否与正确的值相等。通过分析汇编代码,我们可以知道当输入不同的x值,等到的y值如下:当x=0时,y=788-858+751-534+534-534+534-534=147 当x=1时,y=-858+751-534+534-534+534-534=-641当x=2时,y=751-534+534-534+534-534=217 当x=3时,x=-534+534-534+534-534=-534 当x=4时,x=534-534+534-534=0 当x=5时,x=-534+534-534=-534所以可以输入六组数据:0 147;1 -641;2 217;3 -534;4 0;5 -534。随便输入一组都能通过炸弹。结论与心得:第三关主要用到了switch分支结构,根据输如的不同数字跳转到不同位置进行不同的运算,最后得到结果。首先分析输入数字的范围,然后通过判断跳转的位置来准确计算。4.phase_4phase_4汇编代码及注释如下:08048e2e : 8048e2e:55 push %ebp 8048e2f:89 e5 mov %esp,%ebp 8048e31:83 ec 28 sub $0x28,%esp#开辟栈空间 8048e34:8d 45 f0 lea -0x10(%ebp),%eax#第二个数字 8048e37:89 44 24 0c mov %eax,0xc(%esp) 8048e3b:8d 45 f4 lea -0xc(%ebp),%eax#第一个数字 8048e3e:89 44 24 08 mov %eax,0x8(%esp) 8048e42:c7 44 24 04 3e a2 04 movl $0x804a23e,0x4(%esp)#输入x/s 0x804a23e 显示为%d %d,提示输入两个整型数字 8048e49:08 8048e4a:8b 45 08 mov 0x8(%ebp),%eax 8048e4d:89 04 24 mov %eax,(%esp) 8048e50:e8 eb f9 ff ff call 8048840 #标准输入变量,将输入的数字个数存在%eax中 8048e55:83 f8 02 cmp $0x2,%eax 8048e58:75 0c jne 8048e66 #要求输入2个数字,即输入的数字个数不等于2则爆炸 8048e5a:8b 45 f4 mov -0xc(%ebp),%eax#将第一个数放到%eax中 8048e5d:85 c0 test %eax,%eax 8048e5f:78 05 js 8048e66 #判断第一个数,如果是负数就爆炸,所以需要%eax=0 8048e61:83 f8 0e cmp $0xe,%eax 8048e64:7e 05 jle 8048e6b #比较第一个数和14(0xe)的大小,如果%eax=14,则继续执行,否则爆炸 8048e66:e8 66 02 00 00 call 80490d1 8048e6b:c7 44 24 08 0e 00 00 movl $0xe,0x8(%esp)#将0xe存到%esp+8 8048e72:00 8048e73:c7 44 24 04 00 00 00 movl $0x0,0x4(%esp)#将0x0存到%esp+4 8048e7a:00 8048e7b:8b 45 f4 mov -0xc(%ebp),%eax 8048e7e:89 04 24 mov %eax,(%esp)#将第一个数存到%esp 8048e81:e8 da fc ff ff call 8048b60 #调用func4函数(递归函数) 8048e86:83 f8 01 cmp $0x1,%eax#函数的返回值y存放在%eax寄存器中 8048e89:75 06 jne 8048e91 #y要等于1,否则爆炸 8048e8b:83 7d f0 01 cmpl $0x1,-0x10(%ebp) 8048e8f:74 0c je 8048e9d #第二个数要等于1,否则爆炸 8048e91:8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi 8048e98:e8 34 02 00 00 call 80490d1 8048e9d:c9 leave 8048e9e:66 90 xchg %ax,%ax 8048ea0:c3 ret call 8048b60 知道要调用func4函数。func4汇编代码及注释如下:08048b60 : 8048b60:55 push %ebp 8048b61:89 e5 mov %esp,%ebp 8048b63:83 ec 18 sub $0x18,%esp#建立一个栈帧 8048b66:89 5d f8 mov %ebx,-0x8(%ebp) 8048b69:89 75 fc mov %esi,-0x4(%ebp) 8048b6c:8b 55 08 mov 0x8(%ebp),%edx#%edx-x 8048b6f:8b 45 0c mov 0xc(%ebp),%eax#%eax-y=0x0=0 8048b72:8b 5d 10 mov 0x10(%ebp),%ebx#%ebx-z=0xe=14func4(x,y,z) 8048b75:89 d9 mov %ebx,%ecx#计算临时变量t的过程,#t=z 8048b77:29 c1 sub %eax,%ecx#t=z-y 8048b79:89 ce mov %ecx,%esi#t=z-y 8048b7b:c1 ee 1f shr $0x1f,%esi#t=(z-y)31,逻辑右移31位 8048b7e:8d 0c 0e lea (%esi,%ecx,1),%ecx#t=(z-y)31+(z-y) 8048b81:d1 f9 sar %ecx#t=(z-y)31+(z-y)1 8048b83:01 c1 add %eax,%ecx#t=(z-y)31+(z-y)/2+y=(1431+14)/2+0=7 8048b85:39 d1 cmp %edx,%ecx#将7和x(第一个数)比较,即7-x 8048b87:7e 17 jle 8048ba0 #当7x) 8048b8c:89 4c 24 08 mov %ecx,0x8(%esp)#将t-1移到0x8(%esp),z=t-1 8048b90:89 44 24 04 mov %eax,0x4(%esp)#y 8048b94:89 14 24 mov %edx,(%esp)#x 8048b97:e8 c4 ff ff ff call 8048b60 #递归 8048b9c:01 c0 add %eax,%eax#y=2*y,将结果存放到%eax中 8048b9e:eb 20 jmp 8048bc0 #结束 8048ba0:b8 00 00 00 00 mov $0x0,%eax#if(x=7)时就跳转到这里,此时令y=0 8048ba5:39 d1 cmp %edx,%ecx 8048ba7:7d 17 jge 8048bc0 #如果t=x(在这种情况下只能x=t),则跳转到8048bc0,否则继续执行 8048ba9:89 5c 24 08 mov %ebx,0x8(%esp)#z 8048bad:83 c1 01 add $0x1,%ecx#y=t+1 8048bb0:89 4c 24 04 mov %ecx,0x4(%esp)y=t+1 8048bb4:89 14 24 mov %edx,(%esp)#x 8048bb7:e8 a4 ff ff ff call 8048b60 #递归 8048bbc:8d 44 00 01 lea 0x1(%eax,%eax,1),%eax#y=z*y+1,将结果存到%eax中 8048bc0:8b 5d f8 mov -0x8(%ebp),%ebx#if(t=x)跳转到这里 8048bc3:8b 75 fc mov -0x4(%ebp),%esi 8048bc6:89 ec mov %ebp,%esp 8048bc8:5d pop %ebp 8048bc9:c3 ret思路与分析:首先分析phase_4汇编代码。movl $0x804a23e,0x4(%esp)输入x/s 0x804a23e 显示为%d %d,提示输入两个整型数字。call 8048840 ,cmp $0x2,%eax,jne 8048e66 任然要求输入2个数字。通过mov -0xc(%ebp),%eax,test %eax,%eax,js 8048e66 知道第一个数为非负数。由cmp $0xe,%eax和jle 8048e6b 又可以知道第一个数字要小于等于14。之后分析func4函数,分别用%esp,0x4(%esp),%0x8(%esp)传递三个参数,设为x,y,z。参数y存储在寄存器%eax中并作为最终的返回值,最终结果为1,也就是n的值;参数x和z存储于寄存器%edx和%ebx中,并通堆栈指针来保存或改变(配合其他指令)。在func4中进一步缩小了第一个数字的范围。现在需要第一个数字的范围为7-14。通过分析func4汇编代码,可以得到如下的c代码:#include#int x,y,z,ret;#int func4()#int t=(z-y)31+(z-y)/2+y;#if(tx)#z=t-1;#func4();#y=z*y;#else#y=0;#if(t=x)#return y;#y=t+1;#func4();#y=2*y+1;#int main()#for(x=0;x=0xe;x+)#y=0;#z=0xe;#ret=func4();#if(ret=1)#printf(m=%d,n=%dn,x,ret)#return 0;# 第二个数必须为1。经过分析可以有三组数。分别是:8 1;9 1;11 1。任意输入一组数就能通过关卡。结论与心得:这一关中在函数里调用了另外一个函数func4,func4函数中运用到了线性递归。通过分析汇编代码可以写出相应的c代码,通过分析第一个数范围在7-14,第二个数必须为1,结合c代码可以得出结果。5.phase_5phase_5汇编代码及注释如下:08048db8 : 8048db8:55 push %ebp 8048db9:89 e5 mov %esp,%ebp 8048dbb:56 push %esi 8048dbc:53 push %ebx 8048dbd:83 ec 20 sub $0x20,%esp#开辟栈空间 8048dc0:8d 45 f0 lea -0x10(%ebp),%eax 8048dc3:89 44 24 0c mov %eax,0xc(%esp)#第二个数 8048dc7:8d 45 f4 lea -0xc(%ebp),%eax 8048dca:89 44 24 08 mov %eax,0x8(%esp)#第一个数 8048dce:c7 44 24 04 3e a2 04 movl $0x804a23e,0x4(%esp)#输入x/s 0x804a23e 显示为%d %d,提示输入两个整型数字 8048dd5:08 8048dd6:8b 45 08 mov 0x8(%ebp),%eax 8048dd9:89 04 24 mov %eax,(%esp) 8048ddc:e8 5f fa ff ff call 8048840 #将输入的数字个数返回到%eax中 8048de1:83 f8 01 cmp $0x1,%eax 8048de4:7f 05 jg 8048deb #若输入的数字个数大于1则跳转,否则爆炸,所以至少输入两个数字 8048de6:e8 e6 02 00 00 call 80490d1 8048deb:8b 45 f4 mov -0xc(%ebp),%eax 8048dee:83 e0 0f and $0xf,%eax#第一个数 “与” 0xf,这个操作可以只保留第一个数的二进制后四位(0“与”任何数都为0) 8048df1:89 45 f4 mov %eax,-0xc(%ebp)#经过上面的操作后再把第一个数放回原来的位置(只保留二进制表示的后四位) 8048df4:83 f8 0f cmp $0xf,%eax 8048df7:74 29 je 8048e22 #比较,如果第一个数和0xf(1111)相等则爆炸,说明第一个数的二进制后四位不能为“1111”,否则爆炸 8048df9:b9 00 00 00 00 mov $0x0,%ecx#%ecx=0;用来累加%eax,初始化为0 8048dfe:ba 00 00 00 00 mov $0x0,%edx#%edx=0;循环次数,初始化为0 8048e03:bb c0 a1 04 08 mov $0x804a1c0,%ebx#p *0x804a1c0=10,这个地址为数组的首地址,求的值为第
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2030年中国绝热隔音材料行业十三五发展规划及投资需求分析报告
- 2024-2030年中国糖果、巧克力行业竞争策略及投资盈利预测报告
- 2024-2030年中国粉状氧化铜行业发展状况规划分析报告
- 2024-2030年中国窗帘装饰材料项目可行性研究报告
- 2024-2030年中国福建省小水电行业发展前景预测规划分析报告
- 春季高考职业教育升学班校企合作方案
- 2024-2030年中国石英坩埚行业前景预测发展策略分析报告
- 2024全新家具定制与维修服务的2024年度合同范本
- 工业园区混凝土挡土墙施工方案
- 2024年建筑项目全面劳务清包合同模板
- 装修垃圾清运处置方案
- JC-T 2536-2019水泥-水玻璃灌浆材料
- 品牌授权协议书
- 艺术设计就业职业生涯规划
- 《狙击手》和《新神榜杨戬》电影赏析
- 枪库应急处置预案
- 老年患者术后谵妄的护理干预
- 《凸透镜成像的规律》课件
- 仓库管理中的客户服务和沟通技巧
- 规划选址及用地预审
- 土砂石料厂项目融资计划书
评论
0/150
提交评论