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

📄 8.html

📁 介绍linux下文件和设备编程
💻 HTML
📖 第 1 页 / 共 5 页
字号:
static char buff [256];<br>static char* string;<br>int main ()<br>{<p>&nbsp;&nbsp;&nbsp; printf (&quot;Please input a string: &quot;);<br>&nbsp;&nbsp;&nbsp; gets (string);<p>&nbsp;&nbsp;&nbsp; printf (&quot;\nYour string is: %s\n&quot;, string);<br>}<br>-----------------<p>&nbsp;&nbsp;&nbsp; 上面这个程序非常简单,其目的是接受用户的输入,然后将用户的输入打印出来。该程序使用了一个未经过初始化的字符串地址 string,因此,编译并运行之后,将出现 Segment Fault 错误:<p>$ gcc -o test -g test.c<br>$ ./test<br>Please input a string: asfd<br>Segmentation fault (core dumped)<p>为了查找该程序中出现的问题,我们利用 gdb,并按如下的步骤进行:<p>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.然后继续运行,将看到正确的程序运行结果。<p><p><center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I198" ID="I198"></A><center><b><font size=+2>gcc常用选项对代码的影响</font></b></center><br>by alert7<br>2001-12-21<br>测试环境 redhat 6.2<p>★ 前言<br>&nbsp;&nbsp;&nbsp; 本文讨论gcc的一些常用编译选项对代码的影响。当然代码变了,它的内存布局也就会变了,随之exploit也就要做相应的变动。<br>gcc的编译选项实在太多,本文检了几个最常用的选项。<p>★ 演示程序<br>[alert7@redhat62 alert7]$ cat &gt; test.c<br>#include<br>void hi(void)<br>{<br>printf(&quot;hi&quot;);<br>}<br>int main(int argc, char *argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hi();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>}<p><p><center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I199" ID="I199"></A><center><b><font size=+2>一般情况</font></b></center><br>★ 一般情况<br>[alert7@redhat62 alert7]$ gcc -o test test.c<br>[alert7@redhat62 alert7]$ wc -c test<br>&nbsp; 11773 test<br>[alert7@redhat62 alert7]$ gdb -q test<br>(gdb) disass main<br>Dump of assembler code for function main:<br>0x80483e4 :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; %ebp<br>0x80483e5 :&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; %esp,%ebp<br>0x80483e7 :&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp; 0x80483d0<br>0x80483ec :&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp; %eax,%eax<br>0x80483ee :&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp;&nbsp; 0x80483f0<br>0x80483f0 :&nbsp;&nbsp;&nbsp; leave<br>0x80483f1 :&nbsp;&nbsp;&nbsp; ret<br>....<br>End of assembler dump.<br>(gdb) disass hi<br>Dump of assembler code for function hi:<br>0x80483d0 :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; %ebp<br>0x80483d1 :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; %esp,%ebp<br>0x80483d3 :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; $0x8048450<br>0x80483d8 :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp; 0x8048308<br>0x80483dd :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp; $0x4,%esp<br>0x80483e0 :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; leave<br>0x80483e1 :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret<br>0x80483e2 :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; %esi,%esi<br>End of assembler dump.<br>来看看部分的内存映象<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (内存高址)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +--------+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |bffffbc4| argv的地址(即argv[0]的地址)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xbffffb84 +--------+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |00000001| argc的值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xbffffb80 +--------+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |400309cb|main的返回地址<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xbffffb7c +--------+ &lt;-- 调用main函数前的esp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |bffffb98| 调用main函数前的ebp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xbffffb78 +--------+ &lt;-- main函数的ebp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |080483ec| hi()的返回地址<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xbffffb74 +--------+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |bffffb78| 调用hi()前的esp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xbffffb70 +--------+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |08048450| &quot;hi&quot;的地址<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xbffffb6c +--------+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | ...... |<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (内存低址)<br>leave&nbsp;&nbsp;&nbsp; 指令所做的操作相当于MOV ESP,EBP 然后 POP EBP<br>ret&nbsp;&nbsp;&nbsp; 指令所做的操作相当于POP EIP<p><p><center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I200" ID="I200"></A><center><b><font size=+2>-O 编译选项</font></b></center><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&nbsp; on<br>优化,减少代码大小和执行的时间<br>[alert7@redhat62 alert7]$ gcc -O -o test test.c<br>[alert7@redhat62 alert7]$ wc -c test<br>&nbsp; 11757 test<br>[alert7@redhat62 alert7]$ gdb -q test<br>(gdb) disass main<br>Dump of assembler code for function main:<br>0x80483d8 :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; %ebp<br>0x80483d9 :&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; %esp,%ebp<br>0x80483db :&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp; 0x80483c8<br>0x80483e0 :&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp; %eax,%eax<br>0x80483e2 :&nbsp;&nbsp;&nbsp; leave<br>0x80483e3 :&nbsp;&nbsp;&nbsp; ret<br>0x80483e4 :&nbsp;&nbsp;&nbsp; nop<br>...<br>End of assembler dump.<br>(gdb) disass hi<br>Dump of assembler code for function hi:<br>0x80483c8 :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; %ebp<br>0x80483c9 :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; %esp,%ebp<br>0x80483cb :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; $0x8048440<br>0x80483d0 :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp; 0x8048308<br>0x80483d5 :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; leave<br>0x80483d6 :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret<br>0x80483d7 :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nop<br>End of assembler dump.<p>&nbsp;&nbsp;&nbsp; 在main()中,把一条jmp指令优化掉了,很显然,这条指令是可以不需要的。<br>&nbsp;&nbsp;&nbsp; 在hi()中,把add $0x4,%esp优化掉了,这会不会使stack不平衡呢?<p>&nbsp;&nbsp;&nbsp; 来看看部分的内存映象<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (内存高址)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +--------+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |bffffbc4| argv的地址(即argv[0]的地址)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xbffffb84 +--------+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |00000001| argc的值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xbffffb80 +--------+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |400309cb|main的返回地址<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xbffffb7c +--------+ &lt;-- 调用main函数前的esp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |bffffb98| 调用main函数前的ebp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xbffffb78 +--------+ &lt;-- main函数的ebp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |080483e0| hi()的返回地址<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xbffffb74 +--------+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |bffffb78| 调用hi()前的esp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xbffffb70 +--------+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |08048440| &quot;hi&quot;的地址<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xbffffb6c +--------+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | ...... |<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (内存低址)<br>&nbsp;&nbsp;&nbsp; leave指令所做的操作相当于把MOV ESP,EBP 然后 POP EBP。看到leave指令操作了没有,先把ebp--&gt;esp,再pop ebp,这样即使在过程内堆栈的esp,ebp是不平衡的,但只要返回时候碰到leave指令就会平衡了,所以把add $0x4,%esp优化掉也是没有问题的。<p><p><br><center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I201" ID="I201"></A><center><b><font size=+2>-O2 编译选项</font></b></center><br>★ -O2 编译选项<br>-O2<br>&nbsp;&nbsp;&nbsp; Optimize&nbsp; even more.&nbsp; Nearly all supported optimizations that do<br>&nbsp;&nbsp;&nbsp; not involve a space-speed tradeoff are performed.&nbsp; Loop unrolling<br>&nbsp;&nbsp;&nbsp; and function inlining are not done, for example.&nbsp; As compared to -O,<br>&nbsp;&nbsp;&nbsp; this option increases both compilation time and the performance of<br>&nbsp;&nbsp;&nbsp; the generated code.<br>[alert7@redhat62 alert7]$ gcc -O2 -o test test.c<br>[alert7@redhat62 alert7]$ wc -c test<br>&nbsp; 11757 test<br>[alert7@redhat62 alert7]$ gdb -q test<br>(gdb) disass main<br>Dump of assembler code for function main:<br>0x80483d8 :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; %ebp<br>0x80483d9 :&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; %esp,%ebp<br>0x80483db :&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp; 0x80483c8<br>0x80483e0 :&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp; %eax,%eax<br>

⌨️ 快捷键说明

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