셋째 날: 소스코드 감쪽같이 숨기기

저자

@aanoaa - Perl, 콧수염, 야구, 자전거, 낙타, 돌고래, 포청천 마니아. 아이유 열혈 삼촌팬. Perl과 Javascript, 안드로이드 어플리케이션 개발에 능하다. Perl 코드 사용시 탭 문자 대신 4칸 공백을 사용한다. 일신 상의 이유로 Vim을 버리고 Emacs로 투신. 현재 콧수염 블로그를 운영하고 있다.

시작하며

Perl 코드를 실행할 수 있다는 것은 소스 코드도 읽을 수 있다는 것을 뜻합니다. 하지만 단 몇 줄의 Perl 코드로 여러분의 코드를 감쪽같이 숨길 수도 있습니다.

어떻게?

먼저 숨기고자 하는 문자열을 비트스트림으로 보고 '0''1'로만 이루어진 문자열로 바꿉니다. 그런 다음, 이것을 다시 공백(" ")과 탭("\t")으로만 이루어진 문자열로 바꿉니다. 그러면 여러분의 코드는 아무리 모니터를 뚫어지게 쳐다봐도, 백번 인쇄를 해도 읽어낼 수 없게 됩니다! 예를 들어 아래와 같은 내용이 주어졌다면,

1
안녕하세요

먼저 이렇게 01로만 이루어진 문자열로 바꿉니다.

1
00110111101010010001000111010111101000011010100110110111101010010001100100110111001000010001110100110111010110010010100101010000

그리고 01을 각각 공백과 탭 문자로 바꾸면 읽을 수도 없고 인쇄할 수는 문자열이 완성됩니다!

1
"                                                                                                                                                                     "

보이지 않게 된 문자열을 큰 따옴표로 묶은 모습입니다.

만들어 봅시다!

먼저 Perl 내부로 읽어들인 문자열을 unpack 함수를 사용하여 '0''1'의 바이트 시퀀스로 변형합시다.

1
2
my $text = <STDIN>;
$text = unpack "b*", $text;

다음으로 '0'' '로, '1'"\t"로 바꿉니다.

1
$text =~ tr/01/ \t/;

이게 끝입니다! 전체 코드로 한번 볼까요?

1
2
3
4
my $text = <STDIN>;
$text = unpack "b*", $text;
$text =~ tr/01/ \t/;
print $text;

결과 화면은 다음과 같습니다. "Hello Susan!"을 입력하면 빨간 박스에 표시한 부분만큼 공백이 출력된 것을 볼 수 있습니다.

결과

정리하며

역순으로 실행하면 ' '"\t"로 이루어진 텍스트를 원상태로 복구할 수 있을 겁니다. Perl을 사용하면 이렇게 간단하게 문자열을 조작할 수 있습니다. 문서와 명령행 옵션이 깔끔하게 포함된 s3cr3t 전체 소스코드도 꼭 확인해보세요.

참고문서