CMU-CSAPP-Lab2拆解二进制炸弹

一、 实验目的

1.理解C语言程序的机器级表示。

2.初步掌握GDB调试器的用法。

3.阅读C编译器生成的x86-64机器代码,理解不同控制结构生成的基本指令模式,过程的实现。

二、实验工具

  1. SecureCRT
  2. Linux
  3. Objdump命令反汇编
  4. GDB调试工具

三、实验内容

登录bupt1服务器,在home目录下可以找到Evil博士专门为你量身定制的一个bomb,当运行时,它会要求你输入一个字符串,如果正确,则进入下一关,继续要求你输入下一个字符串;否则,炸弹就会爆炸,输出一行提示信息并向计分服务器提交扣分信息。因此,本实验要求你必须通过反汇编和逆向工程对bomb执行文件进行分析,找到正确的字符串来解除这个的炸弹。

本实验通过要求使用课程所学知识拆除一个“binary bombs”来增强对程序的机器级表示、汇编语言、调试器和逆向工程等方面原理与技能的掌握。 “binary bombs”是一个Linux可执行程序,包含了5个阶段(或关卡)。炸弹运行的每个阶段要求你输入一个特定字符串,你的输入符合程序预期的输入,该阶段的炸弹就被拆除引信;否则炸弹“爆炸”,打印输出 “BOOM!!!”。炸弹的每个阶段考察了机器级程序语言的一个不同方面,难度逐级递增。

为完成二进制炸弹拆除任务,需要使用gdb调试器和objdump来反汇编bomb文件,可以单步跟踪调试每一阶段的机器代码,也可以阅读反汇编代码,从中理解每一汇编语言代码的行为或作用,进而设法推断拆除炸弹所需的目标字符串。实验2的具体内容见实验2说明。

四、实验步骤及实验分析

1、反汇编并利用SSH Secure Shell Client工具下载反汇编代码

通过ls指令显示当前目录下的文件,找到压缩包bomb115.tar,即目标炸弹。通过tar xvf bomb115.tar解压此压缩包,然后再通过ls显示解压出的文件:bomb、bomb.c和README。

通过objdump –d bomb > bomb.txt将炸弹程序反汇编并重定向到bomb.txt,通过ls显示反汇编出的代码文件bomb.txt。

打开SSH Secure Shell Client工具,登录到远程主机,将远程主机上的文件下载到本机上,便于查看。

2、查看目标文件并做好调试准备

文件介绍:

bomb.txt:反汇编得到的代码文件,也是主要研究的目标文件。

bomb.c:主函数,通过调用每一关的函数实现,未显示每关的具体代码。

bomb:炸弹程序,当调试得出每一关的密码后打开程序运行来拆炸弹。

通过gdb
bomb指令进入gdb调试环境。

大致浏览反汇编代码,可以观察到整个程序一共有六关,分别为phase_1到phase_6,并有一关隐藏关secret_phase,每次输入错误时会调用引爆函数explode_bomb,因此为避免调试时引爆炸弹,需要首先在引爆函数前设置断点,即b explode_bomb。

3、拆除炸弹

1、 第一个炸弹

程序流程:

  1. 取内存地址0x4024b0处的内容;
  2. 取用户输入的内容(即密码);
  3. 比较两者的值,相等则%eax置为0,进入下一关,不相等则调用引爆程序引爆炸弹。

破解思路:

通过x/s 0x4024b0指令取出该地址的字符串,得到:Only
you can give me that feeling.

则密码为:Only you can give me that feeling.

通过 !

2、 第二个炸弹

程序流程:

  1. 读取用户输入内容(为6个数字);
  2. 判断输入的第一个值是否为1,不是则引爆炸弹;
  3. 做一个6次循环,判断后一个数是否等于前一个数加上之前循环变量,不是则引爆炸弹;
  4. 六个数字判断相等结束后,进入下一关

破解思路:

设输入内容为一个数组Key[6],则可知Key[0]=1,Key[i+1]=Key[i]+i。

因此第二关的密码是:1 2 6 24 120 720

3、 第三个炸弹

