ในทางเทคนิคคุณสามารถกรองข้อมูล base64 ที่เข้ารหัสสำหรับคำหลักได้โดยตรง ฉันไม่ได้บอกว่ามันเป็นเรื่องจริงหรือมีเหตุผลที่ต้องทำเนื่องจากมีทางเลือกที่ดีกว่าและง่ายกว่า (ดังที่อธิบายไว้ในคำตอบของ Esa ด้านบน) แต่ก็เป็นไปได้
เคล็ดลับคือการตระหนักว่าการเข้ารหัส base64เป็นการแม็พที่กำหนดไว้ล่วงหน้าของบล็อกขนาด 3 ไบต์ของข้อมูลดิบที่ไม่มีการเข้ารหัสเป็นบล็อก 4 ตัวอักษรของอักขระฐาน 64 ดังนั้นเมื่อใดก็ตามที่มีลำดับของบล็อกขนาด 3 ไบต์ปรากฏขึ้นในข้อมูลที่ไม่มีการเข้ารหัสลำดับของบล็อกขนาด 4 ตัวที่เหมือนกันจะปรากฏขึ้นในรุ่นที่เข้ารหัส
ตัวอย่างเช่นถ้าคุณป้อนสตริงQuanzhoucooway
เป็นเข้ารหัส base64UXVhbnpob3Vjb293YXk=
คุณจะได้รับการส่งออก เนื่องจากความยาวของอินพุตไม่ใช่หลายไบต์ 3 เอาต์พุตมีpaddingที่ท้าย แต่ถ้าเราวาง=
สัญญาณสุดท้ายและอักขระ base64 ตัวสุดท้ายk
(เพราะเข้ารหัสบิต padding บางส่วน) เราจะได้รับสตริงUXVhbnpob3Vjb293YX
ที่รับประกันว่าจะปรากฏในข้อมูลที่เข้ารหัส base64 เมื่อใดก็ตามที่แฝดไบต์Qua
, nzh
, ouc
, oow
และแฝดบางส่วนay
ปรากฏในการป้อนข้อมูลในลำดับที่
แต่แน่นอนสตริงQuanzhoucooway
อาจไม่เริ่มตรงกับขอบเขตของ triplet ตัวอย่างเช่นถ้าเราเข้ารหัสสตริงXQuanzhoucooway
แทนเราจะได้ผลลัพธ์WFF1YW56aG91Y29vd2F5
ซึ่งมีลักษณะแตกต่างไปจากเดิมอย่างสิ้นเชิง เวลานี้ความยาวของการป้อนข้อมูลหารด้วยสามได้ดังนั้นจึงไม่มีตัวอักขระซ้อนภายในท้ายที่สุด แต่เราต้องทิ้งอักขระสองตัวแรก ( WF
) ซึ่งแต่ละตัวเข้ารหัสบิตบางส่วนจากX
ไบต์ที่ผ่านการเตรียมไว้ให้เราด้วยF1YW56aG91Y29vd2F5
.
ในที่สุดการเข้ารหัส base64 XXQuanzhoucooway
ให้เอาต์พุตWFhRdWFuemhvdWNvb3dheQ==
ซึ่งมีช่องว่างภายในทั้งสองด้าน การถอดอักขระสามตัวแรกWFh
(ซึ่งเข้ารหัสXX
คำนำหน้า) และตัวละครทั้งสามที่ผ่านมาQ==
(ซึ่งเข้ารหัสช่องว่างภายในศูนย์บิตที่สิ้นสุด) RdWFuemhvdWNvb3dhe
เราซ้ายกับสตริง ดังนั้นเราจึงได้รับสามสตริงการเข้ารหัส 64 เบสต่อไปนี้:
UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe
ซึ่ง (อย่างน้อย) หนึ่งต้องปรากฏใน base64 เข้ารหัสรูปแบบของสตริงป้อนข้อมูลใด ๆ Quanzhoucooway
ที่มีคำว่า
แน่นอนถ้าคุณโชคไม่ดีตัวเข้ารหัส base64 อาจแทรกตัวแบ่งบรรทัดที่อยู่ตรงกลางระหว่างสองสามส่วนที่เข้ารหัส (ตัวอย่างเช่นข้อความของคุณมีหนึ่งระหว่างF1YW56
และaG91Y29vd2F5
.) ดังนั้นในการจับคู่สตริงเหล่านี้กับ regexps ได้อย่างน่าเชื่อถือคุณต้องมีสิ่งต่อไปนี้ (ใช้ไวยากรณ์ 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 ทั้งตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ของคำหลักและรวมเข้ากับ regexp ที่ตรงกับการรวมกันของพวกเขา ตัวอย่างเช่นการเข้ารหัส base64 quanzhoucooway
คือcXVhbnpob3Vjb293YXk=
ขณะที่ของQUANZHOUCOOWAY
คือ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" ไม่ว่าในกรณีใด ๆ โดยมีเงื่อนไขว่าจะเริ่มในขอบเขตของแฝด การสร้าง regexps ที่สอดคล้องกันอีกสองรายการสำหรับเวอร์ชันที่ถูกเลื่อนนั้นจะถูกทิ้งไว้เป็นแบบฝึกหัด ;)
อนิจจาการทำอะไรที่ซับซ้อนกว่าการจับคู่สตริงย่อยแบบนี้อย่างรวดเร็วกลายเป็นทำไม่ได้ แต่อย่างน้อยมันก็เป็นกลลวงที่เรียบร้อย โดยหลักการแล้วมันอาจมีประโยชน์ถ้าคุณด้วยเหตุผลบางอย่างไม่สามารถใช้ SpamAssassin หรือตัวกรองอื่น ๆ ที่สามารถถอดรหัสการเข้ารหัส base64 ก่อนการกรอง แต่ถ้าคุณสามารถทำได้แทนที่จะใช้แฮ็กแบบนี้คุณควรทำอย่างแน่นอน