CSAPP lab2 二进制拆弹 binary bombs phase_3

phase_3要求输入包含1个小于10的整数,一个整数的字符串。phase_2函数从中读取这些信息,并判断其正确性,如果不正确,则炸弹爆炸。

phase_3主要考察学生对C语言条件/分支的机器级表示的掌握程度。

观察框架源文件bomb.c:

 

从上可以看出:

1、首先调用了read_line()函数,用于输入炸弹秘钥,输入放置在char* input中。

2、调用phase_3函数,输入参数即为input,可以初步判断,phase_3函数将输入的input字符串作为参数。

因此下一步的主要任务是从asm.txt中查找在哪个地方调用了readline函数以及phase_3函数。

1.1 寻找并分析调用phase_3函数的代码

打开asm.txt,寻找phase_3函数。

 

phase_1类似分析:

1、当前栈的位置存放的是read_line函数读入的一串输入;

2、phase_3的函数入口地址为0x8048c72

此时的函数栈为:

 

1.2 phase_3函数分析

寻找8048c72,或者继续寻找phase_3,可以寻找到phase_3函数,如下图所示:

 

1、第421~431行:初始化函数栈帧,同时为调用sscanf准备参数。之后,函数栈帧如下所示:

 

1esp + 4的地方,存放的是0x804a4e6,其对应的字符串为“%d %c %d”(其分析过程参见phase_2,不再赘述);

2esp + 8的地方实际的内容是esp + 0x28(是esp + 0x28地址的内容的地址),esp + c内容是esp + 0x27esp + 10的内容是esp + 0x2c

3)参考phase读取6个整数的分析,可以认为前面几个参数都是为调用sscanf准备参数:sscanf(input, "%d %c %d", &d1, &c, &d2),其中&d1对应8%esp),&c对应c%esp),&d2对应10%esp)。

4)因此,可以看出27%esp)、28%esp)、2c%esp)分别对应于cd1d2。也即sscanf最终读取的数据分别放置于栈帧中的这三个地方,在后面的代码分析中,均以cd1以及d2来代替这三个地址的内容。

2、第433-435行:判断sscanf返回结果是否大于2,如果不是,则explode_bomb。如果大于,则认为输入正确,跳转到<phase_3 + 0x39>(8048cab)-->436行。

3、第436行(phase_3 + 0x39)及437行:d17相比较,大于则跳转到<phase_3 + 0x13d>(8048daf)(引爆炸弹),也即d1应该小于等于7。、

4、第438-439行:将d1送给eax,跳转到0x804a4f8 + d1 * 4的内容所指示的地址。使用objdump --start-address=0x804a4f8 -s bomb查看0x804a4f8的内容,如下图所示:

 

显然,后面连续的832位的数值分别指向的地址是08048cc108048ce308048d0508048d2708048d4308048d5e08048d7908048d94(注意:IA32为小端表示),分别对应于d10~7。显然这一块应该是一个swich-case的机器级表示。(参见袁春风老师《选择及循环语句的机器级表示》)

5、第440-444行(8048cc1):0x6e --> eax0xd5(十进制213)d2比较,如果相等,则跳转到phase_3 + 0x1478048db9),如果不等,则引爆炸弹。

6、第497-499行(8048db9):c%eax比较(此时eax的内容为0x6e对应的是字符n),如果相等,则结束,否则引爆炸弹。

7、根据上面分析,d1 = 0时,c='n'd2 = 213

8、第447-451行(8048ce3):同上面分析,d1=1时,c = 0x79(字符y),d2 = 0x3cc(972);

9、第454-458行(8048d05):同上面分析,d1=2时,c = 0x6f(字符o),d2 = 0x202(514);

10、第461-464行(8048d27):同上面分析,d1=3时,c= 0x63(字符c),d2=0x5686

11、第467-471行(08048d43):同上面分析,d1=4时,c= 0x6b(字符k),d2=0x1a4420

12、第474-478行(08048d5e):同上面分析,d1=5时,c= 0x73(字符s),d2=0x23f575

13、第481-485行(08048d79):同上面分析,d1=6时,c= 0x6a(字符j),d2=0x3d4980

14、第488-492行(08048d94):同上面分析,d1=5时,c= 0x66(字符f),d2=0x11a282

根据以上分析,该题的答案并不唯一,可能的答案(三元组)是:

0 n 213)、(1 y 972)、(2 o 514)、(3 c 86)、(4 k 420)、(5 s 575)、(6 j 980)、(7 f 282)

猜你喜欢

转载自www.cnblogs.com/wkfvawl/p/10651205.html