프로그램이 변경되었는지 감지


16

오류없이 종료되는 프로그램을 작성하십시오.

단일 바이트가 다른 바이트로 대체되면 프로그램은 출력해야합니다

CORRUPTED
  • 파일에서 소스 코드를 읽지 마십시오
  • 귀하의 프로그램은 다른 출력을 생성해서는 안됩니다

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.

편집 : "NO CORRUPTED"요구 사항 제거


방사선 경화 에는 비슷한 질문이 많이 있지만, 이와 비슷한 질문을 찾지 못했습니다.
FryAmTheEggman

7
downvoters에게 : 당신이 올바른 언어를 선택하면 이것이 가능하다고 생각합니다 (매우 어려운 경우). 불가능한 것 이외의 문제가 있다고 생각하지 않는 한 질문을 닫거나 삭제하지 마십시오.

7
변화 란 무엇입니까 ? 다른 바이트로 대체 되었습니까?
Dennis

4
@ ais523 FWIW 도전이 너무 어려워서가 아니라 서둘러 작성된 것처럼 보이기 때문에 도전 과제를 하향 조정했습니다.
Dennis

5
불분명 한 것은 아니지만 더 명확해질 수 있습니다 . 당신이 경우 명확히 수있는 전체 프로그램이 필요하며, 예제 프로그램을 추가하고 가능한 모든 수정 사항을 설명, 언급은 단일 바이트 대체 프로그램 것으로, 언급을 테스트 제출에 사용할 수있는 스크립트를 추가하는 UTF-8 인코딩 된 파일에 영향을 미치는 방법 입력하지 않아야합니다.
Dennis

답변:


30

배나무 , 76 바이트

$@='NOT ';print"$@CORRUPTED"__DATA__ =®®”print"$@CORRUPTED"__DATA__ =®®”Ê®›~

이 프로그램에는 유효한 UTF-8이 아닌 일부 부유 옥텟이 포함되어 있습니다. 따라서 Windows-1252와 같이 표시됩니다. (기본적으로 A Pear Tree가 문자열 리터럴 등에서 비 ASCII 옥텟을 보는 경우 불투명 오브젝트로 취급하고 문자 코드가 무엇인지 인식하는 것 이상으로 이해하려고 시도하지 않습니다.이 동작은 다음과 같습니다. 인코딩 선언을 통해 변경되었지만 프로그램에없는 경우 프로그램은 논리적으로 "지정되지 않은 ASCII 호환 문자 세트"에 있습니다. ASCII가 아닌 모든 8 진수는 주석으로 표시되므로 실제로 중요하지 않습니다.)

설명

Pear Tree는 프로그램을 체크섬하여 CRC-32가 가장 긴 하위 문자열을 찾습니다 00000000. (넥타이가있는 경우 먼저 옥텟으로 선택합니다.) 그러면 프로그램이 회전하여 시작 부분에 배치됩니다. 마지막으로, 프로그램은 파이썬으로 (그리고 몇 가지 사소한 변경, 예와 같은 방식으로 작동하는 Perl로 정의되지되는 몇 가지를 정의, 거의 펄의 상위 집합의 언어로 해석됩니다 print배나무 트리 인쇄 최종 개행 그러나 Perl에는 없습니다). 이 메커니즘 (및 언어 전체)은 문제를 위해 설계되었습니다 . 이것은 전자가 아니지만 확실히 후자입니다.

이 프로그램에는 CRC-32에 주목할만한 두 개의 하위 문자열이 있습니다 00000000. 전체 프로그램은 print"$@CORRUPTED"__DATA__ =®®그 자체로 수행됩니다 (두 번 표시됨). 따라서 프로그램이 손상되지 않으면로 설정 $@되어 NOT 인쇄됩니다 CORRUPTED. 프로그램이 손상된 경우 프로그램의 CRC-32는 전체적으로 일치하지 않지만 짧은 섹션 중 하나는 손상되지 않습니다. null 문자열 CORRUPTED과 마찬가지로 프로그램 시작 부분으로 회전하는 것이 인쇄 $@됩니다.

문자열이 인쇄되면 __DATA__나머지 프로그램이 실행되는 것을 막기 위해 사용됩니다. ( __END__대신 2 바이트를 절약 할 수있는 이것을 쓸 수 있다고 생각합니다. 그러나이 버전을 확인하는 데 많은 시간을 소비했기 때문에이 버전을 게시 할 수도 있습니다. 수정 된 버전은 CRC 변경으로 인해 다시 확인되었으며 아직 "페이로드"를 골프화하는 데 많은 노력을 기울이지 않았으므로 동시에 통합 할 수있는 다른 의견이 있는지 확인하고 싶습니다. 주 #캐릭터가 개행 문자로 손상된 상황에서 작동하지 않습니다.)

처음에 내 코드의 CRC-32를 어떻게 제어했는지 궁금 할 것입니다. 이것은 CRC-32가 정의 된 방식에 따라 상당히 간단한 수학적 트릭입니다. 코드의 CRC-32를 취하여 리틀 엔디안 순서 (일반적으로 CRC-32 계산에 사용되는 바이트 순서의 역순)로 작성하십시오. 프로그램) 및 XOR with 9D 0A D9 6D. 그런 다음 프로그램에 추가하면 CRC-32가 0 인 프로그램이 만들어집니다. (가장 간단한 예로, null 문자열의 CRC-32는 0이므로 9D 0A D9 6DCRC-32도 0입니다. .)

확인

배나무는 대부분의 돌연변이를 처리 할 수 ​​있지만, "변경된"은 "임의의 옥텟으로 대체"를 의미한다고 가정합니다. 이론 상으로는 (이 짧은 프로그램에서는 그렇지 않을 수도 있지만) 어딘가에 잘못된 프로그램이 실행될 수있는 해시 충돌이있을 수 있으므로 가능한 모든 옥텟 대체로 인해 프로그램이 올바르게 작동하는지 잔인한 힘으로 확인해야했습니다. 내가 사용한 확인 스크립트 (Perl로 작성)는 다음과 같습니다.

use 5.010;
use IPC::Run qw/run/;
use warnings;
use strict;
undef $/;
$| = 1;
my $program = <>;
for my $x (0 .. (length $program - 1)) {
    for my $a (0 .. 255) {
        print "$x $a    \r";
        my $p = $program;
        substr $p, $x, 1, chr $a;
        $p eq $program and next;
        alarm 4;
        run [$^X, '-M5.010', 'apeartree.pl'], '<', \$p, '>', \my $out, '2>', \my $err;
        if ($out ne "CORRUPTED\n") {
            print "Failed mutating $x to $a\n";
            print "Output: {{{\n$out}}}\n";
            print "Errors: {{{\n$err}}}\n";
            exit;
        }
    }
}

say "All OK!    ";

N CRC가 단일 오류를 감지 비트는 n보다 비트 길지 버스트. 주어진 경우 해시 충돌이 불가능하며 무차별 대입 검증이 필요하지 않습니다.
Rainer P.

@RainerP .: 돌연변이는 원래 CRC가 0 인 부분에 대한 CRC를 막을 것이라는 것을 알고 있습니다. 그러나 CRC가 0 인 코드의 새로운 하위 문자열을 도입 할 가능성이 있습니다. 무차별 강제의 목적은 그러한 일이 발생하지 않았 음을 보장하는 것입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.