首页 > 其他分享 >Bomb

Bomb

时间:2022-11-23 01:00:35浏览次数:51  
标签:0110 Bomb 代码 炸弹 密钥 关卡 反汇编

1、分函数分析

①string_length函数:

函数string_length主要作用就是用于返回所输入的字符串长度。在反汇编代码中通过与0比较判断字符串的读取统计长度的过程是否到达字符串的终止符“\0”,进入则结束字符串长度计算。

②string_not_equal函数:

函数string_not_equal主要作用是比对两个字符串是否完全相同,通过三重外在if判断和do-while循环及其内部的if判断对两个字符串是否相同进行对比。此外,该过程中还调用到了string_length函数。

   ③read_six_numbers函数

函数read_six_number主要作用是输入数组的6个数据,该过程中限制读取的数据数量,一旦超出所设定的数量则会直接跳出该过程。且该函数中应用到了数组,确保输入的数据存在顺序要求。

   ④func4函数

函数func4的主要作用是递归二分并将所得的二分中间值保留累加作为返回值,直至二分中间值 = 转入参数。在该过程中需要注意最后的返回值还需要加上输入的第二个参数。

 2、关卡1(phase_1):I can see Russia from my house!

关卡1的主题是“字符串的比较”,相对其他关卡而言难度较低,可以选择直接进行通过反汇编语言逆推C语言程序,也可以选择通过gdb调试,两种方式均难度不高,其核心是找寻其存储炸弹密钥字符串的寄存器。

针对于phase_1函数的反汇编代码的具体分析情况如下图所示,针对于下列代码的分析,需要着重主语寄存器%rsi,该寄存器主要用于存储通关密钥。

 

通过对所的反汇编代码进行简要分析后,可以使用命令行“gdb bomb”进入gdb模式对domb程序进行调试。

 

在gdb模式下通过“break 函数名”命令行分别设置“explode_bomb”和“phase_1”两个断点,反之程序在调试过程中爆炸会进入下一关卡。

 

通过“run”命令运行该程序,此时程序将会在第一个断点出停止,需输入字符(此处使用字符“hello”进行尝试)后回车方可继续运行,随后在第二个断点处停止。

 

随后可通过“disas”命令查看phase_1的反汇编代码并确定此时程序的执行进度,之后则可以通过命令“si”进行程序的单步执行。

通过对函数strings_not_equal和函数string_length的分析可发现炸弹密钥所对应的字符串存储在寄存器%rsi中,则可以选择通过“p (char *)($rsi)”、“x/s $rsi”、“x/s 0x5555555568a0”三种命令中的一种对寄存器%rsi中的信息进行查看,从而得到炸弹密钥。

最后,通过反汇编代码、炸弹密钥及相关分析可以反推出该关卡所相应的C语言程序,具体程序代码如下所示: 

 

第一关炸弹密钥检验结果如下所示:

 3、关卡2(phase_2):1 2 4 8 16 32

关卡2的核心难点在于对“for循环”的理解,在该过程中需要确定循环体,循环过程的初始条件、跳出循环条件等信息。除此之外,在该关卡中还调用到了函数read_six_numbers,则可以由此推该关卡的通关密钥需要6位数据。

通过对判断输入数据数量后的1242、1246、1251处的反汇编代码可以判断该关卡的炸弹密钥的第一个参数为1。

 

确定第一个参数后,则可以在反汇编代码中找for循环的循环体,进而根据反汇编代码中的要求可以得到6位炸弹密钥,根据循环过程可以确定其值分别为1、2、4、8、16、32。

 

通过上述对反汇编代码的分析后可以得到关卡2的C语言程序的相关代码,其具体代码情况如下所示:

 

通过反汇编代码确定6位炸弹密钥后仍无法安全通关,还需要确定密钥输入的格式。此时则可以通过gdb调试用于确定密钥的输入格式。

通过第一关后使用“delete”删除所有断点,重新设置新断点“break phase_2”,使用“run”命令运行,输入第一关答案后进入第二关,随便输入数值进入第二关调试中。随后使用“disas”查看当前程序执行情况。

 

  随后使用命令“si”进行单步运行,并注意查看程序执行进度,当程序执行到“callq 0x5555555558c3 <read_six_numbers>”后进一步单步执行后则会进行函数read_six_numbers,此时则可以通过“x/s 0x555555556a33”查看到炸弹密钥的数据格式“%d %d %d %d %d %d”,即如下所示。

 

针对于第二关的反汇编语言所得到的炸弹密钥及上述所确定的炸弹密钥的格式可以确定该关卡的炸弹密钥为“1 2 4 8 16 32”。

运行“bomb”程序检验炸弹密钥的正确性的结果如下图所示:

 4、第三关(phase_3):0 j 453

该关卡的核心在于对switch分支的分析与理解,通过相关密钥参数确定分支数量,不同的分支对应不同的“case”,对数据所对应的参数也存在差异。为了更好地确定该关卡的通关密钥,需要先确定该关卡的通关密钥所对应参数类型及输入格式。

为了得到该关卡的通关密钥所对应参数类型及输入格式可以通过gdb调试得出响应的结果,结果如下所示:

 

