โปรแกรมนี้เต็มไปด้วยอักขระที่ไม่สามารถพิมพ์ได้ดังนั้นนี่คือ hexdump:
00000000: 2573 dc01 7e13 dcb6 1f %s..~....
หมายเหตุ: สิ่งนี้ใช้รูทีนตัวเลขที่ไม่สามารถป้อนจำนวนลบได้ดังนั้นการส่งนี้ถูก จำกัด ให้เป็นจำนวนเต็มเท่านั้น
ปัญหาหนึ่งที่ท้าทายความสามารถของตำรวจและโจรคือคุณไม่ได้เขียนคำอธิบายของรหัส (เพื่อทำให้การถอดรหัสยากขึ้น) ในทางตรงกันข้ามนี่หมายความว่าฉันไม่ต้องไปที่ปัญหาที่นี่
ฉันเลือกภาษาเป็น 7 เพราะโดยเฉพาะอย่างยิ่งในสัญกรณ์บีบอัดของมันมันค่อนข้างยากที่จะอ่านและฉันไม่เห็นว่าทำไมมันควรจะเป็นเพียงฉันเท่านั้นที่ต้องไปที่ปัญหาในการเคลื่อนย้ายโปรแกรม 8 บิตที่เขียนด้วยภาษา การเข้ารหัส 3 บิต โชคดี!
คำอธิบาย
ตอนนี้โปรแกรมแตกออกมา (ด้วยแรงเดรัจฉานโชคไม่ดีที่มักจะเป็นอันตรายในการแก้ปัญหาสั้น ๆ เหล่านี้) ฉันอาจอธิบายสิ่งที่ฉันได้รับด้วย นี่คือการแก้ไขโดยการอ่านโปรแกรมจริง ฉันอาจทำให้มันยากขึ้น แต่รู้สึกเหมือนเป็นความคิดที่ไม่ดีเมื่อรอยร้าวกำลังดุร้ายอยู่
เราจะเริ่มต้นด้วยการเป็นตัวแทนของโปรแกรมในการเข้ารหัสที่เป็นธรรมชาติยิ่งขึ้น ตามปกติหมายเลขตัวหนาบ่งชี้คำสั่งที่ทำงานทันที (ไม่ทุกคนที่อยู่ในที่แทนโปรแกรม; 6และ7มี แต่2จะ5ไม่ได้), ตัวเลข unbolded แทนเทียบเท่าหนีของพวกเขา ( 0ไป5ทั้งหมดที่มีอยู่ในโปรแกรมซึ่งแสดงต้นฉบับ; ทราบ นั่น0คือการหลบหนี6และ1การหลบหนี7):
112 7 1 7 34002 77 023 67 13303
ชุดคำสั่งที่มีอยู่ในแหล่งโปรแกรม 7 หมายความว่าโดยทั่วไปเป็นเพียงตัวอักษรที่แสดงถึงสแต็กดั้งเดิม (ไม่มีอะไรที่คุณสามารถทำได้ด้วยคำสั่งที่เพิ่งหลบหนี6และ7) ดังนั้นสิ่งแรกที่โปรแกรมจะทำคือผลักของหลายอย่างลงบนสแต็ก นี่เป็นวิธีที่สแต็กดูแลการทำงานของโปรแกรม ( |แยกองค์ประกอบสแต็กตามปกติใน 7):
772 | 7 | 34662 | 023 | 73363
จากนั้นองค์ประกอบสแต็กสุดท้ายจะถูกคัดลอกเพื่อให้กลายเป็นรหัสเพื่อทำงาน (ในขณะที่เหลืออยู่ในสแต็ก) เมื่อมันเกิดขึ้นนี่เป็นเพียงส่วนเดียวของโปรแกรมที่มีรหัส ทุกอย่างอื่นเป็นเพียงข้อมูล นี่คือสิ่งที่มันแปลเป็น:
73363
7 กดองค์ประกอบที่ว่างเปล่าบนกอง
3 ออกองค์ประกอบบนกองทิ้งองค์ประกอบดังต่อไปนี้
73 ผลรวมของเหล่านี้: ทิ้งองค์ประกอบด้านบนสแต็ค
3 ขาออกองค์ประกอบบนกองทิ้งองค์ประกอบดังต่อไปนี้
6 หนีองค์ประกอบด้านบนสแต็คแล้ว ผนวกเข้ากับองค์ประกอบด้านล่าง
3 เอาท์พุทองค์ประกอบสแต็คด้านบนทิ้งองค์ประกอบด้านล่าง
กล่าวอีกนัยหนึ่งนี่เป็นเพียงส่วนหนึ่งของคำแนะนำ I / O มาวิเคราะห์รายละเอียดกันดีกว่า:
73ทิ้งส่วน73363ที่ยังอยู่ด้านบนของสแต็ก
3ผลผลิตและละเว้น023 34662มันสามารถเห็นได้ว่า34662เป็นความคิดเห็นซึ่งถูกใช้ในการจัดเก็บไบต์ที่จำเป็นในรุ่นอื่น ๆ ของโปรแกรม สำหรับสิ่งที่023เมื่อเอาท์พุทมันจะเลือกรูปแบบ I / O 0 (จำนวนเต็ม) จากนั้น23เป็นคำสั่งที่ร้องขอการดำเนินการเพื่อป้อนจำนวนเต็ม (ใน 7 คุณป้อนข้อมูลผ่านรหัสเฉพาะที่ร้องขอการป้อนข้อมูล) การป้อนข้อมูลจะกระทำโดยการทำสำเนาขององค์ประกอบสแต็คที่อยู่ด้านล่างเช่นถ้าจำนวนเต็มใส่เป็น 10 องค์ประกอบสแต็คถัดไป (ปัจจุบัน7) 7777777777จะกลายเป็น ดังนั้นเรายอมรับการป้อนข้อมูลจากผู้ใช้เป็นทศนิยม
6escapes องค์ประกอบสแต็คด้านบน (เปลี่ยนแต่ละอินสแตนซ์ของ7เป็น1นี่คือวิธีที่สตริงที่ประกอบด้วย7s ทั้งหมดถูก Escape) จากนั้นผนวกเข้ากับองค์ประกอบสแต็กก่อน ( 772) 7721111111111ดังนั้นข้อมูลของเราในขณะนี้คือสิ่งที่ต้องการ
- ขั้นสุดท้ายให้
3ส่งองค์ประกอบสแต็กที่เป็นปัญหา (และดึงองค์ประกอบสแต็กเปล่าที่เป็นส่วนหนึ่งของสแต็กเริ่มต้นเริ่มต้น) ค่าของมันถูกคำนวณโดยใช้จำนวนของ1s และ7s และลบจำนวนของ0s และ6s ( 2ตรงกลางจะถูกละเว้นในกรณีส่วนใหญ่ถ้ามันอยู่ที่ส่วนท้ายของสตริงมันจะกลายเป็นบรรทัดใหม่ต่อท้ายแทนที่จะถูกละเว้น แต่กฎ PPCG ไม่สนใจเรื่องนั้น) ดังนั้นผลลัพธ์เป็นต้นฉบับ อินพุตบวก 2
ณ จุดนี้ไม่มีอะไรที่เป็นประโยชน์ในสแต็กและไม่มีอะไรในโปรแกรมดังนั้นโปรแกรมจึงออก
เราจะย้อนกลับได้อย่างไร มันเป็นเรื่องธรรมดาของการเปลี่ยนแปลง11ไป00เพื่อที่ว่าเรากำลัง prepending ตัวอักษรเพื่อป้อนข้อมูลที่ทำให้มัน 2 ลดลงมากกว่า 2 สูงขึ้น มี00ตัวเลขแปดแปดหลักที่ซ่อนอยู่ในโปรแกรมอย่างสะดวก (เพื่อให้เลขฐานแปดและไบต์เรียงกัน) ดังนั้นเราสามารถสลับกับ11ตอนเริ่มต้นได้