You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从文本文件读取Shellcode并保持缓冲区长度一致执行?

问题:从文本文件读取Shellcode时缓冲区长度异常且无法执行

正常场景(直接定义Shellcode)

直接在PowerShell中定义Shellcode字节数组时,能正常得到长度为8的缓冲区:

$code = 0xe8,0x3b,0x3d,0x03,0x00,0x3b,0x3d,0x03
$code.GetType()
[Byte[]] $buf = $code
$buf.Length

执行输出:

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
8

异常场景(从文本文件读取)

将Shellcode保存到文本文件后,直接读取并转换为字符数组时,缓冲区长度变为39且无法执行:

$codes = @(Get-Content -Raw C:\Users\abc\Downloads\code.txt)
$codes.GetType()
[Byte[]] $buf = $codes.ToCharArray()
echo $buf.Length

执行输出:

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
39

解决方案

问题根源是直接调用ToCharArray()会把文本中的每个字符(包括0、x、e、8、,这些符号)都转换成单个字节,导致长度膨胀。正确的做法是解析文本中的十六进制值,转换为Byte数组:

步骤1:确保文本文件格式正确

文本文件code.txt中保存的内容应为:

0xe8,0x3b,0x3d,0x03,0x00,0x3b,0x3d,0x03

步骤2:正确读取并转换的PowerShell代码

# 读取文本文件的原始内容
$codeContent = Get-Content -Raw C:\Users\abc\Downloads\code.txt

# 去除首尾空白,按逗号分割成单个十六进制字符串
$hexValues = $codeContent.Trim() -split ',' | ForEach-Object { $_.Trim() }

# 将每个十六进制字符串转换为Byte类型,生成目标数组
[Byte[]]$buf = $hexValues | ForEach-Object {
    [Convert]::ToByte($_, 16)
}

# 验证缓冲区长度
$buf.Length

执行这段代码后,$buf.Length会输出8,和直接定义的数组长度一致,后续可正常用于Shellcode执行。


内容的提问来源于stack exchange,提问作者Vikas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:55:21