根据单步运行与查看到的当前程序运行进度情况并当前进度下的phase_3的<+20>、<+25>、<+30>、<+35>,可知第三关炸弹密钥的存储地址为“0x5555555568e6”,即寄存器%rsi的存储地址,可见于phase_3的<+35>处,通过命令行“x/s 地址”即可查看到该关卡炸弹密钥的格式。即如下所示:

 

通过gdb调试得到该关卡炸弹密钥的参数类型及参数输入格式即可选择通过分析反汇编代码对“switch-case”函数进行相关分析。

通过对phase_3的反汇编代码的1c1和12c6处进行分析可知炸弹密钥的第一个参数的取值范围应当为0~7共计8中选择,即该switch_case函数的case包括case0到case7这8个case选项。

 

8个不同的“case”选项会造成后两位参数的不同,即后两位参数主要取决于第一位参数选择进入的“case”选项。通过对反汇编代码进行分析可知这8个“case”选项的情况依次如下图所示:

根据上述分析可知该关卡的炸弹密钥依次为“0 j 453”、“1 a 410”、“2 n 857”、“3 e 317”、“4 n 551”、“5 o 411”、“6 w 273”、“7 p 250”。

通过上述分析可以通过C语言实现该程序中的switch-case函数运算,其具体代码如下所示:

 

第三关炸弹密钥检测结果如下,此处选择炸弹密钥为“0 j 453”,其他炸弹密钥经过验证证明也属于符合过关要求的炸弹密钥。

 5、第四关(phase_4):99 3或66 2

在gdb配置模式后,可通过命令行“disas phase_4”查看第四关的反汇编代码,根据可轻易推出其密钥存储地址,再根据存储地址与相关命令行即可查看地址下的密钥,从而确定其输入格式。 

确定密钥个时候则可以根据所得出的反汇编代码进行分析:

①145c和1463处通过判断scanf的返回值是否为2进而验证所输入的密钥的数字的数量是否为2。

②从146d至1478处判断密钥参数中的第二个参数是否大于等于2且小于4。

通过对func4函数进行分析可知该函数为递归函数,且该函数所输入的两个参数中,第一个参数可根据上图中1480和1485处分析得出其值为7,该函数中的第二个参数为该关卡密钥的第二个参数,根据对反汇编代码的分析可知其可取值为2和3,经过func4函数运算所得出的结果属于该关卡密钥的第一个参数,计算结果分别为66和99。

 

最后,得出该关卡的密钥为“99 3”和“66 2”。对所得的两个炸弹密钥进行检验结果如下所示:

6、第五关(phase_5):yoapuw

在gdb模式下,通过前四关后,删除其他断点,重新设置第五关的断点,并运行该程序后,在第五关断点处暂停运行后,可以通过“disas”查看当前关卡的运行进度及该关卡的反汇编代码。

 

通过对上述反汇编代码的分析可以获取以下信息:

①根据<+24><+29>处反汇编代码可以确定该关卡的炸弹密钥是6个字符长度。

②根据<+34>到<+69>这九行反汇编代码可以确定该过程属于循环操作过程。

③根据<+81>、<+88>处的反汇编代码可以确定地址“0x5555555568ef”中存储着炸弹密钥经过循环变换后的密钥字符,即“flames”。

已知字符串“flanmes”是经过循环操作中导致其二进制编码的低四位发生偏移后对照ASCII码后所得到的字符串。

通过查看地址“0x555555556920”的字符串信息可以发现变换后的字符又为“maduiersnfotvbyl”,分别表示偏移量为“0~15”。

 

字符串“flames”是炸弹密钥通过基址变址寻址进而得到的,根据偏移量与变换后的字符的关系可以推算出该关卡的密钥偏移量分别为9、15、1、0、5、7,此偏移量属于所输入的炸弹密钥在ASCII码的二进制表示输的第四位的数值,即其对应的第四位二进制表示为1001、1111、0001、0000、0101、0111。

二进制 字符 二进制 字符 二进制 字符
0110 0001 a 0110 1010 j 0111 0011 s
0110 0010 b 0110 1011 k 0111 0100 t
0110 0011 c 0110 1100 l 0111 0101 u
0110 0100 d 0110 1101 m 0111 0110 v
0110 0101 e 0110 1110 n 0111 0111 w
0110 0110 f 0110 1111 o 0111 1000 x
0110 0111 g 0111 0000 p 0111 1001 y
0110 1000 h 0111 0001 q 0111 1010 z
0110 1001 i 0111 0010 r    

根据偏移量并综合ASCII码对照表的情况即可得到该关卡的炸弹密钥的字符串上的六位字符可取字符依次为:i或y、o、a或q、p、e或u、w或g(该关卡选择ioqpeg实现通关)。

运行检验结果如下所示:

标签:0110,Bomb,代码,炸弹,密钥,关卡,反汇编
From: https://www.cnblogs.com/Auion-idiot/p/16917026.html

相关文章

  • 计算机系统导论 Bomb Lab Phase 1~6 全解
    ICSBombLab——TheUltimateCompanion经验教训:不要尝试通过眼睛瞪来把结果瞪出来——不打草稿的话,难度太大了。不要瞎改内存地址来试图通过——不然会结算成爆炸。......