如何从文本文件读取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
相关产品推荐
相关产品推荐

