惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Full Disclosure
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
Secure Thoughts
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Security Latest
Security Latest
Project Zero
Project Zero
Apple Machine Learning Research
Apple Machine Learning Research
Cyberwarzone
Cyberwarzone
V
Visual Studio Blog
S
SegmentFault 最新的问题
月光博客
月光博客
Cisco Talos Blog
Cisco Talos Blog
Simon Willison's Weblog
Simon Willison's Weblog
NISL@THU
NISL@THU
Security Archives - TechRepublic
Security Archives - TechRepublic
Webroot Blog
Webroot Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
量子位
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
P
Privacy & Cybersecurity Law Blog
博客园 - 叶小钗
博客园 - 聂微东
O
OpenAI News
有赞技术团队
有赞技术团队
V2EX - 技术
V2EX - 技术
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
博客园 - 司徒正美
S
Security Affairs
J
Java Code Geeks
WordPress大学
WordPress大学
Schneier on Security
Schneier on Security
S
Security @ Cisco Blogs
Jina AI
Jina AI
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
GbyAI
GbyAI
M
MIT News - Artificial intelligence
T
Tailwind CSS Blog
腾讯CDC
Help Net Security
Help Net Security
Know Your Adversary
Know Your Adversary
N
News and Events Feed by Topic
T
Troy Hunt's Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog
云风的 BLOG
云风的 BLOG
IT之家
IT之家
T
Threat Research - Cisco Blogs
罗磊的独立博客

博客园 - nasiry

转入墙内:SAS HBA crossflashing or flashing to IT mode, Dell Perc H200 and H310 从下往上看--新皮层资料的读后感 第四部分 来自神经元的设计-perceptron 感知机 从下往上看--新皮层资料的读后感 第三部分 70年前的逆向推演- 从NN到ANN 从下往上看--新皮层资料的读后感 第二部分:突触Synapses 从下往上看--新皮层资料的读后感 第一部分:皮层细胞 Android 6编译环境搭建 (Marshmallow) aliyun source.list 建站随手记:installation python virtualenv mezzanine -1 建站随手记:about server stack 摘抄---USB RNDIS/CDC White Paper January 15, 2003 摘抄--Multithreaded Programming on the Pocket PC with Visual C++ Touchpad驱动分析 摘录----What Is MTP? (Sidebar) 摘录---PlaysForSure/Napster to Go Testing 摘录---Windows CE API机制初探 摘录---Hacking Windows CE 串口驱动分析-未完成 摘抄--------See mips RUN中文版 摘抄---非技术---追梦—SQUARE大传
指针错位导致对FSD误判
nasiry · 2006-04-21 · via 博客园 - nasiry

FSD管理器实现中有如下代码
DWORD CStore::OpenDisk()
{
    DWORD dwError = ERROR_SUCCESS;
    STORAGE_IDENTIFICATION storageid;

    if (m_pBlockDevice) {
        m_hDisk = m_pBlockDevice->OpenBlockDevice();
    } else {
        m_hDisk = CreateFileW(m_szDeviceName,
                           GENERIC_READ | GENERIC_WRITE,
                           0,
                           NULL, OPEN_EXISTING, 0, NULL);
   
        if (m_hDisk == INVALID_HANDLE_VALUE) {
            dwError = GetLastError();
            if (dwError == ERROR_ACCESS_DENIED) {
                dwError = ERROR_SUCCESS;
                m_hDisk = CreateFileW(m_szDeviceName,
                                   GENERIC_READ,
                                   FILE_SHARE_READ,
                                   NULL, OPEN_EXISTING, 0, NULL);
                if (m_hDisk != INVALID_HANDLE_VALUE) {
                    m_dwFlags |= STORE_ATTRIBUTE_READONLY;
                } else {
                    dwError = GetLastError();
                }   
            }   
        }
    }  
    if (m_hDisk != INVALID_HANDLE_VALUE) {
        DWORD dwRet;
        if (!::DeviceIoControl(m_hDisk, DISK_IOCTL_GETINFO, &m_di, sizeof(DISK_INFO), NULL, 0, &dwRet, NULL)) {
            dwError = GetLastError();
            if ((dwError == ERROR_BAD_COMMAND) || (dwError == ERROR_NOT_SUPPORTED)){
                memset( &m_di, 0, sizeof(DISK_INFO));  
                dwError = ERROR_SUCCESS;
            }
        }
        if (dwError == ERROR_SUCCESS) {
            if (!::DeviceIoControl( m_hDisk, IOCTL_DISK_DEVICE_INFO, &m_sdi, sizeof(STORAGEDEVICEINFO), NULL, 0, &dwRet, NULL)) {
                DEBUGMSG( ZONE_INIT, (L"FSDMGR!CStore::OpenDisk(0x%08X) call to IOCTL_DISK_DEVICE_INFO failed..filling info\r\n", this));
                m_sdi.dwDeviceClass = STORAGE_DEVICE_CLASS_BLOCK;
                m_sdi.dwDeviceFlags = STORAGE_DEVICE_FLAG_READWRITE;
                m_sdi.dwDeviceType = STORAGE_DEVICE_TYPE_UNKNOWN;
                wcscpy( m_sdi.szProfile, L"Default");
            }
        }   
        DEBUGMSG( ZONE_INIT, (L"FSDMGR!CStore::OpenDisk(0x%08X) DeviceInfo Class(0x%08X) Flags(0x%08X) Type(0x%08X) Profile(%s)\r\n",
            this,
            m_sdi.dwDeviceClass,
            m_sdi.dwDeviceFlags,
            m_sdi.dwDeviceType,
            m_sdi.szProfile));
        SetLastError( ERROR_SUCCESS);   
        dwError = ::DeviceIoControl(m_hDisk, IOCTL_DISK_GET_STORAGEID, NULL, 0, &storageid, sizeof(STORAGE_IDENTIFICATION), &dwRet, NULL);
        if (ERROR_INSUFFICIENT_BUFFER == GetLastError()) {
            m_pStorageId = new BYTE[storageid.dwSize];
            ::DeviceIoControl(m_hDisk, IOCTL_DISK_GET_STORAGEID, NULL, 0, m_pStorageId, storageid.dwSize, &dwRet, NULL);
        }
       
    }
    return dwError;
}
IOCTL_DISK_GET_STORAGEID 返回的内容除去STORAGE_IDENTIFICATION 结构外还有附加的信息,这样就会执行后面的条件。我的驱动在代码执行时竟然会影响到dwError位,导致程序的返回内容不正确。故意由于storageid和dwError都为上述函数的栈空间内,自己写的IOCTL访问指针时错位,导致OpenDisk局部变量受影响所导致。

察看反编译结果后发现后发现,两个的变量的指针位置刚好相邻
dwError -> 0x040ef83c

storageid->0x040ef82c

在没有检查传入buffer长度的情况下直接写入了跟随的信息,导致OpenDisk出错。