디스크를 안전하게 지울 수있는 가장 짧은 코드


9

두 번의 쓰기 패스만으로 DoD 5220.22-M 와이프 방법 의 단순화 된 변형을 수행하는 가장 짧은 코드를 작성해 봅시다 .

모든 프로그래밍 언어가 허용되지만 디스크 와이프 지향 라이브러리의 사용은 금지됩니다.

의사 코드로 구현하는 방법은 다음과 같습니다.

Set x to 0

[Start]
'Write Pass
For each sector in disk write the content of x
'Verification Pass
For each sector in disk {
    If sector does not contain the content of x then goto [Start]
}
'Check whether we already did the pass with 1
If x is not 1 then {
    Set x to 1
    GoTo [Start]
}
Else end

즉,이 코드는 쓰기 패스에 대한 검증 패스, 두 번 실행 0을위한, 그리고 쓰기 패스 및 검증 통과 1.

코드 골프 스타일을 구현하기에 충분할까요? ;)


6
테스트하기가 얼마나 어려워서 답변을 얻을 수 있을지 의문입니다.
James

12
진심으로, 이런 종류의 치료를 받으려면 SSD가 어떻게 했습니까? 테디 베어 컬렉션 전체를 죽였나요?
R. Kap

2
실제로 이것을 시도하고 해결하려고합니다 ... 또한 테스트하기 위해 HDD를 희생하고 싶지 않습니다.
Michelfrancis Bustillos

6
이 질문은 악의적 인 코드를 요구하기 때문에이 질문을 논외 주제로 닫으려고합니다.
AdmBorkBork

2
나는 그렇지 않다고 주장 할 것이다. 이 과제는 개인 정보 보호 및 정보 보안을 장려하는 코드를 요구합니다.
MathuSum Mut

답변:


1

x86 머신 코드 (Linux), 116 바이트

