学术练习:他们给了我们一个要求输入密码的二进制文件,我必须给教授这个二进制文件要我提供的“密码”。
用gdb
与他们的二进制文件进行了几个小时的战斗之后,我终于解决了这个任务,但是:我不知道如何在任意指令的地址处中断?每次到达一个看起来很有趣的地方时,我都必须记住如何到达那里,并且在再次运行二进制文件时,会费力地s
和n
再次到达那个地方。相反,我希望能够b
在这个地方。
让我展示一个简单的例子,我不能做什么:
m@m-X555LJ:~/szkolne/bezp$ gdb ./crackme2018
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
<cut for brevity, everyone knows what gdb spits out on startup>
Reading symbols from ./crackme2018...(no debugging symbols found)...done.
(gdb) break __libc_start_main
Breakpoint 1 at 0x630
(gdb) r
Starting program: /home/m/szkolne/bezp/crackme2018
Breakpoint 1, 0xf7deed90 in __libc_start_main () from /lib/i386-linux-gnu/libc.so.6
(gdb) quit
A debugging session is active.
Inferior 1 [process 3526] will be killed.
Quit anyway? (y or n) y
m@m-X555LJ:~/szkolne/bezp$ gdb ./crackme2018
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
<cut for brevity, everyone knows what gdb spits out on startup>
Reading symbols from ./crackme2018...(no debugging symbols found)...done.
(gdb) break *0x630
Breakpoint 1 at 0x630
(gdb) r
Starting program: /home/m/szkolne/bezp/crackme2018
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x630
(gdb) quit
A debugging session is active.
Inferior 1 [process 3532] will be killed.
Quit anyway? (y or n) y
m@m-X555LJ:~/szkolne/bezp$
这是持久性的:每次我启动gdb
并在__libc_start_main
处中断时,gdb
都会说它在地址0x630
处中断。但是,如果我想在那个地址上打断我,那是不允许的。
为什么会发生?如何中断地址0x630
(或其他更有趣的地址)?