计算机系统基础实验:拆炸弹第一关

任务描述

本关任务:在phase_1的汇编代码中找到第一关拆弹密码。

相关知识

为了完成本关任务,你需要掌握:1.使用 gdb 和反汇编以查看程序的运行过程。2.明白具体的操作符的含义。3.理解不同寄存器的常用方法。4.一些汇编语句与实际命令的转换。

使用gdb和反汇编以查看程序的运行过程

本实验的执行文件为bomb(无后缀),先在命令行找到bomb文件的位置,再用gdb调试工具运行该文件,写法为gdb bomb。进入 gdb 调试后,使用disas反汇编相应关卡。

具体的操作符的含义

常量以符号$开头:$-42,$0x15213(一定要注意十进制还是十六进制)
寄存器以符号%开头:%esi,%rax(可能存的是值或者地址)
内存地址用括号括起来:如(%rbx),括号实际上是去寻址的意思

不同寄存器的常用方法

六个寄存器(%rax,%rbx,%rcx,%rdx,%rsi,%rdi)称为通用寄存器,有其『特定』的用途。

%rax(%eax) 用于做累加
%rcx(%ecx) 用于计数
%rdx(%edx) 用于保存数据
%rbx(%ebx) 用于做内存查找的基础地址
%rsi(%esi) 用于保存源索引值
%rdi(%edi) 用于保存目标索引值
%rsp(%esp)和%rbp(%ebp)则是作为栈指针和基指针来使用的

一些汇编语句与实际命令的转换

注:汇编指令的英文一般就指代其功能,如mov(move移动)。汇编的注释为;。

1
2
3
4
5
6
7
sub    $0x8,%rsp    ;rsp寄存器的内容减去8再保存到rsp中
mov $0x402400,%esi ;将常量$0x402400存到esi寄存器中,一般出现这类地址,是重点信息
callq 0x401338 <strings_not_equal> ;调用strings_not_equal函数。bomb文件中的函数名基本就指代其功能
test %eax,%eax ;test指令做&操作,一般和跳转一起使用
je 0x400ef7 <phase_1+23> ;
callq 0x40143a <explode_bomb> ;je为若相等则跳转,je也等价于jz(若为零则跳转)。此处即若eax零则跳转到0x400ef7。
add $0x8,%rsp ;rsp寄存器内容加8再保存到rsp中

编程要求

根据提示,在汇编代码中找到本关密码,在c文件中将密码输出。

如本关密码为how are you.,则在 c 文件中添加printf(“how are you.”);。

开始前的操作

在命令行执行以下命令来找到对应bomb文件:
cd /data/workspace/myshixun/step1
注意:使用cd命令时配合tab会省事很多,如cd m再按tab键,系统自动将文件名补充完整
反汇编找出源码:objdump -d ./bomb > bomb.s
可以使用ls命令查看该文件夹下的文件
chmod 777 bomb来修改运行权限
gdb bomb进入调试
本关提示
进入调试后,先设置断点,如break phase_1即输入第一关密码后,在phase_1处暂停。再用run命令开始运行程序,run以后会出现一段话,此时输入第一关密码,随便输一个,即进入断点处,此时disas即可查看第一关汇编代码,注意不必纠结函数,给出的地址很重要。

例子:1.查看地址0x01存的内容

1
2
3
4
5
6
print 0x01
x/s 0x01 ;x为以16进制显示,s为以字符串显示
2.查看寄存器esi存的内容

print $esi
x/s $esi

开始你的任务吧,祝你成功!

我的操作