程序流程:

  1. 读取输入参数1和参数2,调用scanf函数传入两个参数;
  2. 比较参数1与7的大小,小于等于7继续,大于7引爆;
  3. 根据参数1的值来搜索跳转地址,计算得到最终的%eax;
  4. 比较参数1与5的大小,小于等于5继续,大于5引爆;
  5. 比较参数2与计算得到的%eax是否相等,相等则进入下一关,不相等则引爆。

重点在于参数1的选择决定了switch的跳转,该实验地址为(设参数1为x):

0x402510+x*8

其中存在一个Switch函数表,这个炸弹我选择参数1为2,则跳转地址为0x00400f33

Switch跳转到改地址开始计算eax%,最终结果为0x328-0xf7=0x231=561。

输入 2 561。

成功 !

4、 第四个炸弹

主程序流程:

  1. 读取2个参数,调用scanf函数传入参数;
  2. 比较输入参数与2的大小,小于则引爆;比较输入参数与4的大小,大于则引爆。
  3. 把输入参数传入函数func4,并调用函数func4;
  4. 若函数func4返回值等于%rsp+0x8,则返回,进入下一关,否则引爆炸弹。

func4函数流程:

1.  比较传入参数是否大于1,大于1则继续,小于1则返回0,等于1则返回%rax;

2.  循环%edi=%edi-1,并递归调用函数func4,直到参数小于等于1;

3.  循环变量%edi=edi-2,并传入%esp继续递归调用函数func4;

4.  函数返回的所得值加到%eax;

设b=%edi,a=%esi,则f(a,b)=f(a,b-1)+f(a,b-2)+a;

第二个参数小于1则返回0,等于1则返回%rax(即a)。

炸弹中默认b=8,我们输入a=2,经过上述式子计算得f(8)=561.

输入108 2 或者162 3。

成功 !

5、 第五个炸弹

程序流程:

  1. 输入字符串
  2. 调用string_length的字符串长度函数,测得的长度若不为6则引爆;
  3. 做一个6次的循环,循环变量%eax从1到6,;
  4. 我们要使得 string_not_equal返回值为0 ,也就是%ebp处的值和0x4024fe处的值相等,查看0x4024fe处的值,发现为bruins
  5. 循环赋giant了, 依次改变以%ebp为开始位置的char的数组的值 那么b,r,u,I,n,s就存在于该字符串,寻找改变字符串值的语句。
  6. 取得 (0x8[%ebp]+0xc(%ebp)) &0xf的值,作为下标取得0x402550中的值,查看 0x402550处的内存为
    maduiersnfotvbylSo you think you can stop the bomb with
    ctrl-c, do you?
  7. bruins分别对应 13 6 3 4 8 7 所以要取得13 6 3 4 8 7
  8. 我们输入的内容写成 ASCII码应该是xd
    x6 x3 x4 x8 x7。x表示任取,随便取得 3d 36 33 34 38 37,对应ASCII码为=63487。输入
  9. 成功 !

原文地址:https://www.cnblogs.com/shr123-/p/10111765.html

时间: 2024-08-23 23:40:27

CMU-CSAPP-Lab2拆解二进制炸弹的相关文章

逆向工程实验---二进制炸弹(CSAPP Project)

本实验设计为一个黑客拆解二进制炸弹的游戏.我们仅给黑客(同学)提供一个二进制可执行文件bomb和主函数所在的源程序bomb.c,不提供每个关卡的源代码.程序运行中有6个关卡(6个phase),每个关卡需要用户输入正确的字符串或数字才能通关,否则会引爆炸弹(打印出一条错误信息,并导致评分下降)! 要求同学运用GDB调试工具和objdump反汇编工具,通过分析汇编代码,找到在每个phase程序段中,引导程序跳转到"explode_bomb"程序段的地方,并分析其成功跳转的条件,以此为突破口

CSAPP Lab2: Binary Bomb

著名的CSAPP实验:二进制炸弹 就是通过gdb和反汇编猜测程序意图,共有6关和一个隐藏关卡 只有输入正确的字符串才能过关,否则会程序会bomb终止运行 隐藏关卡需要输入特定字符串方会开启 实验材料下载地址:http://csapp.cs.cmu.edu/2e/labs.html 下面通关解法: 反汇编: objdump -d bomb > bomb_assembly_32.S Phase 1: 打开bomb_assembly_32.S,定位到<phase_1>函数,可以看到以下代码:

《CSAPP》实验二:二进制炸弹

