phase_5(2)和phase_6

Hello world,hello blog!

Posted by 吴柚 on April 2, 2019

phase_5的解答

1. 题目分析

  1. 首先题目要求输入6位长度的字符串,否则爆炸,并且代码中有一个循环,让输入的字符串依次被读取进入循环。

  2. movzbl (%ebx,%eax,1),%ecx 此条指令用于读取输入的字符串。

  3. 然后将输入的字符串与0xf进行and操作,取出字符串所代表的ASCII码的低四位。

  4. add 0x804a280(,%ecx,4),%edx 在0x804a280内存中,存在一个数组,存储了16个数,将and操作后的结果作为索引,从数组中取出一个数赋予%edx中。

  5. 然后%eax加1,当%eax的值等于6时结束循环。

  6. 最后将6次循环得到的%edx相加等于0x45,否则爆炸。

2. 解题过程

  1. 使用p /x * 0x804a280指令获取在内存中的数组,其中有16个数,分别是 ` 2 10 6 1 12 16 9 3 4 7 14 5 11 8 15 13`

  1. 将这16个数赋予0-15的下标,即0代表2/1代表10等;

  2. 由于最后结果要等于0x45也就是69,因此从中选择14 15 12 8 11 9这6个数;

  3. 这6个数在数组中的索引分别为10 14 4 13 12 6

  4. 在前面的分析中得到,索引代表输入字符的后四位,因此随意选择前四位的值,就可以得到一系列ASCII码值。

  5. 我选择的答案是 JNDMLF (答案不唯一)。

phase_6解答

  1. 首先分析代码,是需要我们输入6个数字,然后这6个数字减1以后要小于等于5,故这几个数字的范围是1-6。

  2. 由于代码太长,所以没有全部查看,观察到代码中有一个明码地址 0x804c13c,选择使用指令查看其包含什么内容。

  3. 使用x/3x 0x804c13c 指令,看到下图中的内容。

  1. 发现第一列是十六进制数,第二列正好是1-6的排列,由此猜想,是否按照16进制数的大小来排列1-6.

  2. 将16进制转换为10进制后比较大小,然后按照从小到大顺序排列。

6.解题成功,答案为2 3 1 5 4 6