기술적 으로 키워드에 대한 base64 인코딩 데이터를 직접 필터링 할 수 있습니다. 나는 (위 에사의 대답에 설명 된 예와 같은) 더 간단한 대안의 존재 주어진, 그것은 실제 또는 할 수있는 합리적인 일이있어 말하고 있지 않다, 그러나 그것은 이다 가능합니다.
요점은 base64 인코딩 이 3 바이트의 원시 인코딩되지 않은 데이터 블록을 base64 문자의 4 자 블록으로 결정적으로 매핑 한다는 것을 인식하는 것 입니다. 따라서 인코딩되지 않은 데이터에 3 바이트 블록의 특정 시퀀스가 나타날 때마다 동일한 4 문자 블록 시퀀스가 인코딩 된 버전에 나타납니다.
예를 들어, base64 인코더에 문자열 Quanzhoucooway
을 입력 하면 출력이 나타납니다 . 입력의 길이가 3 바이트의 배수가 아니기 때문에 출력에는 끝에 약간의 패딩이 포함 되지만 마지막 부호와 마지막 실제 base64 문자를 제거하면 (일부 패딩 비트도 인코딩하므로) 문자열을 얻습니다. 즉 바이트가 삼중마다 base64 인코딩 된 데이터에 표시 보장 , , , 및 상기 부분 삼중 순차 입력에서 나타난다.UXVhbnpob3Vjb293YXk=
=
k
UXVhbnpob3Vjb293YX
Qua
nzh
ouc
oow
ay
그러나 물론 문자열 Quanzhoucooway
은 삼중 항 경계에서 정확하게 시작되지 않을 수 있습니다. 예를 들어 문자열을 XQuanzhoucooway
대신 인코딩 하면 출력이 WFF1YW56aG91Y29vd2F5
달라지며 완전히 다릅니다. 이번에는 입력 길이를 3으로 나눌 수 있으므로 끝에서 버릴 패딩 문자는 없지만 WF
앞에 붙인 X
바이트 에서 비트를 인코딩 하는 처음 두 문자 ( ) 를 버려야합니다. F1YW56aG91Y29vd2F5
.
마지막으로 base64 인코딩 XXQuanzhoucooway
은 출력을 제공하며 WFhRdWFuemhvdWNvb3dheQ==
, 양쪽 끝에 패딩이 있습니다. 처음 세 문자 WFh
( XX
접두사 를 인코딩 함 )와 마지막 세 문자 Q==
(끝에 0 비트 패딩을 인코딩 함)를 제거하면 string이 남습니다 RdWFuemhvdWNvb3dhe
. 따라서 다음 세 가지 base64 인코딩 문자열을 얻습니다.
UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe
이 중 (적어도) 하나는 단어를 포함하는 입력 문자열의 base64 인코딩 형식으로 나타나야합니다 Quanzhoucooway
.
물론 운이 좋지 않은 경우 base64 인코더는 두 개의 인코딩 된 삼중 항 사이에 줄 바꿈을 삽입 할 수 있습니다. (예를 들어, 메시지 예 F1YW56
와 사이에 하나가 aG91Y29vd2F5
있습니다.) 따라서 이러한 문자열을 정규 표현식과 안정적으로 일치 시키려면 다음과 같은 것이 필요합니다 (PCRE 구문 사용).
/UXVh\s*bnpo\s*b3Vj\s*b293\s*YX/ DISCARD
/F1\s*YW56\s*aG91\s*Y29v\s*d2F5/ DISCARD
/R\s*dWFu\s*emhv\s*dWNv\s*b3dh\s*e/ DISCARD
이러한 패턴을 직접 생성하는 것은 지루한 일이지만 최소한 base64 인코더를 제공하는 한 선호하는 프로그래밍 언어로 간단한 스크립트를 작성하는 것은 어렵지 않습니다.
정말로 원한다면 키워드의 소문자와 대문자 버전을 모두 base64로 인코딩하고 키워드 조합과 일치하는 정규 표현식으로 결합하여 대소 문자를 구분하지 않는 일치를 구현할 수도 있습니다. 예를 들어, base64 인코딩 quanzhoucooway
은 cXVhbnpob3Vjb293YXk=
while이고 QUANZHOUCOOWAY
is UVVBTlpIT1VDT09XQVk=
규칙은 다음과 같습니다.
/[cU][XV]V[hB]\s*[bT][nl]p[oI]\s*[bT][31]V[jD]\s*[bT][20]9[3X]\s*[YQ][XV]/ DISCARD
는 삼중 항 경계에서 시작되는 경우 base64로 인코딩 된 단어 "Quanzhoucooway"와 일치합니다. 시프트 된 버전에 대해 다른 두 개의 정규 표현식을 생성하는 것은 연습으로 남아 있습니다. ;)
아아, 이와 같이 간단한 하위 문자열 일치보다 복잡한 것을 수행하는 것은 비실용적입니다. 그러나 최소한 깔끔한 트릭입니다. 어떤 이유로 든 SpamAssassin 또는 필터링 전에 base64 인코딩을 디코딩 할 수있는 다른 필터를 사용할 수없는 경우에도 유용 할 수 있습니다. 그러나 그렇게 할 수 있다면 이와 같은 핵을 사용하는 대신 분명히해야합니다.