命令行:

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
版本库代码路径:/data/workspace/myshixun/
root@evassh-1441839:~# cd /data/workspace/myshixun/step1
root@evassh-1441839:/data/workspace/myshixun/step1# ll
total 40
-rw-r----- 1 root root 26406 Apr 2 13:26 bomb
-rw-r----- 1 root root 101 Apr 2 13:26 main.c
-rw-r----- 1 root root 49 Apr 2 13:26 makefile
-rw-r----- 1 root root 155 Apr 2 13:26 test.sh
root@evassh-1441839:/data/workspace/myshixun/step1# objdump -d ./bomb > bomb.s
root@evassh-1441839:/data/workspace/myshixun/step1# chmod 777 bomb
root@evassh-1441839:/data/workspace/myshixun/step1# gdb bomb
GNU gdb (Debian 7.12-6) 7.12.0.20161007-git
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from bomb...done.
(gdb)
(gdb) disas phase_1
Dump of assembler code for function phase_1:
0x0000000000400ee0 <+0>: sub $0x8,%rsp
0x0000000000400ee4 <+4>: mov $0x402400,%esi
0x0000000000400ee9 <+9>: callq 0x401338 <strings_not_equal>
0x0000000000400eee <+14>: test %eax,%eax
0x0000000000400ef0 <+16>: je 0x400ef7 <phase_1+23>
0x0000000000400ef2 <+18>: callq 0x40143a <explode_bomb>
0x0000000000400ef7 <+23>: add $0x8,%rsp
0x0000000000400efb <+27>: retq
End of assembler dump.
(gdb) break phase_1
Breakpoint 1 at 0x400ee0
(gdb) run
Starting program: /data/workspace/myshixun/step1/bomb
Welcome to my fiendish little bomb. You have 6 phases with
which to blow yourself up. Have a nice day!

^C
Program received signal SIGINT, Interrupt.
0x00007ffff7b15910 in __read_nocancel () at ../sysdeps/unix/syscall-template.S:84
84 ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) print 0x01
$1 = 1
(gdb) x/s 0x01
0x1: <error: Cannot access memory at address 0x1>
(gdb) print 0x01
$2 = 1
(gdb) print $esi
$3 = 6308896
(gdb) x/s $esi
0x604420: "\n"
(gdb) print %rsp
A syntax error in expression, near `%rsp'.
(gdb) print $rsp
$4 = (void *) 0x7fffffffea48
(gdb) disas
Dump of assembler code for function __read_nocancel:
0x00007ffff7b15909 <+0>: mov $0x0,%eax
0x00007ffff7b1590e <+5>: syscall
=> 0x00007ffff7b15910 <+7>: cmp $0xfffffffffffff001,%rax
0x00007ffff7b15916 <+13>: jae 0x7ffff7b15949 <read+73>
0x00007ffff7b15918 <+15>: retq
End of assembler dump.
(gdb) disas phase_1
Dump of assembler code for function phase_1:
0x0000000000400ee0 <+0>: sub $0x8,%rsp
0x0000000000400ee4 <+4>: mov $0x402400,%esi
0x0000000000400ee9 <+9>: callq 0x401338 <strings_not_equal>
0x0000000000400eee <+14>: test %eax,%eax
0x0000000000400ef0 <+16>: je 0x400ef7 <phase_1+23>
0x0000000000400ef2 <+18>: callq 0x40143a <explode_bomb>
0x0000000000400ef7 <+23>: add $0x8,%rsp
0x0000000000400efb <+27>: retq
End of assembler dump.
(gdb) Quit
(gdb) print 0x7fffffffea48
$5 = 140737488349768
(gdb) print 0x7fffffffea40
$6 = 140737488349760
(gdb) print 0x7fffffffea56
$7 = 140737488349782
(gdb) print $esi
$8 = 6308896
(gdb) print 0x402400
$9 = 4203520
(gdb) x/s $esi
0x604420: "\n"
(gdb) print $eax
$10 = -512
(gdb) x/s $eax
0xfffffffffffffe00: <error: Cannot access memory at address 0xfffffffffffffe00>
(gdb) x/s $rsp
0x7fffffffea48: "0ڪ\367\377\177"
(gdb) x/s $esi
0x604420: "\n"

(gdb) print 0x7fffffffea56
$7 = 140737488349782
(gdb) print $esi
$8 = 6308896
(gdb) print 0x402400
$9 = 4203520
(gdb) x/s $esi
0x604420: "\n"
(gdb) print $eax
$10 = -512
(gdb) x/s $eax
0xfffffffffffffe00: <error: Cannot access memory at address 0xfffffffffffffe00>
(gdb) x/s $rsp
0x7fffffffea48: "0ڪ\367\377\177"
(gdb) x/s $esi
0x604420: "\n"
(gdb) x/s 0x401338
0x401338 <strings_not_equal>: "ATUSH\211\373H\211\365\350\324\377\377\377A\211\304H\211\357\350\311\377\377\377\272\001"
(gdb) x/s 0x402400
0x402400: "Border relations with Canada have never been better."

答案:

1
2
3
4
5
6
7
#include<stdio.h>

void main(){
/********** Begin **********/
printf("Border relations with Canada have never been better.");
/********** End **********/
}

----本文结束啦感谢您阅读----

欢迎关注我的其它发布渠道