alphasec academy

Add-Type -t 'public class Foo { public static void Main(){ System.Console.WriteLine("Ciekawe te protipy!");}}';[Foo]::Main() - uruchom kod C# prosto z PowerShella

Dodatkowe informacje

Cmdlet Add-Type pozwala nam zdefiniować klasę .NET (lub .NET Core) dla bieżącej sesji PowerShella, którą następnie możemy wykorzystywać. Domyślnym językiem programowania dla klasy jest C#, jednak można to zmienić za pomocą parametru
-Language
. Kod źródłowy podajemy w parametrze
-TypeDefinition
(co możemy skrócić do
-t
). W wyniku uruchomienia tego onelinera, otrzymamy:
PS C:\Users\drg> Add-Type -t 'public class Foo { public static void Main(){ System.Console.WriteLine("Ciekawe te protipy!");}}';[Foo]::Main()
Ciekawe te protipy!
PS C:\Users\drg>
Oczywiście możemy to zapisać w bardziej czytelny sposób:
$code = @"
public class Foo { 
    public static void Main() { 
        System.Console.WriteLine("Ciekawe te protipy!");
    }
}
"@

Add-Type -TypeDefinition $code -Language CSharp
[Foo]::Main()

Kompilowanie do pliku wykonywalnego

Wykorzystując parametr
-OutputAssembly
możemy dokonać kompilacji do pliku wykonywalnego (np. .exe czy .dll). A zatem moglibyśmy wykonać coś takiego:
PS C:\Users\drg> Add-Type -t 'public class Foo { public static void Main(){ System.Console.WriteLine("Ciekawe te protipy!");}}' -OutputAssembly foo.exe
PS C:\Users\drg> .\foo.exe
Ciekawe te protipy!
PS C:\Users\drg>
Polecam zapoznać się z manualem, ponieważ w ten sposób można kompilować zupełnie poważne programy.

Go deeper

Podczas takiej powiedzmy sobie niejawnej kompilacji, wykorzystywany jest domyślnie instalowany wraz z .NET kompilator
csc.exe
. Jeśli chcielibyście mieć na to niezbity dowód, możemy wykorzystać rejestrową sztuczkę z Debuggerem i ustawić Debugger dla
csc.exe
na przykład na
calc.exe
:
ni -f "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\csc.exe" | sp -name Debugger -Value "calc.exe #"
Oczywiście, by dodać ten wpis musimy mieć uprawnienia administratora. Kiedy Debugger dla
csc.exe
jest zdefiniowany, kolejne wywołanie naszych przykładowych
Add-Type
nie zwróci oczekiwanych rezultatów, natomiast powinien uruchomić się kalkulator.

Więcej na ten temat przeczytasz w protipach 005d oraz 0008.

By posprzątać po sobie, możemy usunąć wartość Debbuger dla
csc.exe
:
Remove-ItemProperty  "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\csc.exe" -Name Debugger
lub usunąć cały element
csc.exe
:
Remove-Item  "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\csc.exe"

Przydatne linki


Subskrybuj

Jeśli chcesz otrzymywać nowe, mięsiste protipy na maila, a także zostać czasem powiadomiony o wartościowych wydarzeniach - dołącz do subskrybentów.