给了bomb.c
和bomb
二进制可执行目标程序,bomb.c
不能直接编译和运行,只是有一些提示,但是程序大致结构是:有6个关卡,每个都需要输入(stdin/文件)一个字符串,运行后判断是否输入了正确的字符串。我们需要反汇编bomb
,找到这6个正确的字符串。
我是在Amazon的云服务器上完成的,64位Red Hat。
第一步把汇编代码扔到一个文件中,方便调试。
1 | objdump -d bomb > bomb.asm |
phase 1
1 | 0000000000400ee0 <phase_1>: |
当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8,
r9。
我们的input作为第一个参数存入rdi,第二个参数0x402400存入rsi,传入函数处理,
调用了401338
处的函数strings_not_equal
:
在400ee4设个断点,看看402400里是啥:
1 | gdb |
为了确认这就是我们要的答案,再去看看调用的函数: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
390000000000401338 <strings_not_equal>:
401338: 41 54 push %r12
40133a: 55 push %rbp
40133b: 53 push %rbx
40133c: 48 89 fb mov %rdi,%rbx # 第一个参数(地址)存入rbx
40133f: 48 89 f5 mov %rsi,%rbp # 第二个参数(地址)存入rbp
401342: e8 d4 ff ff ff callq 40131b <string_length> # 用rdi的值调用string_length
401347: 41 89 c4 mov %eax,%r12d # 返回值存入r12d
40134a: 48 89 ef mov %rbp,%rdi # 第二个参数作为入参调用string_length
40134d: e8 c9 ff ff ff callq 40131b <string_length>
401352: ba 01 00 00 00 mov $0x1,%edx
401357: 41 39 c4 cmp %eax,%r12d # 比较两个字符串的长度
40135a: 75 3f jne 40139b <strings_not_equal+0x63> # 不相等跳转
40135c: 0f b6 03 movzbl (%rbx),%eax # 将rbx地址中的值(input的第一个字母)存入eax
40135f: 84 c0 test %al,%al
401361: 74 25 je 401388 <strings_not_equal+0x50>
401363: 3a 45 00 cmp 0x0(%rbp),%al # 比较rbp地址中的值(待比较的第一个字母)
401366: 74 0a je 401372 <strings_not_equal+0x3a> # 相等跳转
401368: eb 25 jmp 40138f <strings_not_equal+0x57> # 不相等跳转
40136a: 3a 45 00 cmp 0x0(%rbp),%al
40136d: 0f 1f 00 nopl (%rax)
401370: 75 24 jne 401396 <strings_not_equal+0x5e>
401372: 48 83 c3 01 add $0x1,%rbx # 指针+1
401376: 48 83 c5 01 add $0x1,%rbp # 指针+1
40137a: 0f b6 03 movzbl (%rbx),%eax
40137d: 84 c0 test %al,%al
40137f: 75 e9 jne 40136a <strings_not_equal+0x32> # 跳回循环
401381: ba 00 00 00 00 mov $0x0,%edx
401386: eb 13 jmp 40139b <strings_not_equal+0x63>
401388: ba 00 00 00 00 mov $0x0,%edx
40138d: eb 0c jmp 40139b <strings_not_equal+0x63>
40138f: ba 01 00 00 00 mov $0x1,%edx
401394: eb 05 jmp 40139b <strings_not_equal+0x63>
401396: ba 01 00 00 00 mov $0x1,%edx
40139b: 89 d0 mov %edx,%eax
40139d: 5b pop %rbx
40139e: 5d pop %rbp
40139f: 41 5c pop %r12
4013a1: c3 retq
phase 2
1 | 0000000000400efc <phase_2>: |
第一次是1,第二次是2,4,8,16,32
phase 3
1 | 0000000000400f43 <phase_3>: |
400f51将地址0x4025cf赋给esi,作为第二个参数,看下这个地址有啥:为了方便,我们把前面问题的答案仍在一个文件ans.txt中,
输入是2个整数,第一个不能大于7,基于第一个整数(0-7)跳转......