挑战:
用您选择的编程语言,关闭在其上执行代码的计算机。
规则
- 不会因资源耗尽而关闭(例如:Forkbomb强制关闭)
- 如果需要,您可以编写仅在特定环境/ OS中工作的代码。
- 禁止出现标准漏洞
这是代码高尔夫球,因此赢得了最低的字节数!
`whatever`;
Bash / Perl / PHP / Ruby / etc。愚蠢的人。
shatdown: past tense of the verb shutdown
用您选择的编程语言,关闭在其上执行代码的计算机。
这是代码高尔夫球,因此赢得了最低的字节数!
`whatever`;
Bash / Perl / PHP / Ruby / etc。愚蠢的人。
shatdown: past tense of the verb shutdown
Answers:
mov $0x58, %al # 2 bytes: b0 58
mov $0xfee1dead, %ebx # 5 bytes: bb ad de e1 fe
mov $0x28121969, %ecx # 5 bytes: b9 69 19 12 28
mov $0x4321fedc, %edx # 5 bytes: ba dc fe 21 43
int $0x80 # 2 bytes: cd 80
必须以root身份运行。
这等效于按下电源按钮,而不是关闭PC电源的安全方法。sync
在执行该程序之前,请确保关闭所有打开的应用程序并执行以刷新所有文件系统缓冲区的操作,以至少将文件损坏的风险降到最低。
$ as -o poweroff.o poweroff.s
$ ld -o poweroff poweroff.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000000400078
$ sudo sh -c 'sync && ./poweroff'
root's password:
其次是黑暗。
int $0x80
调用软件中断。它可以在x86和x64上运行,但是已经过了十多年了,不应该在生产代码中使用。应该使用x64代码syscall
代替。x86应该使用sysenter
,但是对于代码高尔夫来说太麻烦了。
系统调用产生的操作取决于寄存器EAX-EDX,EDI和EDI。《Linux Syscall参考》显示了可通过访问的所有syscall int $0x80
。
当EAX保持为0x58(88)时,将调用重新启动,该重新启动还可用于关闭计算机的电源,使其进入睡眠或休眠状态,以及切换内核并禁用或启用Ctrl-Alt-Del键组合。
在程序开始时–并且通过使用as
or 进行编译gcc -nostdlib
,我们可以确保我们实际上是在程序开始时–大多数寄存器都设置为0。这包括EAX,因此我们可以mov $0x58, %al
用来将EAX的低8位设置为0x58,从而将EAX本身设置为0x58。与手动将寄存器清零相比,这节省了两个字节,xor %eax, %eax
而在将32位0x58mov $0x58, %eax
编码的straightforward中又节省了一个字节。
重新引导的前两个参数是幻数,大概是为了防止意外重新引导,并且从寄存器EBX和ECX中读取。除非这些数字等于某些常数,否则重新启动将拒绝执行任何操作。
第一个幻数必须等于0xfee1dead(感觉死了),可能是指PC断电/死机。
第二个幻数可以等于四个不同的常数,尽管后三个在古代版本的Linux中不起作用。所有这些似乎都指随后的PC开机/诞生。
0x28121969代表Linus Torvalds的生日(1969年12月28日)。
0x05121996代表Patricia Torvalds的生日(1996年12月5日)。
0x16041998代表Daniela Torvalds的生日(1998年4月16日)。
0x20112000代表Celeste Torvalds的生日(2000年11月20日)。
帕特里夏(Patricia),丹妮拉(Daniela)和Celeste Torvalds是Linus Torvalds的三个女儿。
EDX寄存器选择所需的“重新引导”类型。0x4321fedc是RB_POWER_OFF,关闭PC并关闭电源。
最后,对于RB_POWER_OFF,将忽略ESI寄存器的值;重新启动将完全忽略EDI寄存器的值。
在x64上,我们可以对相同的字节数使用适当的syscall。
mov $0xa9, %al # 2 bytes: b0 a9
mov $0xfee1dead, %edi # 5 bytes: bf ad de e1 fe
mov $0x28121969, %esi # 5 bytes: be 69 19 12 28
mov $0x4321fedc, %edx # 5 bytes: ba dc fe 21 43
syscall # 2 bytes: 0f 05
唯一的区别在于指令(syscall
vs int $0x80
),__ NR_REBOOT的值(0xa9与0x58)以及所涉及的寄存器。
fee1
所以dead
现在。
Stop-Computer
很不言自明?在PowerShell核心上不起作用,因此在Linux / MacOS的PowerShell上也不起作用(已经在TIO :-D上尝试过)。
gcm s*r|iex
在我的测试中,这在带有PowerShell 2.0的Windows 2003上有效。它不适用于大多数较新的版本,并且可能无法正常运行,具体取决于安装了哪些模块。太可怕了!
这将在命令列表中搜索带有该模式的任何命令s*r
,然后运行所有命令!要清楚,这很危险,请不要这样做!
当然,技巧是获取没有任何必需参数的命令列表,否则PowerShell将提示您输入值。
在我的2003机器上,它返回的3条命令是:
CommandType Name Definition ----------- ---- ---------- Application scrnsave.scr C:\WINDOWS\system32\scrnsave.scr Application ssmarque.scr C:\WINDOWS\system32\ssmarque.scr Cmdlet Stop-Computer Stop-Computer [[-ComputerName] <String[]>] [[-Cr...
是的,它确实启动了字幕屏幕保护程序,但没有,它不等待启动完成Stop-Computer
。
再次取决于安装的模块,此方法可以在较新的计算机上使用,但是我在Windows 2012和2016上能做的最好的事情是14个字节:
gcm sto*er|iex
(是的,可以肯定,winbatch提交可以在PowerShell中运行,并且更短,但是..这没什么好玩的)
gcm *p-c*|iex
-而且也只有一个结果!
Stop-Computer
,这是最后一个结果)。
在Windows上,就足够了
shutdown/s
这将在一分钟内设置一次关机。
或者,就像@flashbang指出的那样:
shutdown/p
这将立即关闭计算机。
Press the big button on the front of your computer
= 0字节
BITS 16
mov ax, (1 << 13) | (7 << 10)
mov dx, 1804h
out dx, ax
组装成 B8 00 3C BA 04 18 EF
我正在将“ 您可以编写只允许在特定环境/ OS中使用的代码 ” (如果您愿意的话)发挥到极致:这仅适用于Lenovo Z510 1。
这写SLP_TYPa << 10 | SLP_EN
在PM1a_CNT
ACPI寄存器,我甩在ACPI表这个值个月前约关机的答案(在这里我给一些背景,以上面的代码)。
它既可以在DOS下作为COM运行(只需将二进制数据写入文件并将扩展名更改为“ com”),也可以作为引导程序运行。
对于后者,请写出标准签名,并注意现代固件的问题。
1并非完全正确,任何碰巧具有相同ACPI配置的系统也将关闭。
打高尔夫球
halt
命令:停止--no-apm
该命令将停止计算机。如果指定了--no-apm选项,则不会执行APM BIOS调用。否则,将使用APM关闭计算机。
奖金
这是一个证明,GRUB外壳确实是图尔ñ荷兰国际集团完成(见注释):
STP指令(0xDB):
STP停止65C02的时钟输入,有效地关闭65C02,直到发生硬件复位(即RES引脚变为低电平)。这会使65C02进入低功耗状态。这对于要求低功耗的应用(电路)很有用,但很少会看到STP。
(来源:http : //www.6502.org/tutorials/65c02opcodes.html)
xxd转储:
00000000: db .
system('shutdown -s')
我没有尝试过(在一天中关闭所有程序重新启动并不是很吸引人),但是应该可以。。这有效...
稍后我将添加简短说明,我的笔记本电脑目前已关闭。
uptime
不过
shutdown -s
作为shell 提交?
!shutdown/p
有点类似于Stewie Griffin的方法。但是,MATLAB 调用系统命令的方式更短。在这种情况下,!
使用。Windows不需要.exe
命令名称,因此也省略了。该/
选项仍受支持(我正在运行Windows 10),并且不需要空间。替代方法是:
system shutdown/p % 17 bytes; uses so-called 'command' syntax.
dos shutdown/p % 14 bytes; the 'dos' command can be used just as well.
()->{Runtime.getRuntime().exec("init 0");}
正如@Snowman指出的那样,该问题并未指定是否需要完整的程序,因此这仍然可以接受。
class
,interface
因为它使您可以public
从main 省略。
()->{Runtime.getRuntime().exec("init 0");}
或暂时()->Runtime.getRuntime().exec("init 0")
(目前无法检查)。这是一个lambda,用于实现自定义的无效,无参投掷接口。
import os;os.system('init 0')
在Linux系统上工作,并且需要root特权。
对于Windows,33个字节
import os;os.system('shutdown/p')
这可能是我编写过的最不有趣或最有用的代码。
0 sys64738
这是从BASIC提示符。要么...
*=8000
JMP $FCE2
sys64738
将使用零字节,因为没有程序或其他要存储的东西。您正在使用屏幕RAM,但是该RAM已经充满了空格,因此您只需要用文本替换这些空格即可。
0
和之间放置空格sys64738
,您可以将sys
快捷方式替换为sY
,而且我也不会在程序长度中计算结尾的换行符。但是,我认为您的代码不符合要求:64738处的代码会执行软重置,而不是关闭电源。
" "+" "
求和两个空字符串。
在较旧版本的计算器上,这将使设备崩溃并导致其重新启动(除了物理按钮组合之外,没有其他方法,除非重新启动,否则无法关闭设备)。
视频由Adriweb
-11个字节,感谢Ingve!
#include<os>
int main(){OS::shutdown();}
仅适用于IncludeOS(v0.10.0-rc.1)
测试:
$ pwd
/home/simon/IncludeOS/examples/demo_service
$ cat service.cpp
#include<os>
int main(){OS::shutdown();}
$ mkdir build && cd build && cmake .. && make && cd ..
[...]
$ boot build/IncludeOS_example
[...]
================================================================================
================================================================================
IncludeOS v0.10.0-rc.1-9-g151a2b9
+--> Running [ IncludeOS minimal example ]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$
感谢Gurupad Mamadapur节省了一个字节
Shutdown,9
AHK默认情况下支持关机命令。的9
是一个标志,由Shutdown=1
+ PowerDown=8
。
AHK
是神秘的。
,
不需要空格。尝试使用其他标志进行测试。我认为这不会立即关闭计算机,并将其放入启动时加载的主脚本中:D现在,我必须以安全模式加载并解决问题。叹。
b8 01 53 33 db cd 15 b8 07 53 bb 01 00 b9 03 00 cd 15
拆卸:
mov ax, 0x5301 ; connect to real-mode APM services
xor bx, bx ; device id 0 - APM BIOS
int 0x15 ; call APM
mov ax, 0x5307 ; set power state
mov bx, 0x0001 ; on all devices
mov cx, 0x0003 ; to Off
int 0x15 ; call APM
您可以使用以下命令在Bochs的调试器中对其进行测试(开始仿真后,设置一些磁盘驱动器):
pb 0x7c00
c
setpmem 0x7c00 4 0x335301b8
setpmem 0x7c04 4 0xb815cddb
setpmem 0x7c08 4 0x01bb5307
setpmem 0x7c0c 4 0x0003b900
setpmem 0x7c10 2 0x15cd
c
相同的机器代码也将用作DOS可执行文件(*.COM
)。
这适用于Windows。
79个字节:
class _{static void Main(){System.Diagnostics.Process.Start("shutdown","/s");}}
53字节,感谢TheLethalCoder:
_=>System.Diagnostics.Process.Start("shutdown","/s");
Action<int>
并执行_=>System.Diagnostics.Process.Start("shutdown", "/s");
54个字节。
Shutdown(1)
关机功能获得以下代码的组合
0 = Logoff
1 = Shutdown
2 = Reboot
4 = Force
8 = Power down
16= Force if hung
32= Standby
64= Hibernate
例如,要关闭电源并关闭电源,代码将为9(关闭+电源关闭= 1 + 8 = 9)。
0
(注销)在这里是一种特殊情况;它不会隐式地与Standby或Hibernate结合。
0 + 32 = 32
好的,这不是最短的版本。但也许对某些人很有趣。这将不会在Win32子系统上执行。但是,它将在本机api的上下文中执行时运行(就像autochk.exe一样)
#define WIN32_NO_STATUS
#include <windef.h>
#include <winnt.h>
#include <ntndk.h>
NTSTATUS main() {
RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE,TRUE,FALSE,NULL);
return ZwShutdownSystem(ShutdownPowerOff);
}
要构建此文件,请使用WinDDK build.exe
工具(带有的相应source
文件NMAKE
)
或使用以下命令进行编译和链接:
cl /Gd /D_X86_ /showIncludes /I%DDK_INC_PATH% /I%CRT_INC_PATH% /c main.c
link /verbose /nodefaultlib /subsystem:native /machine:X86 /entry:NtProcessStartup@4 C:\WinDDK\7600.16385.1\lib\win7\i386\nt.lib C:\WinDDK\7600.16385.1\lib\win7\i386\ntdllp.lib C:\WinDDK\7600.16385.1\lib\win7\i386\BufferOverflow.lib .\main.obj
注意:这将构建一个x86本机可执行文件。如果要针对其他体系结构进行构建,请更改相应的位。
要测试本机可执行文件,必须在加载win32子系统之前执行它。一种常见的执行方法是在以下注册表项中附加可执行文件:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\BootExecute
但是,如果执行此操作,则需要有一个选项可以从另一个OS编辑目标OS的注册表配置单元。由于您将无法再启动目标操作系统!
我是在VM上完成的,可以轻松还原到以前的快照!
'shutdown /p'.execute()
# echo o>/p*/*ger
如果碰巧在/proc
目录中,则可以将其设置为11个字节长:
# echo o>*ger
这非常简单(没有副作用,例如卸载文件系统或终止进程),并且相当残酷。
bash
在计算机上用进行了测试:-)
echo o>/p*/*ger
tell application "Finder"
shut down
end tell
我不知道AppleScript语法的工作原理或其他任何内容,因此,如果有人知道如何缩短它,请告诉我们。
另外,我正在学校的手机上进行此操作(“黑客攻击”),因此无法对其进行测试。
少了14个字节(感谢kindall),您可以说
tell app "Finder" to shut down
tell app "Finder" to shut down
我认为,它应该可以工作(尽管该编译可能会将“ app”替换为“ application”)。
Run,Shutdown -s
仅适用于Windows。
多亏了Snowman,删除了1个字节
#include<cstdlib>
main(){system("shutdown/p");}
这应该关闭Windows系统
#include<cstdlib>
main(){system("poweroff");}
这应该关闭Linux系统
;
吗?