phase_5的解答
1. 题目分析
-
首先题目要求输入6位长度的字符串,否则爆炸,并且代码中有一个循环,让输入的字符串依次被读取进入循环。
-
movzbl (%ebx,%eax,1),%ecx
此条指令用于读取输入的字符串。 -
然后将输入的字符串与0xf进行and操作,取出字符串所代表的ASCII码的低四位。
-
add 0x804a280(,%ecx,4),%edx
在0x804a280内存中,存在一个数组,存储了16个数,将and操作后的结果作为索引,从数组中取出一个数赋予%edx中。 -
然后%eax加1,当%eax的值等于6时结束循环。
-
最后将6次循环得到的%edx相加等于0x45,否则爆炸。
2. 解题过程
- 使用
p /x * 0x804a280
指令获取在内存中的数组,其中有16个数,分别是 ` 2 10 6 1 12 16 9 3 4 7 14 5 11 8 15 13`
-
将这16个数赋予0-15的下标,即0代表2/1代表10等;
-
由于最后结果要等于0x45也就是69,因此从中选择
14 15 12 8 11 9
这6个数; -
这6个数在数组中的索引分别为
10 14 4 13 12 6
。 -
在前面的分析中得到,索引代表输入字符的后四位,因此随意选择前四位的值,就可以得到一系列ASCII码值。
-
我选择的答案是
JNDMLF
(答案不唯一)。
phase_6解答
-
首先分析代码,是需要我们输入6个数字,然后这6个数字减1以后要小于等于5,故这几个数字的范围是1-6。
-
由于代码太长,所以没有全部查看,观察到代码中有一个明码地址
0x804c13c
,选择使用指令查看其包含什么内容。 -
使用
x/3x 0x804c13c
指令,看到下图中的内容。
-
发现第一列是十六进制数,第二列正好是1-6的排列,由此猜想,是否按照16进制数的大小来排列1-6.
-
将16进制转换为10进制后比较大小,然后按照从小到大顺序排列。
6.解题成功,答案为2 3 1 5 4 6
。