Назад | Перейти на главную страницу

Powershell: выполнение команд Base64 возвращает ошибку?

Мне нужна помощь в простом тестовом примере выполнения команды CLI через PowerShell, которая уже была закодирована в Base64.

Предположим Get-ChildItem был заранее преобразован в строку Base64 R2V0LUNoaWxkSXRlbQ==.

Далее предположим, что у меня открыт экземпляр CLI DOS, и я хочу протестировать выполнение этой строки в 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

Я понимаю, что есть способ, который вводит использование переменных и даже включает сам процесс кодирования. Но я хочу знать, можно ли спасти этот метод? Что я делаю не так? Я использую PS версии 2.0 в Win7.

Если его необходимо закодировать, используйте следующее, чтобы получить строку Base64:

[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes('Get-ChildItem'))

Попытка этого сработала для меня:

powershell.exe -encodedCommand RwBlAHQALQBDAGgAaQBsAGQASQB0AGUAbQA=

Чтобы добавить к ответу @ 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=

Кодировка символов, используемая powershell является UTF-16LE.

Итак, если вы кодируете свою строку из Linux на базе ОС, вы можете использовать iconv сделать вывод совместимым с powershell:

$ printf 'whoami' | iconv -t UTF-16LE | base64
dwBoAG8AYQBtAGkA
$ powershell -EncodedCommand 'dwBoAG8AYQBtAGkA'
user1