版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程实验报告 课 程 名 称: 计算机系统原理实验 实验项目名称: bomblab 专 业 班 级: 计科1501 姓 名: 马子垚 学 号: 201508010114 完 成 时 间: 2017 年 4 月 19 日实验目的理解汇编语言,学会使用调试器实验原理二进制炸弹是作为一个目标代码文件提供给学生们的程序,运行时,它提示用户输入6个不同的字符串。如果其中任何一个不正确,炸弹就会“爆炸”:打印出一条错误信息。学生通过反汇编和逆向工程来确定是哪六个字符串,从而解除他们各自炸弹的雷管。实验步骤及体会一、 实验准备1、 首先,由于虚拟机操作系统与windows系统相互独立,所以首先将bomb.c
2、及其相关文件存至百度云盘,然后在ubantu操作系统内下载至文件系统目录下的下载文件夹里面:2、 输入./bomb试运行bomb.c文件时会提示权限不够:所以需要输入chmod+x+文件名的命令于改变文件或目录的访问权限。用它控制文件或目录的访问权限。在经过操作之后,获得了权限,程序可以正常运行了:3、 由于bomb.c文件并没有蕴含许多能破解的信息,所以需要将其进行反汇编,详细操作如下:输入objdump d bomb bomb.txt将汇编代码输出到自动生成一个bomb.txt的文件里面,方便我们查看与分析代码:二、 具体实验步骤及其分析试查看导出的bomb.txt,我发现总的文本里面分为
3、很多段,其中就有phase_1phase_6、phase_defuse、phase_secret以及其他相关函数的代码,所以我猜测每一段phase代码就是我们需要破解的关卡,所以我将它们分别导出新建text文件,逐段分析。phase_1及其破解过程:知识点:string,函数调用,栈反汇编代码及其分析:08048f61 : 8048f61:55 push %ebp/压栈 ebp为栈指针 esp为栈指针。push指令可以理解为两个步骤:1. subl $4 , %esp 栈底向下移一位2. movl %ebp ,(%esp) 将ebp的值存入esp中 8048f62:89 e5 mov %esp
4、,%ebp/把esp赋值给ebp 8048f64:83 ec 18 sub $0x18,%esp/esp指针下移0x18个字节8048f67:c7 44 24 04 5c a1 04 movl $0x804a15c,0x4(%esp)/取0x804a15c处的内容存入*(%esp+4)/前一段总的分析:初始化栈,push是压栈指令,ebp寄存器中的内容是栈底指针。esp寄存器里面存的是栈顶地址。通过sub指令,将栈顶固定在第十八个存储单元里面。字符串的内存地址为0804a15c,四个字节。一个存储单元存放8个bit两个十六进制数字,栈顶及后三个单元存栈顶地址。故用mov指令将字符串地址存在栈顶
5、后的第四个字节处。 8048f6e:08 8048f6f:8b 45 08 mov 0x8(%ebp),%eax/取用户输入的内容存入%ebp 8048f72:89 04 24 mov %eax,(%esp)/eax的值赋值给*esp8048f75:e8 31 00 00 00 call 8048fab /调用字符串比较函数,string_not_equal就提示需要比较两个字符串,通过gcc函数调用规范知道压入堆栈的两个参数分别为输入字符串与程序内部字符串。函数的时候,必须返回%eax为0,而这个函数的作用就是判断字符串是否相等。8048f7a:85 c0 test %eax,%eax/ t
6、est执行的就是and的指令,不会保存and执行的结果,而是根据and的结果设置flags寄存器的各种标志。 8048f7c:74 05 je 8048f83 / je指令:当zf等于零的时候跳转,也就是相等的时候跳转。判断%eax是否为0,为0跳转,不为0引爆 8048f7e:e8 4e 01 00 00 call 80490d1 8048f83:c9 leave/为结束函数做准备 8048f84:c3 ret / 返回。ret:不带任何参数时,用于在子程序的结束位置,被调用的子程序必须有ret指令,否则调用没有ret指令的子程序会导致自陷,子程序执行完之后处于失控状态。带参数ret n 表
7、示子程序返回主程序的同时,堆栈弹出n个字节(栈顶指针减n)具体操作: 读取0x804a15c内存的字符串(密码),并设置断点。成功读取到字符串,作为密码输入:第一关成功破解程序流程:1、取内存地址0x8049a04处的内容;2、取用户输入的内容(即密码);3、比较两者的值,相等则%eax置为0,进入下一关,不相等则调用引爆程序引爆炸弹。phase_2及其破解过程:知识点:循环语句,数组08048d6a : 8048d6a:55 push %ebp 8048d6b:89 e5 mov %esp,%ebp 8048d6d:56 push %esi 8048d6e:53 push %ebx 8048
8、d6f:83 ec 30 sub $0x30,%esp 8048d72:8d 45 e0 lea -0x20(%ebp),%eax/ lea:取偏移地址将一个数的内存单元的偏移地址,送入寄存器中存储,与mov不同的是mov是将该数当作一个偏移地址存入寄存器,没有寻址的功能。 8048d75:89 44 24 04 mov %eax,0x4(%esp)/取用户输入的内容,存入%ebp 8048d79:8b 45 08 mov 0x8(%ebp),%eax 8048d7c:89 04 24 mov %eax,(%esp)/前面几行均为初始化栈操作8048d7f:e8 87 03 00 00 cal
9、l 804910b /调用函数read_six_numbers(说明密码是6个数字)8048d84:83 7d e0 00 cmpl $0x0,-0x20(%ebp)/比较第一个输入的的数是否为08048d88:75 06 jne 8048d90 /若不为0(jne看出)则跳转下一步(爆炸)/比较第二个输入的的数是否为1 8048d8a:83 7d e4 01 cmpl $0x1,-0x1c(%ebp)/若为1(je)则跳转下一步(8048d95) 8048d8e:74 05 je 8048d95 8048d90:e8 3c 03 00 00 call 80490d1 8048d95:8d 5
10、d e8 lea -0x18(%ebp),%ebx 8048d98:8d 75 f8 lea -0x8(%ebp),%esi 8048d9b:8b 43 fc mov -0x4(%ebx),%eax/下一个数必须是前两个数之和 8048d9e:03 43 f8 add -0x8(%ebx),%eax 8048da1:39 03 cmp %eax,(%ebx)/若为前两个数之和则跳转下一步(8048daa),否则爆炸 8048da3:74 05 je 8048daa 8048da5:e8 27 03 00 00 call 80490d1 8048daa:83 c3 04 add $0x4,%eb
11、x 8048dad:39 f3 cmp %esi,%ebx/回到8048d9b,相当于一个循环, esi和edx都是地址寄存器,首先将两个地址比较,当他们相同的时候,就一直向下,否则跳转。 8048daf:75 ea jne 8048d9b 8048db1:83 c4 30 add $0x30,%esp 8048db4:5b pop %ebx 8048db5:5e pop %esi 8048db6:5d pop %ebp 8048db7:c3 ret 总体上看,这一关让我们输入的是以0为首项的fibonacc数列。密码: 0 1 1 2 3 5故在第一个的基础上:程序流程:1.读取用户输入内容
12、(为6个数字);2.判断输入的第一个值是否为0,不是则引爆炸弹;3.判断输入的第一个值是否为1,不是则引爆炸弹;3.做一个6次循环,判断后一个数是否等于前两个数之和,不是则引爆炸弹;4.六个数字判断相等结束后,进入下一关phase_3及其破解过程:知识点:switch语句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/用户输入的参数2存在*(%ebp-10) 8048ea
13、a:89 44 24 0c mov %eax,0xc(%esp)/用户输入的参数1存在*(%ebp-c) 8048eae:8d 45 f4 lea -0xc(%ebp),%eax 8048eb1:89 44 24 08 mov %eax,0x8(%esp)/取出地址0x804a23e中的内容 8048eb5:c7 44 24 04 3e a2 04 movl $0x804a23e,0x4(%esp) 8048ebc:08 8048ebd:8b 45 08 mov 0x8(%ebp),%eax 8048ec0:89 04 24 mov %eax,(%esp) 8048ec3:e8 78 f9 f
14、f ff call 8048840 /调用sscanf函数,传入输入参数,scanf函数调用之后可能导致eax里面的保存的数据发生改变。 8048ec8:83 f8 01 cmp $0x1,%eax/scanf读入数据流之后,%eax寄存的是读入数据的个数。8048ecb:7f 05 jg 8048ed2 8048ecd:e8 ff 01 00 00 call 80490d1 8048ed2:83 7d f4 07 cmpl $0x7,-0xc(%ebp) /必须-0xc(%ebp)的值小于7,否则爆炸 8048ed6:77 6b ja 8048f43 8048ed8:8b 45 f4 mov
15、 -0xc(%ebp),%eax/相当于switch(a) 8048edb:ff 24 85 a0 a1 04 08 jmp *0x804a1a0(,%eax,4)/跳转到以地址*0x804a1a0为基址的跳转表中 8048ee2:b8 00 00 00 00 mov $0x0,%eax8048ee7:eb 53 jmp 8048f3c 8048ee9:b8 00 00 00 00 mov $0x0,%eax 8048eee:66 90 xchg %ax,%ax8048ef0:eb 45 jmp 8048f37 8048ef2:b8 00 00 00 00 mov $0x0,%eax8048e
16、f7:eb 39 jmp 8048f32 8048ef9:b8 00 00 00 00 mov $0x0,%eax8048efe:66 90 xchg %ax,%ax8048f00:eb 2b jmp 8048f2d 8048f02:b8 00 00 00 00 mov $0x0,%eax8048f07:eb 1f jmp 8048f28 8048f09:b8 00 00 00 00 mov $0x0,%eax 8048f0e:66 90 xchg %ax,%ax8048f10:eb 11 jmp 8048f23 8048f12:b8 14 03 00 00 mov $0x314,%eax80
17、48f17:eb 05 jmp 8048f1e 8048f19:b8 00 00 00 00 mov $0x0,%eax 8048f1e:2d 5a 03 00 00 sub $0x35a,%eax 8048f23:05 ef 02 00 00 add $0x2ef,%eax 8048f28:2d 16 02 00 00 sub $0x216,%eax 8048f2d:05 16 02 00 00 add $0x216,%eax 8048f32:2d 16 02 00 00 sub $0x216,%eax 8048f37:05 16 02 00 00 add $0x216,%eax 8048f
18、3c:2d 16 02 00 00 sub $0x216,%eax8048f41:eb 0a jmp 8048f4d 8048f43:e8 89 01 00 00 call 80490d1 8048f48:b8 00 00 00 00 mov $0x0,%eax/输入的第一个数字必须小于5,否则爆炸 8048f4d:83 7d f4 05 cmpl $0x5,-0xc(%ebp)8048f51:7f 05 jg 8048f58 /表示输入的第二个数字必须等于第一个数经过数次运算的结果 8048f53:3b 45 f0 cmp -0x10(%ebp),%eax/成功跳出 8048f56:74 0
19、5 je 8048f5d 8048f58:e8 74 01 00 00 call 80490d1 8048f5d:c9 leave 8048f5e:66 90 xchg %ax,%ax 8048f60:c3 ret 帧堆栈数据记录表:具体分析:由movl $0x804a23e,0x4(%esp),用gdb查看0x804a23e的值发现这个应该是要求输入两个数字jmp *0x804a1a0(,%eax,4)首先,看到这个语句不知道是什么意思,搜索也搜索不到这段地址。后来通过百度,发现这是一个基于跳转表的switch语句的汇编描述,后来决定自己编写一个switch语句去运行,理解了switch语句
20、在汇编中的表达方式。 当第一个数输入0时 去查看*0x804a1a0+4*0=*0x804a1a0的值所以会跳转到0x8048f12那行代码中则后面的运算为0x(314-35a+2ef-216).转换为十进制为147。故输入0 147得到结果(接第二个炸弹)同理: 输入1运算得到1 -641 输入2运算得到2 217(运行结果略) 输入3运算得到3 534(运行结果略) 输入4运算得到4 0(运行结果略)程序流程:1.读取输入参数1和参数2,调用ssanf函数传入两个参数;2.比较参数1与7的大小,小于等于7继续,大于7引爆;3.根据参数1的值来搜索跳转地址,计算得到最终的%eax;4.比较参
21、数1与5的大小,小于等于5继续,大于5引爆;5.比较参数2与计算得到的%eax是否相等,相等则进入下一关,不相等则引爆。phase_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
22、24 08 mov %eax,0x8(%esp) 8048e42:c7 44 24 04 3e a2 04 movl $0x804a23e,0x4(%esp) 8048e49:08 8048e4a:8b 45 08 mov 0x8(%ebp),%eax 8048e4d:89 04 24 mov %eax,(%esp)/调用sscanf函数,传入输入参数 8048e50:e8 eb f9 ff ff call 8048840 8048e55:83 f8 02 cmp $0x2,%eax/输入的为两个数据,否则引爆 8048e58:75 0c jne 8048e66 8048e5a:8b 45 f
23、4 mov -0xc(%ebp),%eax 8048e5d:85 c0 test %eax,%eax/第一个数字为负数则跳转至爆炸 8048e5f:78 05 js 8048e66 8048e61:83 f8 0e cmp $0xe,%eax/第一个数字必须小于14则跳转,否则继续运行至爆炸 8048e64:7e 05 jle 8048e6b 8048e66:e8 66 02 00 00 call 80490d1 8048e6b:c7 44 24 08 0e 00 00 movl $0xe,0x8(%esp) 8048e72:00 8048e73:c7 44 24 04 00 00 00 mo
24、vl $0x0,0x4(%esp) 8048e7a:00 8048e7b:8b 45 f4 mov -0xc(%ebp),%eax 8048e7e:89 04 24 mov %eax,(%esp)/调用func4函数 8048e81:e8 da fc ff ff call 8048b60 /当phase_4调用func4时,phase_4中的返回地址被压入栈中,形成phase4的栈帧的末尾。func4从保存栈指针的值开始。 8048e86:83 f8 01 cmp $0x1,%eax 8048e89:75 06 jne 8048e91 8048e8b:83 7d f0 01 cmpl $0x1
25、,-0x10(%ebp)/第二个数不为1则跳转8048e91(爆炸)/为1则成功跳出 8048e8f:74 0c je 8048e9d 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 与之前一样 由movl $0x804a23e,0x4(%esp)句来得到要求,要求输入两个数字分析题目 设要求输入的两个数字为x,y,则0=x14,y=1.调用fu
26、nc4函数,故查看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)/%ebx、%esi是被调用者保存寄存器,func4函数在使用这些寄存器的值之前,必须把他们保存到栈中,并且在返回前回复他们,在本题中保存的这些值没有实际用途。 8048b6c:8b 55 08 mov 0x8(%ebp),%edx
27、8048b6f:8b 45 0c mov 0xc(%ebp),%eax 8048b72:8b 5d 10 mov 0x10(%ebp),%ebx 8048b75:89 d9 mov %ebx,%ecx 8048b77:29 c1 sub %eax,%ecx 8048b79:89 ce mov %ecx,%esi/ shr是逻辑右移指令 8048b7b:c1 ee 1f shr $0x1f,%esi 8048b7e:8d 0c 0e lea (%esi,%ecx,1),%ecx8048b81:d1 f9 sar %ecx/sar是算数右移指令,只移位一位,算术右移补最高位 8048b83:01
28、c1 add %eax,%ecx 8048b85:39 d1 cmp %edx,%ecx 8048b87:7e 17 jle 8048ba0 8048b89:83 e9 01 sub $0x1,%ecx 8048b8c:89 4c 24 08 mov %ecx,0x8(%esp) 8048b90:89 44 24 04 mov %eax,0x4(%esp) 8048b94:89 14 24 mov %edx,(%esp) 8048b97:e8 c4 ff ff ff call 8048b60 8048b9c:01 c0 add %eax,%eax 8048b9e:eb 20 jmp 8048b
29、c0 8048ba0:b8 00 00 00 00 mov $0x0,%eax 8048ba5:39 d1 cmp %edx,%ecx 8048ba7:7d 17 jge 8048bc0 8048ba9:89 5c 24 08 mov %ebx,0x8(%esp) 8048bad:83 c1 01 add $0x1,%ecx 8048bb0:89 4c 24 04 mov %ecx,0x4(%esp) 8048bb4:89 14 24 mov %edx,(%esp)/递归调用函数func4 8048bb7:e8 a4 ff ff ff call 8048b60 8048bbc:8d 44 00
30、 01 lea 0x1(%eax,%eax,1),%eax 8048bc0:8b 5d f8 mov -0x8(%ebp),%ebx 8048bc3:8b 75 fc mov -0x4(%ebp),%esi 8048bc6:89 ec mov %ebp,%esp 8048bc8:5d pop %ebp 8048bc9:c3 ret 帧堆栈数据记录表:phase_4:fun4:第一次调用fun4(),edx为输入的x值,eax=0,ebx=14;根据整个fun4()函数,当x7。当输入为8,ecx=7减去1变为6,然后自己调用自己,即为递归函数,此时新的edx=8不变,eax=0不变,ebx=6
31、。根据跟随代入法,最后可以总结成c语言代码:分析过程:转化成的c代码:将机器语言转化为c代码我们可以更直观的来判断和推导未知数的值,的出的结论是这是一个二分法求值。当且仅当下端和中值相等的时候才退出递归过程,只可能出现在上半区,这题有多解。由此可见,当输入8 1或者9 1或者11 1时,可避开炸弹。主程序流程:1. 读取参数,调用sscanf函数传入参数;2. 比较输入参数与0的大小,小于等于则引爆;3. 把输入参数传入函数func4,并调用函数func4;4. 若第二个数等于1,则返回,进入下一关,否则引爆炸弹。phase_5及其破解过程:知识点:循环08048db8 : 8048db8:5
32、5 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
33、a2 04 movl $0x804a23e,0x4(%esp) 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 /输入数据多于1组,否则引爆 8048de1:83 f8 01 cmp $0x1,%eax 8048de4:7f 05 jg 8048deb 8048de6:e8 e6 02 00 00 call 80490d1 8048deb:8b 45 f4 mov -0xc(%ebp),%eax/将%eax中的数
34、字取后4位,前面全部用0代替,推导得出后四位必须是1001,所以这题具有多解。 8048dee:83 e0 0f and $0xf,%eax 8048df1:89 45 f4 mov %eax,-0xc(%ebp)/第一个数二进制后四位不能为(1111)2,否则引爆。 8048df4:83 f8 0f cmp $0xf,%eax 8048df7:74 29 je 8048e22 8048df9:b9 00 00 00 00 mov $0x0,%ecx 8048dfe:ba 00 00 00 00 mov $0x0,%edx 8048e03:bb c0 a1 04 08 mov $0x804a1
35、c0,%ebx/以下五行为一个for循环语句 8048e08:83 c2 01 add $0x1,%edx/%ebx+4赋值给%edx 8048e0b:8b 04 83 mov (%ebx,%eax,4),%eax 8048e0e:01 c1 add %eax,%ecx 8048e10:83 f8 0f cmp $0xf,%eax 8048e13:75 f3 jne 8048e08 8048e15:89 45 f4 mov %eax,-0xc(%ebp)/上述的for循环要循环15次 8048e18:83 fa 0f cmp $0xf,%edx/否则爆炸 8048e1b:75 05 jne 8
36、048e22 8048e1d:39 4d f0 cmp %ecx,-0x10(%ebp) /确定第二个数的值 8048e20:74 05 je 8048e27 8048e22:e8 aa 02 00 00 call 80490d1 8048e27:83 c4 20 add $0x20,%esp 8048e2a:5b pop %ebx 8048e2b:5e pop %esi 8048e2c:5d pop %ebp 8048e2d:c3 ret 帧堆栈数据记录表:与之前一样 由movl $0x804a23e,0x4(%esp)句来得到要求,要求输入两个数字由mov $0x804a1c0,%ebx找
37、到跳转指令,循环十五次将这个for循环写出:设i在%edx中,数组a16在%ebx中,n在%eax中,sum在%ecx中。sum=0;for(i=1;n=15;i+)n=an;sum+=n;数组编号0123456789101112131415数组内值1021478121511041133965循环中,前一个数字的值为后一个数字的数组编号。且最后一个数为15,故反推出循环为:5123711139480101214615由于eax=输入的第一个数&0xf,所以,第一个数可以是5,也可以是21,37,53等等。而第二个数需要等于循环结束后的eax的总和:12+3+7+11+13+9+4+8+0+10
38、+1+2+14+6+15=115,所以第二个数为115。运行结果:将eax中的数字取后4位,前面全部用0代替,推导得出后四位必须是1001,所以这题具有多解。证明:用21(0x15)测试,测试结果为:(前面用 5 15测试也可以通过)可以得出,只要后四位为5,前面的无论是多少,都可以通过第五关,证明了我的猜想是正确的。phase_6及其破解过程:知识点:链表及寻址08048c89 : 8048c89:55 push %ebp 8048c8a:89 e5 mov %esp,%ebp 8048c8c:57 push %edi 8048c8d:56 push %esi 8048c8e:53 push
39、 %ebx 8048c8f:83 ec 5c sub $0x5c,%esp 8048c92:8d 45 d0 lea -0x30(%ebp),%eax 8048c95:89 44 24 04 mov %eax,0x4(%esp) 8048c99:8b 45 08 mov 0x8(%ebp),%eax 8048c9c:89 04 24 mov %eax,(%esp)/又是输入六个数字 8048c9f:e8 67 04 00 00 call 804910b 8048ca4:be 00 00 00 00 mov $0x0,%esi 8048ca9:8d 7d d0 lea -0x30(%ebp),%edi 8048cac:8b 04 b7 mov (%edi,%esi,4),%eax/eax- 8048caf:83 e8 01 sub $0x1,%eax/eax小于等于5跳过炸弹,即第esi+1个数小于等于6 8048cb2:83 f8 05 cmp $0x5,%eax 8048cb5:76 05 jbe 8048cbc 8048cb7:e8 15 04 00 00 call 80490d1 8048c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年动火作业审批管理人员理论考核试卷答案
- 2026年《民用航空机场商业服务管理规定》题库及答案
- 防范意外伤害强化自我保护小学主题班会课件
- 第4课《古代诗歌四首-观沧海》导学单 统编版语文七年级上册(学案)
- 2026年家居用品展参展邀请回应函6篇
- 2026年高端定制家具系列上市函5篇
- 老年大学书法教育基本笔画规范指导书
- 爱国主义教育与社会责任意识培养共融的小学主题班会课件
- 安全合规项目检查会议确认函(3篇)
- 关于市场合作协议的解除声明(3篇)范文
- TCSAE《摩托车和轻便摩托车操纵稳定性试验方法》编制说明
- 呼吸道六联检分子检测诊断价值
- aed急救培训课件
- DZ/T 0275.5-2015岩矿鉴定技术规范第5部分:矿石光片鉴定
- 严重精神障碍家庭护理教育
- 宠物招聘面试题及答案
- 内悬浮内拉线铁塔组立施工方案
- 电缆更换工程方案(2025修订版)投标文件(技术方案)
- 南方全站仪NTS-332R说明书
- 137案例黑色三分钟生死一瞬间事故案例文字版
- DL-T+932-2019凝汽器与真空系统运行维护导则
评论
0/150
提交评论