⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1028.html

📁 著名的linux英雄站点的文档打包
💻 HTML
📖 第 1 页 / 共 3 页
字号:
info break 显示当前断点清单,包括到达断点处的次数等。<br>
info files 显示被调试文件的详细信息。<br>
info func 显示所有的函数名称。<br>
info local 显示当函数中的局部变量信息。<br>
info prog 显示被调试程序的执行状态。<br>
info var 显示所有的全局和静态变量名称。<br>
kill 终止正被调试的程序。<br>
list 显示源代码段。<br>
make 在不退出 gdb 的情况下运行 make 工具。<br>
next 在不单步执行进入其他函数的情况下,向前执行一行源代码。<br>
print EXPR 显示表达式 EXPR 的值。<br>
<br>
3.gdb 使用范例<br>
<br>
-----------------<br>
清单 一个有错误的 C 源程序 bugging.c<br>
-----------------<br>
#include &lt;stdio.h&gt;<br>
#include &lt;stdlib.h&gt;<br>
<br>
static char buff [256];<br>
static char* string;<br>
int main ()<br>
{<br>
<br>
printf ("Please input a string: ");<br>
gets (string);<br>
<br>
printf ("Your string is: %s", string);<br>
}<br>
-----------------<br>
<br>
上面这个程序非常简单,其目的是接受用户的输入,然后将用户的输入打印出来。该程序使用了一个未经过初始化的字符串地址 string,因此,编译并运行之后,将出现 Segment Fault 错误:<br>
<br>
$ gcc -o test -g test.c<br>
$ ./test<br>
Please input a string: asfd<br>
Segmentation fault (core dumped)<br>
<br>
为了查找该程序中出现的问题,我们利用 gdb,并按如下的步骤进行:<br>
<br>
1.运行 gdb bugging 命令,装入 bugging 可执行文件;<br>
2.执行装入的 bugging 命令;<br>
3.使用 where 命令查看程序出错的地方;<br>
4.利用 list 命令查看调用 gets 函数附近的代码;<br>
5.唯一能够导致 gets 函数出错的因素就是变量 string。用 print 命令查看 string 的值;<br>
6.在 gdb 中,我们可以直接修改变量的值,只要将 string 取一个合法的指针值就可以了,为<br>
此,我们在第 11 行处设置断点;<br>
7.程序重新运行到第 11 行处停止,这时,我们可以用 set variable 命令修改 string 的取值;<br>
8.然后继续运行,将看到正确的程序运行结果。<br>
<br>
<br>
<br>
[目录]<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
<br>
gcc常用选项对代码的影响<br>
<br>
by alert7<br>
2001-12-21<br>
测试环境 redhat 6.2<br>
★ 前言<br>
本文讨论gcc的一些常用编译选项对代码的影响。当然代码变了,它的内存布局也就会变了,随之exploit也就要做相应的变动。<br>
gcc的编译选项实在太多,本文检了几个最常用的选项。<br>
<br>
★ 演示程序<br>
[alert7@redhat62 alert7]$ cat &gt; test.c<br>
#include<br>
void hi(void)<br>
{<br>
printf("hi");<br>
}<br>
int main(int argc, char *argv[])<br>
{<br>
hi();<br>
return 0;<br>
}<br>
<br>
<br>
<br>
[目录]<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
<br>
一般情况<br>
<br>
★ 一般情况<br>
[alert7@redhat62 alert7]$ gcc -o test test.c<br>
[alert7@redhat62 alert7]$ wc -c test<br>
11773 test<br>
[alert7@redhat62 alert7]$ gdb -q test<br>
(gdb) disass main<br>
Dump of assembler code for function main:<br>
0x80483e4 : push %ebp<br>
0x80483e5 : mov %esp,%ebp<br>
0x80483e7 : call 0x80483d0<br>
0x80483ec : xor %eax,%eax<br>
0x80483ee : jmp 0x80483f0<br>
0x80483f0 : leave<br>
0x80483f1 : ret<br>
....<br>
End of assembler dump.<br>
(gdb) disass hi<br>
Dump of assembler code for function hi:<br>
0x80483d0 : push %ebp<br>
0x80483d1 : mov %esp,%ebp<br>
0x80483d3 : push $0x8048450<br>
0x80483d8 : call 0x8048308<br>
0x80483dd : add $0x4,%esp<br>
0x80483e0 : leave<br>
0x80483e1 : ret<br>
0x80483e2 : mov %esi,%esi<br>
End of assembler dump.<br>
来看看部分的内存映象<br>
(内存高址)<br>
+--------+<br>
|bffffbc4| argv的地址(即argv[0]的地址)<br>
0xbffffb84 +--------+<br>
|00000001| argc的值<br>
0xbffffb80 +--------+<br>
|400309cb|main的返回地址<br>
0xbffffb7c +--------+ &lt;-- 调用main函数前的esp<br>
|bffffb98| 调用main函数前的ebp<br>
0xbffffb78 +--------+ &lt;-- main函数的ebp<br>
|080483ec| hi()的返回地址<br>
0xbffffb74 +--------+<br>
|bffffb78| 调用hi()前的esp<br>
0xbffffb70 +--------+<br>
|08048450| "hi"的地址<br>
0xbffffb6c +--------+<br>
| ...... |<br>
(内存低址)<br>
leave 指令所做的操作相当于MOV ESP,EBP 然后 POP EBP<br>
ret 指令所做的操作相当于POP EIP<br>
<br>
<br>
[目录]<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
<br>
-O 编译选项<br>
<br>
★ -O 编译选项<br>
With `-O', the compiler tries to reduce code size and execution time.<br>
When you specify `-O', the two options `-fthread-jumps' and<br>
`-fdefer-pop' are turned on<br>
优化,减少代码大小和执行的时间<br>
[alert7@redhat62 alert7]$ gcc -O -o test test.c<br>
[alert7@redhat62 alert7]$ wc -c test<br>
11757 test<br>
[alert7@redhat62 alert7]$ gdb -q test<br>
(gdb) disass main<br>
Dump of assembler code for function main:<br>
0x80483d8 : push %ebp<br>
0x80483d9 : mov %esp,%ebp<br>
0x80483db : call 0x80483c8<br>
0x80483e0 : xor %eax,%eax<br>
0x80483e2 : leave<br>
0x80483e3 : ret<br>
0x80483e4 : nop<br>
...<br>
End of assembler dump.<br>
(gdb) disass hi<br>
Dump of assembler code for function hi:<br>
0x80483c8 : push %ebp<br>
0x80483c9 : mov %esp,%ebp<br>
0x80483cb : push $0x8048440<br>
0x80483d0 : call 0x8048308<br>
0x80483d5 : leave<br>
0x80483d6 : ret<br>
0x80483d7 : nop<br>
End of assembler dump.<br>
在main()中,把一条jmp指令优化掉了,很显然,这条指令是可以不需要的。<br>
在hi()中,把add $0x4,%esp优化掉了,这会不会使stack不平衡呢?<br>
<br>
来看看部分的内存映象<br>
<br>
(内存高址)<br>
+--------+<br>
|bffffbc4| argv的地址(即argv[0]的地址)<br>
0xbffffb84 +--------+<br>
|00000001| argc的值<br>
0xbffffb80 +--------+<br>
|400309cb|main的返回地址<br>
0xbffffb7c +--------+ &lt;-- 调用main函数前的esp<br>
|bffffb98| 调用main函数前的ebp<br>
0xbffffb78 +--------+ &lt;-- main函数的ebp<br>
|080483e0| hi()的返回地址<br>
0xbffffb74 +--------+<br>
|bffffb78| 调用hi()前的esp<br>
0xbffffb70 +--------+<br>
|08048440| "hi"的地址<br>
0xbffffb6c +--------+<br>
| ...... |<br>
(内存低址)<br>
leave指令所做的操作相当于把MOV ESP,EBP 然后 POP EBP。看到leave指令操作了没有,先把ebp--&gt;esp,再pop ebp,这样即使在过程内堆栈的esp,ebp是不平衡的,但只要返回时候碰到leave指令就会平衡了,所以把add $0x4,%esp优化掉也是没有问题的。<br>
<br>
<br>
<br>
<br>
<br>
[目录]<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
<br>
-O2 编译选项<br>
<br>
★ -O2 编译选项<br>
-O2<br>
Optimize even more. Nearly all supported optimizations that do<br>
not involve a space-speed tradeoff are performed. Loop unrolling<br>
and function inlining are not done, for example. As compared to -O,<br>
this option increases both compilation time and the performance of<br>
the generated code.<br>
[alert7@redhat62 alert7]$ gcc -O2 -o test test.c<br>
[alert7@redhat62 alert7]$ wc -c test<br>
11757 test<br>
[alert7@redhat62 alert7]$ gdb -q test<br>
(gdb) disass main<br>
Dump of assembler code for function main:<br>
0x80483d8 : push %ebp<br>
0x80483d9 : mov %esp,%ebp<br>
0x80483db : call 0x80483c8<br>
0x80483e0 : xor %eax,%eax<br>
0x80483e2 : leave<br>
0x80483e3 : ret<br>
...<br>
0x80483ef : nop<br>
End of assembler dump.<br>
(gdb) disass hi<br>
Dump of assembler code for function hi:<br>
0x80483c8 : push %ebp<br>
0x80483c9 : mov %esp,%ebp<br>
0x80483cb : push $0x8048440<br>
0x80483d0 : call 0x8048308<br>
0x80483d5 : leave<br>
0x80483d6 : ret<br>
0x80483d7 : nop<br>
End of assembler dump.<br>
由于程序比较简单,再优化也没有好优化的了,所以跟-O出来的一样。<br>
<br>
<br>
<br>
[目录]<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
<br>
-fomit-frame-pointer 编译选项<br>
<br>
★ -fomit-frame-pointer 编译选项<br>
-fomit-frame-pointer<br>
Don't keep the frame pointer in a register for functions<br>
that don't need one. This avoids the instructions to save,<br>
set up and restore frame pointers; it also makes an extra<br>
register available in many functions. It also makes<br>
debugging impossible on most machines.<br>
忽略帧指针。这样在程序就不需要保存,安装,和恢复ebp了。这样ebp也就是一个free的register了,在函数中就可以随便使用了。<br>
<br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -