โปรแกรมนี้เต็มไปด้วยอักขระที่ไม่สามารถพิมพ์ได้ดังนั้นนี่คือ 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
จะกลายเป็น ดังนั้นเรายอมรับการป้อนข้อมูลจากผู้ใช้เป็นทศนิยม
6
escapes องค์ประกอบสแต็คด้านบน (เปลี่ยนแต่ละอินสแตนซ์ของ7
เป็น1
นี่คือวิธีที่สตริงที่ประกอบด้วย7
s ทั้งหมดถูก Escape) จากนั้นผนวกเข้ากับองค์ประกอบสแต็กก่อน ( 772
) 7721111111111
ดังนั้นข้อมูลของเราในขณะนี้คือสิ่งที่ต้องการ
- ขั้นสุดท้ายให้
3
ส่งองค์ประกอบสแต็กที่เป็นปัญหา (และดึงองค์ประกอบสแต็กเปล่าที่เป็นส่วนหนึ่งของสแต็กเริ่มต้นเริ่มต้น) ค่าของมันถูกคำนวณโดยใช้จำนวนของ1
s และ7
s และลบจำนวนของ0
s และ6
s ( 2
ตรงกลางจะถูกละเว้นในกรณีส่วนใหญ่ถ้ามันอยู่ที่ส่วนท้ายของสตริงมันจะกลายเป็นบรรทัดใหม่ต่อท้ายแทนที่จะถูกละเว้น แต่กฎ PPCG ไม่สนใจเรื่องนั้น) ดังนั้นผลลัพธ์เป็นต้นฉบับ อินพุตบวก 2
ณ จุดนี้ไม่มีอะไรที่เป็นประโยชน์ในสแต็กและไม่มีอะไรในโปรแกรมดังนั้นโปรแกรมจึงออก
เราจะย้อนกลับได้อย่างไร มันเป็นเรื่องธรรมดาของการเปลี่ยนแปลง11
ไป00
เพื่อที่ว่าเรากำลัง prepending ตัวอักษรเพื่อป้อนข้อมูลที่ทำให้มัน 2 ลดลงมากกว่า 2 สูงขึ้น มี00
ตัวเลขแปดแปดหลักที่ซ่อนอยู่ในโปรแกรมอย่างสะดวก (เพื่อให้เลขฐานแปดและไบต์เรียงกัน) ดังนั้นเราสามารถสลับกับ11
ตอนเริ่มต้นได้