综合分析:
- 通过上面的string_length和字符串长度和6比较,得出这是一长为6的字符串
- 通过对于循环体的分析,得知先从我们输入的字符串中取一个字符,让其通过与0xf相与实现高位置零,只取低四位。我查到0x804a0d4存的是一个长字符串,把前面找到的低四位当索引,0x804a0d4实际相当于数组名指针,在这个字符串中查找得到的字符保存到栈中。通过循环6次,即从长字符串中得到一个6位的字符串
- 执行完后,压入一个字符串,可以查到是“flyer”,后面通过爆炸条件得知,求出的字符串需与其相同才不爆炸,即我们求出的就是“flyer”
- f在长字符串中对应的是第9个(从0开始),即索引值是9,得知我们的第一个字符的低四位是9,这是ASCII码,但是考虑到我们键盘输入的大多为字母,我们把高四位值当作96,再加上低四位的9,得到105,即i。(加64也可以,得到的是大写I)
- 同样的处理方法,l索引为15,y索引为14,e索引为5,r索引为6,s索引为7。加上64,再查ASCII表,得出我们的字符串为“ionefg”
测试结果:
08048d48 <phase_5>:
8048d48: 55 push %ebp
8048d49: 89 e5 mov %esp,%ebp 开辟新栈帧
8048d4b: 53 push %ebx 被调用者保存现场
8048d4c: 83 ec 20 sub $0x20,%esp
8048d4f: 8b 5d 08 mov 0x8(%ebp),%ebx ebp+8给ebx
8048d52: 65 a1 14 00 00 00 mov %gs:0x14,%eax
8048d58: 89 45 f4 mov %eax,-0xc(%ebp)
8048d5b: 31 c0 xor %eax,%eax
8048d5d: 53 push %ebx
8048d5e: e8 78 02 00 00 call 8048fdb <string_length> 调用函数返回值为字符串长度,返回值放eax中
8048d63: 83 c4 10 add $0x10,%esp
8048d66: 83 f8 06 cmp $0x6,%eax 比较字符串长度和6的大小
8048d69: 74 05 je 8048d70 <phase_5+0x28> 等于6就不爆炸
8048d6b: e8 90 03 00 00 call 8049100 <explode_bomb>
8048d70: b8 00 00 00 00 mov $0x0,%eax eax置为0
8048d75: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx 将ebx+eax*1给edx
8048d79: 83 e2 0f and $0xf,%edx edx和0xf相与,即低四位留下,高四位置零
8048d7c: 0f b6 92 d4 a0 04 08 movzbl 0x804a0d4(%edx),%edx 可以查到0x804a0d4存的是一个字符串,把我们一个输入字符的低四位当索引,在这个字符串中查找得到的字符给edx
8048d83: 88 54 05 ed mov %dl,-0x13(%ebp,%eax,1) 将取得的存于栈帧中
8048d87: 83 c0 01 add $0x1,%eax eax加一,即i++
8048d8a: 83 f8 06 cmp $0x6,%eax 比较eax和6是否等于6
8048d8d: 75 e6 jne 8048d75 <phase_5+0x2d> 即eax不为6,循环执行
8048d8f: c6 45 f3 00 movb $0x0,-0xd(%ebp)
8048d93: 83 ec 08 sub $0x8,%esp
8048d96: 68 aa a0 04 08 push $0x804a0aa 这是一个字符串,可以查到是flyers
8048d9b: 8d 45 ed lea -0x13(%ebp),%eax
8048d9e: 50 push %eax 把上面循环求得的字符串压栈
8048d9f: e8 59 02 00 00 call 8048ffd <strings_not_equal>比较两字符串是否相等
8048da4: 83 c4 10 add $0x10,%esp
8048da7: 85 c0 test %eax,%eax 函数返回值
8048da9: 74 05 je 8048db0 <phase_5+0x68> eax=0,即两字符串相等,不爆炸
8048dab: e8 50 03 00 00 call 8049100 <explode_bomb>
8048db0: 8b 45 f4 mov -0xc(%ebp),%eax
8048db3: 65 33 05 14 00 00 00 xor %gs:0x14,%eax
8048dba: 74 05 je 8048dc1 <phase_5+0x79>
8048dbc: e8 cf f9 ff ff call 8048790 <__stack_chk_fail@plt>
8048dc1: 8b 5d fc mov -0x4(%ebp),%ebx
8048dc4: c9 leave
8048dc5: c3 ret