죽음의 코드 골프 [폐쇄]


34

BSOD 또는 커널 패닉을 유발하는 코드를 작성하십시오!

규칙 :

  • Windows에서는 BugCheck (Blue Screen of Death)가 발생하고 Linux (또는 기타 * nix 시스템)에서는 커널 패닉이 발생합니다.
  • 시스템을 손상시키지 않아야합니다 (즉, 재부팅시 작동해야 함).
  • 커널 모드 드라이버가 허용됩니다.
  • OS 및 버전 정보를 명시하십시오.
  • 충돌이 어떻게 발생하는지 설명하십시오.
  • 충돌을 일으키기 위해 특별히 설계된 도구를 사용하는 것은 규칙에 위배되지는 않지만 그렇게 독창적이지는 않습니다!
  • 가장 높은 공감 률이 승리합니다.

3
@urogen-마지막으로 확인했을 때 1/0, 파일을 넣는 driver.c것이 유효한 커널 모드 드라이버를 구성하지 않습니다. 어쨌든, 승자는 코드 길이가 아닌 공감에 근거합니다.
다항식

1
최근에 메타 코드 골프를 따르지 않았습니다. "최고의지지"가 이제 허용됩니까? (이 경우라면이 웹 사이트는 100 배 더
훌륭해졌습니다

1
@minitech 그것은 객관적인 기준이므로 왜 허용해서는 안되는지 모르겠습니다.
다항식

2
@Polynomial 나는 그것을 거의 찬성했고 거의 모든 답변을 올렸으며, 커뮤니티는 이러한 종류의 도전이 허용되기를 진심으로 원하지만 SE 모델에는 맞지 않습니다.
고양이

4
악성 코드가 필요하기 때문에이 질문을 주제에 맞지 않게하기 위해 투표하고 있는데, 이는 규칙을 위반하는 것입니다. meta.codegolf.stackexchange.com/a/4831/34718
mbomb007

답변:


24

배쉬, x86 리눅스 2.6.20 커널

경고 : 다음 명령은 시스템을 영구적으로 손상시킬 수 있습니다.

cat /dev/urandom > /dev/mem

다음을 출력합니다 ( 여기를보십시오 ). 그 후 스크립트가 중단됩니다.

/var/root # cat /dev/urandom > /dev/mem                                        
BUG: unable to handle kernel paging request at virtual address 474e82a5         
 printing eip:                                                                  
c01450c4                                                                        
*pde = 00000000                                                                 
Oops: 0000 [#1]                                                                 
CPU:    0                                                                       
EIP:    0060:[<c01450c4>]    Not tainted VLI                                    
EFLAGS: 00000082   (2.6.20 #12)                                                 
EIP is at free_block+0x54/0xf0                                                  
eax: 00000000   ebx: 474e82a1   ecx: c00745c8   edx: c0005e80                   
esi: c0070ce0   edi: c002c1a0   ebp: 00000000   esp: c0085eec                   
ds: 007b   es: 007b   ss: 0068                                                  
Process events/0 (pid: 3, ti=c0084000 task=c0094030 task.ti=c0084000)           
Stack: c0076410 00000002 c0051db0 c0051db0 c0051da0 00000002 c002c1a0 c01457dd  
       00000000 c0070ce0 c002c1a0 c0091840 c0145800 c0145870 00000000 00000000  
       c02cb2a0 c02cb2a0 00000296 c011dd27 c003fab0 c0094030 c009413c 00047e6c  
Call Trace:                                                                     
 [<c01457dd>] drain_array+0x7d/0xa0                                             
 [<c0145800>] cache_reap+0x0/0x110                                              
 [<c0145870>] cache_reap+0x70/0x110                                             
 [<c011dd27>] run_workqueue+0x67/0x130                                          
 [<c011df17>] worker_thread+0x127/0x140                                                                
 [<c010c7d0>] default_wake_function+0x0/0x10                                    
 [<c010c817>] __wake_up_common+0x37/0x70                                        
 [<c010c7d0>] default_wake_function+0x0/0x10                                    
 [<c011ddf0>] worker_thread+0x0/0x140                                           
 [<c0120d94>] kthread+0x94/0xc0                                                 
 [<c0120d00>] kthread+0x0/0xc0                                                  
 [<c0102ee7>] kernel_thread_helper+0x7/0x10                                     
 =======================                                                        
Code: 04 0f 8d 8f 00 00 00 8b 44 24 08 8b 0c a8 8d 91 00 00 00 40 c1 ea 0c c1 e2

동일한 명령으로 발견 된 또 다른 예외는 다음과 같습니다.

/dev # cat urandom > mem                                                        
------------[ cut here ]------------                                            
Kernel BUG at c014514c [verbose debug info unavailable]                         
invalid opcode: 0000 [#1]                                                       
CPU:    0                                                                       
EIP:    0060:[<c014514c>]    Not tainted VLI                                    
EFLAGS: 00000046   (2.6.20 #12)                                                 
EIP is at free_block+0xdc/0xf0                                                  
eax: 1608347b   ebx: c009b010   ecx: c003f508   edx: c00057e0                   
esi: c009b000   edi: c002cd40   ebp: 00000000   esp: c0085eec                   
ds: 007b   es: 007b   ss: 0068                                                  
Process events/0 (pid: 3, ti=c0084000 task=c0094030 task.ti=c0084000)           
Stack: c009b010 00000004 c009b010 c009b010 c009b000 00000004 c002cd40 c01457dd  
       00000000 c02ddf20 c002cd40 c0091840 c0145800 c0145870 00000000 00000000  
       c02cb2a0 c02cb2a0 00000296 c011dd27 c005c5a0 c0094030 c009413c 000409ed  

6
나는 그렇게 생각한다. 큰 힘에는 큰 책임이 따른다.
복사

15
시스템 요구 사항을 손상시키지 않아야 함을 위반합니다. 충분한 시간 동안 실행하면 결국 디스크를 포맷하는 코드로 디스크 드라이버를 다시 작성합니다.
ugoren 2016 년

5
@ugoren 매우 드문 시나리오입니다. 그것은 덮어 쓰기 다른 적절한 장소에가 아니라 정확한 32 개 비트 주소와 지시의 무리를 작성해야
복사

9
"충분히 여러 번 실행하면 결국 디스크를 포맷하는 코드로 디스크 드라이버를 다시 작성하게됩니다"-확실하지 않습니다.
skeevey

3
@ugoren "시스템을 손상시키지 말 것"규칙은 다음과 같은 답변을 막기위한 것 sudo rm -Rf /입니다. 이 방법을 사용하여 시스템에 영구적으로 손상을 줄 가능성은 텍스트 해시를 기반으로 노래 가사 세트의 출력을 무차별하게 할 가능성보다 적습니다.
다항식

25

C, 16 자, P5 x86 용

main=-926478352;

F00F 버그를 모두 기억 하십니까? 이 작은 프로그램으로 하루에 한 두 대의 기계를 잠그는 것을 도왔습니다. (예, 나는 오랫동안 골프를 쳤습니다.)

물론 그것은 요청 된 것이 아니며 P5 펜티엄 칩의 오래된 스테핑에서만 작동합니다. 그러나 리눅스 Windows 모두에서 작동하는 크로스 플랫폼입니다 !


2
악의적이지 않습니까?

9

QBASIC, 38 자

DEF SEG=0:FOR I=0 TO 4^8:POKE I,1:NEXT

DOS에서 BSOD 또는 커널 패닉을 어떻게 정의 할 지 잘 모르겠지만, 이것은 아마도 매우 가깝습니다. 화면을 비우면 기계가 아무 것도 반응하지 않고 Ctrl + Alt + Delete조차도 응답하지 않습니다. 머신을 다시 시작하려면 하드 리셋 또는 전원 주기로 다시 시작해야합니다. 이것은 VirtualBox의 DOS 6.22에서 실행됩니다. 왜 시스템이 충돌하는지 정확히 알지 못하지만 기본적으로 프로그램은 비즈니스 쓰기가없는 메모리에 쓰기 (POKE)하고 있습니다.


2
충돌하는 이유는 시스템 프로그램 메모리를 정크로 덮어 쓰기 때문입니다.
다항식

예, 알고 있었지만 좀 더 구체적으로 생각하고있었습니다. 메모리의 어느 부분에 쓰고 있는지조차 확실하지 않습니다.
Kibbee

1
COMMAND.COM메모리 부족 주소에 저장된 DOS 인터럽트 벡터와 프로그램 코드를 덮어 쓰고 있습니다. 출처 : img.tfd.com/cde/MEMMAP.GIF
다항식

8

sh (JSLinux에서)

리눅스는 init 프로세스 에 신호에 대한 특별한 보호를 제공한다 . 그러나 JSLinux에서 /sbin/init다른 바이너리 (대부분 심볼릭 링크 /bin/busybox) 를 실행하는 쉘 스크립트라는 것을 알았습니다 .

이 "무한"while 루프 sh는 필요에 따라 다시 시작 됩니다.

while /bin/true; do

  setsid sh -c 'exec sh </dev/ttyS0 >/dev/ttyS0 2>&1'

done

그러나 /bin/true항상 종료 코드 0을 반환하지 않는 경우 는 어떻게 됩니까? /bin는 읽기 전용 루트 파일 시스템에 있지만 Linux에서는 "바인드"마운트를 사용하여이를 변경할 수 있습니다.

cp -R /bin /tmp/boom
rm /tmp/boom/true
printf '#!/bin/sh\nexec [ $PPID != 1 ]' > /tmp/boom/true
chmod 755 /tmp/boom/true
mount -o bind /tmp/boom /bin
killall -9 sh

그리고 우리는 :

/var/root # ./boom.sh
Killed
Kernel panic - not syncing: Attempted to kill init!

4

리눅스에서의 배쉬, 27 자

echo c>/proc/sysrq-trigger

또는 sudo 권한이있는 경우 :

echo c|sudo tee /proc/sysrq-trigger

1
이것은 sh: can't create /proc/sysrq-trigger: nonexistent directory나를 위해 결과 . (이것은 jsLinux에 있지만 실제 상자에서 테스트해야합니다)
Polynomial

4

GTB , 13 자

TI-84 계산기에서 실행

:"+"→_[_+_→_]

대부분의 RAM이 사용 가능하면 ERR:MEMORY

그렇지 않으면 계산기의 RAM이 너무 막혀서 꺼지고 지워집니다.

"계산기 바이러스"의 좋은 예


나는이 단지 풋 볼 +, ++, ++++등에 Str0. 그것은 나에게 주 ERR:MEMORY었지만, 표시 Str0값 을 표시하려고하면 즉시 84+가 추락했습니다. 또한 이로 인해 모든 프로그램을 잃게되었습니다.
LegionMammal978


2
:(){ :|:& };:

bash 쉘에서

나는 이것이 여기에 포함되는지 확실하지 않지만, 충분한 CPU 과열과 시스템 충돌을 오래 방치하면 해를 끼치 지 않고 안전하게 재부팅합니다. 물론 항상 그렇게하면 시스템이 약간 손상 될 수 있습니다.


6
이것은 실제로 작동하지 않습니다. CPU를 100 % 사용률로 돌리면 반 정도의 냉각 시스템으로 인해 무효화됩니다. 100 % CPU 사용률로 몇 개월 동안 접기 @ 홈을 실행했으며 컴퓨터가 더듬 거리지 않았습니다.
다항식


2
@Optimus 여기에 그대로 두십시오. 올바른 답변은 아니지만 해를 끼치 지 않습니다. Linux를 사용하면 실제로 원하는 경우 문제를 해결할 수 있기 때문에 실제로 Windows 솔루션이 더 어려울 것으로 예상됩니다.
다항식

2
@Polynomial 나는 그것이 사실이라고 생각하지 않습니다. 리눅스 는 그것을 깨뜨릴 수있는 방법을 더 잘 문서화 합니다.
반 시계 회전을 중지

1
@leftaroundabout에 동의하지 않습니다. Windows는 처음부터 사용자 모드에서 시스템 상태가 손상되는 것을 적극적으로 방지하도록 설계되었으며 Windows 파일 보호, 잠긴 시스템 파일 등을 통해 중요한 시스템 파일을 수정하지 못하게합니다. 반면 Linux는 설계되었습니다. 최대 안정성을 위해 할 수있는 방법으로 경우에 당신이하지 않는 시도 그것으로 엉망. 그러나 당신 그것을 엉망으로 만들고 싶다면 할 수 있습니다. 예를 들어, 수정 /dev/mem하거나 /dev/kmem루트에서 원하는대로 할 수 있습니다 .
다항식

2

루비 (루트로 실행), 36 자 또는 40 자 (에 일치하는 항목에 따라 다름 /p*/s*r)

참조 http://www.kernel.org/doc/Documentation/sysrq.txt을 검색하십시오 'c'(따옴표를 포함!) 작동 이유를.

open(Dir['/p*/s*r'][0],?a){|f|f<<?c}

편집 : 다른 것들과 일치하는 경우 작동하는 더 긴 버전 /p*/s*r

open('/proc/sysrq-trigger',?a){|f|f<<?c}

편집 2 : 의도적으로 과잉.


2
get-process | stop-process -force

파워 쉘에서


1
"충돌을 일으키기 위해 특별히 설계된 도구를 사용하는 것은 규칙에 위배되지는 않지만 그렇게 독창적이지는 않습니다!"
John Dvorak

1

리눅스 배쉬

cat /dev/zero > /dev/mem

전체 메모리를 지우고 무한 커널 패닉을 유발하십시오.

여기에서 시도 하십시오 .


이에서 어떻게 다른 ? s/zero/urandom/.
NoOneIsHere6

@NoOneIsHere 커널 패닉은이 버전에서 멈추지 않으며, 여기에서 메모리는 지워지고 임의의 바이트로 채워지지 않습니다.
TuxCrafting 2018 년

0

배치, 15 바이트

:A
start
goto A

단순히까지 시작하여 선형 시간에 메모리를 오버 플로우 cmd.exe수백 수백 수백 수백 수백 수백 수백 수백 수백 수백 수백 수백 수백 수백 수백 수백 수백 수백 수백 수백 수백, 수백, 수백, 수백, 수백 번.

자체적으로 반복적으로 시작되는 더 치명적인 (하지만 경쟁이 아닌) 24 바이트 프로그램이 있으므로 메모리를 로그 시간에 넘치게합니다 (즉, RAM을 업그레이드해도 충돌이 지연되지는 않습니다). 아래 코드가 있다고 가정 해보십시오 C:\a.bat.

:A
start C:\a.bat
goto A

.

솔직히 나는 그것을 시험해 보는 것을 두려워합니다.


후자의 프로그램이 포크 폭탄이라는 것을 아는 사람이 있습니까?
dorukayhan 님이 Monica 님이

그래, 내가 했어. :() { : | : & }; :
NoOneIsHere6

@0대신에 C:\a.bat?
Johannes Kuhn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.