อะไรคือ“ การสลับบริบทโดยสมัครใจ”?


34

ฉันได้รับไฟล์ไบนารีและฉันควรจะถอดรหัสรหัสผ่าน (ทำการบ้าน) นอกจากนี้ยังมีฟังก์ชั่นที่ได้รับ (ฟังก์ชั่นซึ่งเป็นส่วนหนึ่งของไฟล์ไบนารี) ฟังก์ชั่นนั้นแสดงให้เห็นว่าสตริงการป้อนข้อมูลถูกเปรียบเทียบกับอักขระรหัสผ่านที่ถูกต้องตามตัวอักษรและคืนเท็จทันทีเมื่ออักขระผิด (นั่นไม่ใช่วิธีที่ปลอดภัยในการทำฉันเดาเพราะมันถึงเวลาที่จะรั่วไหล ตัวอย่าง). แต่ครูของเราได้เพิ่มตัวจับเวลาแบบสุ่มที่ให้ผลลัพธ์ (แก้ไข / ผิด) เพื่อให้ยากขึ้นสำหรับเรา ...

อย่างไรก็ตามฉันมีฉันทำมันสำเร็จแล้วด้วยวิศวกรรมย้อนกลับและได้รับรหัสผ่านที่ถูกต้อง ตอนนี้ฉันกำลังเล่นกับมันในบรรทัดคำสั่ง:

/usr/bin/time -v ./program_name enter_password

ด้วยคำสั่งนี้ฉันได้รับข้อมูลมากมายเช่นเวลาของระบบ, swaps, เวลาดำเนินการ .. แต่สิ่งที่น่าสนใจที่สุดสำหรับฉันคือ "การเปลี่ยนบริบทโดยสมัครใจ" เพราะอักขระที่ถูกต้องมากขึ้นของรหัสผ่านที่ฉันป้อน " ฉันเข้าใจ!

ยิ่งฉันป้อนตัวละครผิดมากเท่าไหร่ฉันจะได้รับ

ฉันใช้เวลาเกือบสองชั่วโมงในการถอดรหัสรหัสผ่านเพียงแค่ป้อนคำสั่งนั้นป้อนอักขระและสังเกต "สวิตช์บริบทแบบสมัครใจ" เมื่อใดก็ตามที่อักขระ ONE ถูกต้อง "การสลับบริบทแบบสมัครใจ" จะลดลงหนึ่งตัว

คำถามของฉัน "สวิตช์บริบทแบบสมัครใจ" คืออะไรและทำไมพวกเขาถึงช่วยฉันถอดรหัสรหัสผ่าน


5
ขอแสดงความยินดีในการค้นพบด้วยตัวคุณเองฟิลด์ที่อุดมไปด้วยและยังไม่เข้าใจอย่างเต็มที่ของการโจมตีด้านช่องทาง
zwol

1
@zwol คุณหมายถึงอะไรโดย "รวย"? และนอกจากนี้เรากำลังเผชิญกับการโจมตีช่องทางด้านข้างในชั้นเรียนขอโทษด้วยที่ฉันไม่ได้ "เข้าใจอย่างเต็มที่" ในด้านที่เร็ว ....
cnmesr

15
@cnmesr ฉันคิดว่ามันเป็นความคิดเห็นที่จริงใจไม่ใช่คำพูดประชดประชันบอกว่า zwol เห็นว่าเป็นสิ่งที่น่าสนใจเนื่องจากการค้นพบใหม่ยังคงเกิดขึ้น ไม่ใช่ว่าคุณยังไม่เข้าใจอย่างเต็มที่ แต่ก็ไม่มีใครเข้าใจและนั่นคือสิ่งที่ทำให้มันน่าสนใจ
hvd

3
@hvd cnmesr ใช่นั่นคือสิ่งที่ฉันหมายถึง
zwol

@zwol โอ้ขอโทษแล้ว! ฉันตีความคุณผิดและเห็นว่าเป็นการโจมตี: p
cnmesr

คำตอบ:


36

หน้าคนสำหรับการtimeอธิบายแนวคิดของความสมัครใจและไม่สมัครใจสวิทช์บริบท:

The resource specifiers [...] are:
   c      Number of times the process was context-switched involuntarily
          (because the time slice expired).
   w      Number of times that the program was context-switched voluntarily, 
          for instance while waiting for an I/O operation to complete.

(ใบเสนอราคามาจากระบบ Debian ของฉันหน้า man ที่เชื่อมโยงมีข้อความที่แตกต่างออกไปเล็กน้อย)

นั่นคือการสลับบริบทเป็นความสมัครใจถ้ากระบวนการออกจาก CPU เนื่องจากไม่มีสิ่งอื่นที่ต้องทำ (ในขณะที่รอสิ่งภายนอกเกิดขึ้น) โดยไม่สมัครใจหากต้องการดำเนินการคำนวณต่อไป แต่ระบบปฏิบัติการตัดสินใจว่าถึงเวลาแล้วที่จะเปลี่ยนไปใช้กระบวนการอื่น


สิ่งเหล่านี้เกี่ยวข้องกับโปรแกรมตรวจสอบรหัสผ่านอย่างไรขึ้นอยู่กับโปรแกรมที่ใช้งานจริง

จากซอร์สโค้ดที่เชื่อมโยงในความคิดเห็นเราจะเห็นว่าโปรแกรมเรียกusleep()หนึ่งครั้งสำหรับอักขระที่ไม่ตรงกันแต่ละตัวดำเนินการวนรอบการเปรียบเทียบกับอักขระถัดไปต่อไป การนอนหลับเป็นเรื่องเกี่ยวกับความสมัครใจที่ยอมให้ CPU ได้รับดังนั้นการเรียกเหล่านี้จะแสดงเป็นการสลับบริบทแบบสมัครใจสำหรับอักขระที่ไม่ได้ใช้งานแต่ละตัว

บน Linux คุณควรเห็นการโทรด้วยstraceเช่นกัน

ความล่าช้าครั้งสุดท้ายนั้นมาจากการนอนแบบสุ่มT * (rand() % 3)คือ 0, 1 หรือ 2 เท่าของค่าคงที่ นั่นเป็นสิ่งที่ค่อนข้างหยาบดังนั้นควรง่ายโดยเฉลี่ยโดยพยายามหลายครั้งด้วยรหัสผ่านเดียวกัน


3
นี่คือซอร์สโค้ดของฟังก์ชั่นที่ฉันกล่าวถึงข้างต้นpastebin.com/iTzheD4uขอบคุณฉันจะดูการโทรด้วย strace และหวังว่าจะได้รับข้อมูลเพิ่มเติม เกี่ยวกับตัวจับเวลาแบบสุ่ม: หากรหัสผ่านมีความยาวผิดเวลาส่งออกจะเหมือนกัน (เร็วมาก) และตัวจับเวลาแบบสุ่มจะไม่ถูกเรียกใช้งาน หากความยาวรหัสผ่านถูกต้องเอาต์พุตจะสุ่มเนื่องจากมีการใช้ตัวจับเวลาแบบสุ่ม
cnmesr

@cnmesr โอ้เยี่ยมมาก!
ilkkachu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.