二进制炸弹是第三章<程序的机器级表示>的配套实验,这章主要介绍了x64汇编,包括:操作数的表示方式,数据传送指令,算术和逻辑指令,控制流跳转指令,过程(procedure)的实现与运行时栈帧,C语言中的数组,struct,union以及浮点数的汇编表示等.通过这章的学习,对C有了更深的理解,可以看出,C与汇编代码的相似度很高,称之为高级汇编也不为过. 这个实验提供了一个 Linux/x86-64 二进制程序(下载地址:CSAPP: Labs),即所谓的"二进制炸弹".执行这

二进制炸弹实验(持续更新)

一.前期准备 首先,既然这是CSAPP这本书上的实验,我们就得想办法找到书上的实验素材,不能随便自己编炸弹.这里课本上给了一个卡内基梅隆大学的edu网址csapp.cs.cmu.edu,然而,防火墙阻挡了我们的脚步.这里给大家两种解决思路: (一)多费点时间精力,CSDN博客园上有少量博主曾在博客里共享过CSAPP的实验资源,例如这一个,亲测可下载: (二)直接选择科学上网工具,搭梯子即可. 因为二进制炸弹实验网上有很多破解教程,所以写这个炸弹素材的人就很坏,我发现他隔几个月就会发布一版更新炸弹

逆向工程之二进制炸弹第一发

 down了二进制炸弹实验,名字就很酷是不是.简要介绍下,二进制炸弹是一个可执行文件,运行时,提示用户输入6个不同的字符串,如果其中的任何一个不正确,炸弹就会爆炸.初步判断有六个级别,难度逐级递增.这个实验需要学生通过对程序反汇编和逆向工程来判断是哪6个答案,从而拆除它的炸弹. 文档里面提示用到了gdb和objdump,那么问题来了.第一步怎么做? 照惯例我神游了一番,然后打开objdump –help翻看帮助,有个-t 参数,可以打印程序的符号表,据我所知符号表里面存储的是一些函数名和变量名,

二进制炸弹(第二次实验)

实验目的 本实验通过要求你使用课程所学知识拆除一个"binary bombs"来增强对程序的机器级表示.汇编语言.调试器和逆向工程等方面原理与技能的掌握. 一个"binary bombs"(二进制炸弹,下文将简称为炸弹)是一个Linux可执行程序,包含了6个阶段(或层次.关卡).炸弹运行的每个阶段要求你输入一个特定字符串,你的输入符合程序预期的输入,该阶段的炸弹就被拆除引信即解除了,否则炸弹"爆炸"打印输出 "BOOM!!!"

cmu二进制炸弹

本篇文章参考了:http://www.cnblogs.com/remlostime/archive/2011/05/21/2052708.html大神的文章,有时候没思路了会来看一下,但是保证本文的每个阶段都是自己独立思考后总结写出来的. Phase_1 对于phase1,我们只要关注一下红色框两行的代码,分别是将内存0x8049678的处的字符串A和ebp+0x8处的字符串B作为参数来调用strings_not_equal子程序,那么这里的逻辑也很明了——要想知道要求我们输入的字符串,只要查看

CSAPP lab2 二进制拆弹 binary bombs phase_5 施工中

phase_5 phase_5要求输入一个包含6个字符的字符串.phase_5函数从中读取这些信息,并判断其正确性,如果不正确,则炸弹爆炸. phase_5主要考察学生对指针(数组)机器级表示的掌握程度. 观察框架源文件bomb.c: 从上可以看出: 1.首先调用了read_line()函数,用于输入炸弹秘钥,输入放置在char* input中. 2.调用phase_5函数,输入参数即为input,可以初步判断,phase_5函数将输入的input字符串作为参数. 因此下一步的主要任务是从asm

csapp lab2

PHASE_1 使用到的命令: objdump -t bomb | less 我们得到的bomb文件是一个二进制文件,使用 objdump 可以得到反汇编的代码: -t 表示生成符号表,不必关注 . 开头的内容,可以看到phase_1/phase_2/.../phase_6,显然应该是对应不同的关卡: | less 表示使用一种方便浏览的分页方式,可以使用对应的快捷键辅助浏览. objdump -d bomb > bomb.txt -d将需要执行的内容生成反汇编代码. chmod 777 bom