00000000: 89cb 6a02 5931 d289 4c24 f4b0 05cd 8050  ..j.Y1..L$.....P
00000010: 5b53 6a02 5a31 c9b0 13cd 8089 c65b 5331  [Sj.Z1.......[S1
00000020: d231 c9b0 13cd 8089 f75b 53b2 018d 4c24  .1.......[S...L$
00000030: f8b0 04cd 804e 09f6 75ef 5b53 31d2 31c9  .....N..u.[S1.1.
00000040: b013 cd80 89fe 5b53 8d4c 24f4 b201 b003  ......[S.L$.....
00000050: cd80 4e09 f674 0c8a 4424 f838 4424 f474  ..N..t..D$.8D$.t
00000060: e5eb ad89 fe8a 4424 f8c6 4424 f801 3c01  ......D$..D$..<.
00000070: 759e 58c3                                u.X.

파일 이름을 인수로 사용

조립 (NASM) :

section .text
	global func
func:			;this function uses fastcall conventions
	;seems like no enter instr needed

	;open file
	mov ebx, ecx	;first argument to func (filename)
	push 0x2	;flag O_RDWR
	pop ecx		;pushing a constant is shorter than mov
	xor edx, edx	;mode=0
	mov [esp-12], ecx ;set first byte (msg) to write to 0. msg later in esp-8, buf in esp-12
	mov al, 5	;using 8 bit regs is smaller
	int 0x80	;syscall open
	push eax	;save file descriptor

	write_verify:

	;get file size
	pop ebx		;get fd
	push ebx
	push 0x2	;flag SEEK_END
	pop edx
	xor ecx, ecx 	;offset 0
	mov al, 0x13
	int 0x80	;syscall lseek
	mov esi, eax	;save file byte count in esi
	

	;reset index of file to 0
	pop ebx		;get fd
	push ebx
	xor edx, edx	;flag SEEK_SET=0
	xor ecx, ecx	;ecx=0
	mov al, 0x13
	int 0x80	;syscall lseek

	;***write pass***
	mov edi, esi
	write_loop:	;for each byte in byte count, write [msg]
		;write to file
		pop ebx		;file descriptor
		push ebx
		mov dl, 1	;bytes to write
		lea ecx, [esp-8] ;buffer to write from
		mov al, 4
		int 0x80	;syscall write
		dec esi	;decrement esi (byte count) to 0
		or esi, esi	;cmp esi to 0
		jne write_loop	;while esi!=0, keep looping

	;reset index of file to 0
	pop ebx		;get fd
	push ebx
	xor edx, edx	;flag SEEK_SET=0
	xor ecx, ecx	;ecx=0
	mov al, 0x13
	int 0x80	;syscall lseek

	
	;***verification pass***
	mov esi, edi
	verify_loop:	;for each byte in byte count, verify written byte
		pop ebx		;get fd
		push ebx
		lea ecx, [esp-12] ;buffer to store read byte
		mov dl, 1	;read 1 byte
		mov al, 3
		int 0x80	;syscall read
		dec esi
		or esi, esi	;cmp esi to 0 
		je end_verify	;at final byte, end verification
		mov al, [esp-8]
		cmp byte [esp-12],al
		je verify_loop	 ;keep looping if expected value found
		jmp write_verify ;if byte!=expected value, restart

	end_verify:
	mov esi, edi
	mov al, [esp-8]
	mov byte [esp-8],0x1	;set new byte to write to 1
	cmp al, 0x1
	jne write_verify	;if old byte to write!=1, goto start
	
	pop eax			;reset stack
	ret

온라인으로 사용해보십시오! (임시 파일 사용)

이동 레지스터를 최적화하고 스택을 메모리의 일정한 위치 대신 버퍼로 사용하여 -11 바이트.


3

리눅스 시스템에서는 특별한 장치 처리가 필요하지 않습니다. 장치 파일 인터페이스 만 사용하십시오.

Python 3 (바이트 문자열)-141 바이트

d=input()
f=open(d,'r+b')
z=f.seek
z(0,2)
s=f.tell()
i=0
while i<2:
 z(0);f.write([b'\0',b'\xff'][i]*s);f.flush();z(0)
 if f.read()==x:i+=1

상당히 간단하고 실제로 많이 최적화되지는 않았지만 작동합니다. 기본 요약은 다음과 같습니다.

  • 입력 받기 (장치 파일 경로)
  • 장치 파일 열기
  • 끝까지 탐색하고 파일 크기를 조정하십시오 (블록 장치는 항상 실제 크기 임)
  • 쓰기 및 체크 루프 입력
  • 0 비트 및 1 비트 문자열 구성 (x)
  • 비트 열 쓰기
  • 플러시 출력 (버퍼링 = 0을 설정할 수는 있지만 더 짧습니다)
  • x에 대해 파일을 테스트하고, 통과하면 루프 단계를 증가시킵니다.

증분이 충분히 높으면 종료 루프

보너스로, 더 강력한 덮어 쓰기 효과를 위해 0x55 / 0xaa와 같이 임의의 세트 및 수의 바이트 수정 패턴에 대해이를 수정할 수 있습니다.

실제로 루프백을 사용하여 장치 파일에서 이것을 테스트했습니다. 그러나 검사가 실제로 작동하는지 100 % 확신하지 못합니다. 버퍼링 동작으로 인해 각 패스마다 파일을 닫았다가 다시 열어야 할 수도 있습니다. 플러시가 이것을 막기를 바랍니다.

* 의견에 몇 가지 제안을 포함하도록 편집되었습니다.


1
사이트에 오신 것을 환영합니다. =파이썬에서 공백이 필요하지 않습니다 . ;들여 쓰기를 줄이기 위해 사용하여 바이트 수를 줄일 수도 있습니다 .
Ad Hoc Garf Hunter

일반적으로 문자가 아닌 바이트 단위로 제출을 계산합니다. 예를 들어 f.seek(0);f.seek(0)(19 바이트)는 s=f.seek;s(0);s(0)(18 바이트) 일 수 있습니다 . 또한 일 if f.read()==x:i+=1수 있습니다 i+=f.read()==x.
Jonathan Frech

빈 문자열을 입력 인수로 사용할 필요도 없습니다.
Quintec

b'\0'대신 b'\x00'작동해야 한다고 생각 합니다 .
Jason

중요한 기능을 실현했습니다. 이 프로그램은 삭제 된 장치의 크기와 동일한 RAM을 사용합니다.
윌리엄 Shipley

2

C (클랑) , -DZ=lseek(d,0+ 139 = 152 바이트

g,j,x,d,s,i,c;f(n){x=0;d=open(n,2);s=Z,2);for(j=2;j--;x++){Z,0);for(i=s;i--;write(d,&x,1));Z,0);for(i=s;i--;read(d,&c,1),c!=x&&x--&&j--);}}

온라인으로 사용해보십시오!

파일 이름을 인수로 사용합니다

언 골프 드 :

#include <unistd.h>
int g,j,x,d,s,i,c;
void f(char*n){
	x=0; /*Byte to write*/
	d=open(n,O_RDWR);
	s=lseek(d,0,SEEK_END); /*Get size of file*/
	j=0;
	for(j=0;j<2;j++){
		/*Write Pass*/
		lseek(d,0,SEEK_SET); /*Start writing from start of file*/
		for(i=0;i<s;i++){
			write(d,&x,1);
		}
		
		/*Verification Pass*/
		lseek(d,0,SEEK_SET);
		for(i=0;i<s;i++){
			read(d,&c,1);
			if(c!=x)x--,j--; /*If verification fails, repeat loop with the same value*/
		}
		x++;
	}
}

흠 ... TiO가 인터넷을 닦을 것인가? ;-D
Titus

@Titus 임시 파일을 만들어서 지 웁니다.
Logern

1

Tcl, 286 바이트

proc f {o i l} {seek $o 0
set s [string repeat $i $l]
puts -nonewline $o $s
flush $o
seek $o 0
return [string equal [read $o $l] $s]}
set n [open $argv r+]
fconfigure $n -translation binary
seek $n 0 end
set m [tell $n]
while {![f $n "\0" $m]} {}
while {![f $n "\xff" $m]} {}

실제로 잘 최적화되지 않았습니다. 나는 할 수있는 것을 시도했지만 Tcl에 대해 많이 모른다.

"f.tcl"로 저장하고를 사용하여 Unix에서 실행하십시오 tclsh f.tcl "your filename". 정확히 하나의 논쟁이 있는지 확인하십시오! 나는 이것을 일반 파일로 테스트했지만 장치 파일에서도 작동해야합니다.

변수와 색인 설정은 Tcl에 더 관련되어 있으므로 패스 사이에 공통 코드를 함수에 넣기로 결정했습니다. 그런 다음 "\ 0"으로 먼저 호출하고 확인에 실패하는 동안 반복하십시오. "\ xff"와 같은 작업을 수행합니다.

나는 쓰기 후에 플러시했다; 필요하지 않을 수도 있습니다. fconfigure -translation binary -buffering none더 깁니다.

주위의 따옴표를 제거하여 -2 바이트 r+.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.