我需要帮助完成一个简单的测试用例,即通过 PowerShell 执行一个已经用 Base64 编码的 CLI 命令。
假设Get-ChildItem
已经提前转换为Base64字符串R2V0LUNoaWxkSXRlbQ==
。
进一步假设我打开了一个 DOS CLI 实例,并且我想测试在 powershell 中执行此字符串:
C:>\ powershell.exe -enc R2V0LUNoaWxkSXRlbQ==
但是,我收到以下错误:
The term '???????' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:8
*??????? <<<<
+ CategoryInfo :ObjectNotFound: (???????:String) [], CommandNotFoundException
+ FullyQualifiedErrorID: CommandNotFoundException
我知道有一种方法可行,即引入变量的使用,甚至包括编码过程本身。但我想知道的是,这种方法可以挽救吗?我可能做错了什么?我在 Win7 中运行的是 PS 2.0 版。
答案1
如果必须进行编码,请使用以下命令获取 Base64 字符串:
[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes('Get-ChildItem'))
尝试这个对我有用:
powershell.exe -encodedCommand RwBlAHQALQBDAGgAaQBsAGQASQB0AGUAbQA=
答案2
补充@SomethingElse的答案,不起作用的Base64字符串和起作用的Base64字符串之间的区别在于将原始字符串转换为字节值时使用的字符编码。
它需要被编码为 UTF-16-LE,然后转换为 Base64 以便 PowerShell 能够接受它,并且您的被编码为 UTF8/plain ASCII。
# Your version, with 1-byte-per-character encoding:
PS> [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes('Get-ChildItem'))
R2V0LUNoaWxkSXRlbQ==
# Working version, with 2-bytes-per-character encoding:
PS> [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes('Get-ChildItem'))
RwBlAHQALQBDAGgAaQBsAGQASQB0AGUAbQA=
答案3
使用的字符编码powershell
是UTF-16LE
。
因此,如果你对字符串进行编码Linux基于操作系统,您可以使用它iconv
来使输出兼容powershell
:
$ printf 'whoami' | iconv -t UTF-16LE | base64
dwBoAG8AYQBtAGkA
$ powershell -EncodedCommand 'dwBoAG8AYQBtAGkA'
user1