ROB สลิง: ฉันร็อบและ ให้ได้รับการแตกร้าว ดังนั้นจำจาก spec pset ว่า เรากำลังจะต้องใช้ ฟังก์ชั่นห้องใต้ดิน สำหรับหน้าคนเรามีสอง กัญชากำหนด _xopensource ไม่ต้องกังวลเกี่ยวกับสาเหตุ เราจำเป็นต้องทำอย่างนั้น และกัญชารวม unistd.h ดังนั้นเมื่อที่ออกจากทางให้ ไปที่โปรแกรมจริง สิ่งแรกที่เราต้องทำคือการให้แน่ใจว่า ผู้ใช้ป้อนถูกต้องเข้ารหัส รหัสผ่านที่บรรทัดคำสั่ง โปรดจำไว้ว่าโปรแกรมที่ถูกที่ควร ที่จะทำงานเช่นเดียวกับรอยแตกจุดเฉือนและ แล้วสายการเข้ารหัส ดังนั้นที่นี่เรากำลังตรวจสอบเพื่อให้แน่ใจว่า ที่ argc สองถ้าเราต้องการ ดำเนินการต่อด้วยโปรแกรม ถ้า argc ไม่ได้เป็นสองนั่นหมายความว่าอย่างใดอย่างหนึ่ง ผู้ใช้ไม่ได้ป้อนข้อมูลที่เข้ารหัส รหัสผ่านที่บรรทัดคำสั่งหรือพวกเขา เข้ามามากกว่าเพียงแค่การเข้ารหัส รหัสผ่านที่บรรทัดคำสั่งซึ่งใน กรณีที่เราไม่ทราบว่าจะทำอย่างไรกับ อาร์กิวเมนต์บรรทัดคำสั่ง ดังนั้นถ้า argc สองเราสามารถดำเนินการต่อ และที่นี่เรากำลังจะประกาศ ตัวแปรการเข้ารหัส ที่แค่ไปนามแฝงเดิม argv1 เพื่อที่ว่าตลอดนี้ โปรแกรมของเราเราไม่ต้องเรียกมันว่า argv1, ซึ่งจากนั้นคุณต้องคิด เกี่ยวกับสิ่งที่หมายความว่าจริง ดังนั้นในที่สุดเราต้องการที่จะตรวจสอบว่า รหัสผ่านที่เข้ารหัสของผู้ใช้ เข้ามาจะได้รับจริง รหัสผ่านที่เข้ารหัส ต่อหน้าคนจากฝังศพใต้ถุนโบสถ์ รหัสผ่านที่เข้ารหัสจะต้องมี 13 ความยาวอักขระ ขึ้นที่นี่เราสังเกตเห็นว่ากัญชาที่กำหนดไว้ ระยะเวลาในการเข้ารหัสเป็น 13 ดังนั้นเราเพียงแค่การทำให้แน่ใจว่า ความยาวสตริงของการเข้ารหัส รหัสผ่านคือ 13 และหากยังไม่ได้ที่เราต้องการ เพื่อออกจากโปรแกรม ดังนั้นเมื่อที่ออกจากทางที่เราสามารถ ขณะนี้จริงพยายามที่จะหา รหัสผ่านที่ให้การเข้ารหัส รหัสผ่านคือ ที่นี่เราต้องการคว้าเกลือ จากรหัสผ่านที่เข้ารหัส โปรดจำไว้ว่าต่อหน้าคนที่ ครั้งแรกที่ตัวละครทั้งสองของการเข้ารหัส สตริงชอบที่นี่ - 50ZPJ และอื่น ๆ - ครั้งแรกที่ตัวละครทั้งสองให้ เราเกลือที่ใช้ ในฟังก์ชั่นห้องใต้ดิน และที่นี่เราจะเห็นว่าเกลือเป็นฮ่า ดังนั้นเราจึงต้องการคัดลอกสองคนแรก อักขระระยะเวลาในเกลือเป็นกัญชา กำหนดให้เป็นสอง เราต้องคัดลอกสองตัวแรก เป็นแบบนี้แถวเกลือ ขอให้สังเกตว่าเราต้องบวกระยะเวลาในเกลือ หนึ่งเนื่องจากเรายังคงต้องเป็นโมฆะ terminator ในตอนท้ายของเกลือของเรา แล้วเรากำลังจะประกาศอาร์เรย์นี้ แขกของความยาวสูงสุดที่ขนาดบวก หนึ่งที่ระยะเวลาสูงสุดคือกัญชาที่กำหนดไว้ เป็นแปดตั้งแต่รหัสผ่านสูงสุด เป็นแปดตัวอักษรยาว และเรากำลังจะใช้นี้เพื่อย้ำ กว่าสายที่เป็นไปได้ทั้งหมดที่จะทำได้ เป็นรหัสผ่านที่ถูกต้อง ดังนั้นถ้าตัวอักษรที่ถูกต้องในรหัสผ่าน เป็นแค่ A, B และ C แล้ว เราจะย้ำกว่า b, c, AA, ba, CA, และอื่น ๆ จน เราจะได้เห็น cccccccc - แปดของค และถ้าเรายังไม่ได้ลงที่ถูกต้อง รหัสผ่านแล้วเราต้องบอกว่า สายการเข้ารหัสไม่ได้ ที่ถูกต้องจะเริ่มต้นด้วย ดังนั้นตอนนี้เรามาถึงนี้ในขณะที่ 1 ห่วง ขอให้สังเกตว่าหมายความว่ามัน ห่วงอนันต์ ขอให้สังเกตว่ามีคำสั่งที่ไม่มีการหยุดพัก ภายในห่วงอนันต์นี้ มีเพียงงบกลับเป็น ดังนั้นเราจึงไม่เคยคาดหวัง เพื่อออกจากวง เราจะคาดหวังว่าจะออกจากโปรแกรม ฉันได้เพิ่มที่พิมพ์ข้อความนี้ไปยัง ด้านบนของวงนี้ที่จะเพียงแค่พิมพ์ออกมา สิ่งเดาในปัจจุบันของเราที่ รหัสผ่านคือสิ่งที่ ตอนนี้วงนี้จะทำอะไร มันวนลูปกับสตริงเป็นไปได้ทั้งหมด ที่อาจจะมีรหัสผ่านที่ถูกต้อง สิ่งแรกที่เรากำลังจะทำคือ จะคาดเดาในปัจจุบันของเราสำหรับสิ่งที่ รหัสผ่านคือ เราจะพาเกลือที่เราคว้าจาก สายการเข้ารหัสและเรา ไปเข้ารหัสเดา นี้จะช่วยให้เราเดาเข้ารหัส ซึ่งเรากำลังจะมีการเปรียบเทียบกับ สายการเข้ารหัสที่ผู้ใช้ เข้ามาที่บรรทัดคำสั่ง ถ้าพวกเขาจะเหมือนกันในกรณีที่ สตริงเทียบเคียงจะกลับมาเป็นศูนย์ถ้า พวกเขากำลังเดียวกันแล้วเดาถูก รหัสผ่านที่สร้างการเข้ารหัส สตริงซึ่งในกรณีนี้เราสามารถพิมพ์ ที่เป็นรหัสผ่านและผลตอบแทนของเรา แต่ถ้าพวกเขาไม่ได้เหมือนกันว่า หมายถึงการคาดเดาของเราไม่ถูกต้อง และเราต้องการที่จะย้ำไป คาดเดาที่ถูกต้องต่อไป ดังนั้นนั่นคือสิ่งที่ในขณะนี้ ห่วงพยายามที่จะทำ มันจะย้ำเดาของเรา การคาดเดาที่ถูกต้องต่อไป ขอให้สังเกตว่าเมื่อเราบอกว่า ตัวอักษรโดยเฉพาะอย่างยิ่งในการคาดเดาของเรามี ถึงสัญลักษณ์สูงสุดซึ่งขึ้นที่นี่ เป็นกัญชากำหนดให้เป็นตัวหนอนตั้งแต่ ที่ตัวอักษร ASCII ค่าที่มากที่สุด ที่ผู้ใช้สามารถป้อนที่ แป้นพิมพ์เมื่อตัวละครถึง สูงสุดสัญลักษณ์แล้วเราต้องการที่จะส่ง มันกลับไปที่สัญลักษณ์ขั้นต่ำซึ่ง เป็นพื้นที่อีกครั้ง ASCII ต่ำที่สุด สัญลักษณ์ค่าที่ผู้ใช้สามารถ ป้อนที่แป้นพิมพ์ ดังนั้นเราจะกำหนดว่า สัญลักษณ์ขั้นต่ำ แล้วเรากำลังจะไป ไปยังตัวอักษรถัดไป ดังนั้นวิธีการคาดเดาของเรา ไปย้ำ? ดีถ้าตัวอักษรที่ถูกต้องเป็น A, B, และ C แล้วถ้าเราเริ่มต้นด้วย, มันจะย้ำไป B ก็จะ ย้ำไปที่ C c คือสัญลักษณ์สูงสุดของเราดังนั้นเราจะตั้ง คกลับไป, สัญลักษณ์ขั้นต่ำ และจากนั้นเราจะย้ำดัชนี ไปยังตัวอักษรถัดไป ดังนั้นถ้าเดาเดิมคือ C, ต่อไป ตัวละครจะเป็นโมฆะ terminator ลงที่นี่แจ้งให้ทราบว่าถ้าตัวละคร ตอนนี้เราต้องการ เพิ่มขึ้นเป็นโมฆะ terminator, แล้วเรากำลังจะตั้งค่าให้ สัญลักษณ์ขั้นต่ำ ดังนั้นถ้าเดาคือ C แล้วของเรา ใหม่คาดเดาเป็นไปได้ AA และถ้าเดาเดิมของเราคือ CCCC แล้วเดาใหม่ของเรา เป็นไปได้ aaaaa ดังนั้นเมื่อใดก็ตามที่เราไปถึงสตริงสูงสุด จากระยะเวลาที่กำหนดแล้วเรา ไปดำเนินการตามขั้นต่ำสตริง ของความยาวต่อไปซึ่งจะ เป็นเพียงตัวอักษรทั้งหมดของ สัญลักษณ์ขั้นต่ำ ตอนนี้กำลังทำอะไรอยู่ที่นี่? ดีดัชนีถ้าย้ายจากแปด อักขระเก้าตัวอักษร - ดังนั้นเราจึงเพิ่มแปดของ c เป็น หน้าที่ของเราเดา - แล้วดัชนีจะมุ่งเน้นไปที่ ล่าสุด null terminator เดาของเรา อาร์เรย์ซึ่งไม่ได้หมายถึงจริง ที่จะใช้ในรหัสผ่านของเรา ดังนั้นหากเรามุ่งเน้นที่จะเป็นโมฆะสุดท้ายที่ เทอร์มิแล้วเรายังไม่ได้พบ รหัสผ่านที่ถูกต้องโดยใช้เพียงแปด ตัวอักษรซึ่งหมายความว่าไม่มี รหัสผ่านที่ถูกต้องที่เข้ารหัสลับ เพื่อสตริงที่กำหนด และเรามีการพิมพ์ที่บอกว่า เราไม่สามารถหาที่ถูกต้อง รหัสผ่านและผลตอบแทน ดังนั้นห่วงขณะนี้เป็นไปย้ำ กว่าสตริงเป็นไปได้ทั้งหมด หากพบการใด ๆ ที่จะเข้ารหัส สายการเข้ารหัสที่คาดไว้ก็จะ กลับรหัสผ่านที่ และมันก็ไม่พบสิ่งใดแล้ว มันจะกลับมาพิมพ์ว่า ไม่สามารถที่จะหาอะไร ตอนนี้สังเกตเห็นว่า iterating กว่าทั้งหมด สตริงที่เป็นไปได้อาจจะ ใช้เวลาสักครู่ ลองดูว่าจริง ที่ใช้เวลานาน ขอให้แตก ดีโอ๊ะ - มันพูดว่าไม่ได้กำหนด อ้างอิงไปยังห้องใต้ดิน ดังนั้นจำ, p สำหรับชุดข้อมูลจำเพาะและ นอกจากนี้ยังมีหน้าคนสำหรับฝังศพใต้ถุนโบสถ์ที่เรา จำเป็นต้องเชื่อมโยงในห้องใต้ดิน ตอนนี้เริ่มต้นทำคำสั่ง ไม่ทราบว่าคุณ ต้องการที่จะใช้ฟังก์ชั่นที่ เพื่อขอคัดลอกคำสั่งลูกค้ารายนี้ และเพียงแค่เพิ่มจนถึงที่สุด ของมันฝังศพใต้ถุนโบสถ์เชื่อมโยง ตอนนี้มันคอมไพล์ เพื่อขอทำงานแตกเมื่อได้รับ สายการเข้ารหัส - เพื่อให้ซีซาร์ เพื่อให้ได้อย่างรวดเร็วสวย ขอให้สังเกตว่านี้สิ้นสุดเมื่อวันที่ 13 ดีซีซาร์รหัสผ่านที่เข้ารหัส เกิดขึ้นเป็น 13 ดังนั้นลองใช้รหัสผ่านอีก ลองมา Hirschhorn ของการเข้ารหัส รหัสผ่านและพยายามที่แตกว่า ดังนั้นเราได้สังเกตเห็นถึงแล้ว สามตัวอักษร และเรากำลัง iterating กว่าเป็นไปได้ทั้งหมด สายสามตัวอักษร นั่นหมายความว่าเราได้แล้วเสร็จ iterating กว่าหนึ่งทั้งหมดเป็นไปได้และ สองสตริงตัวอักษร ตอนนี้ก็มีลักษณะเช่นนี้เป็นไปได้ ใช้เวลาสักครู่ก่อนที่เราจะไปถึง สายสี่ตัวอักษร มันอาจใช้เวลาไม่กี่นาที มันใช้เวลาไม่กี่นาที เราอยู่สายสี่ตัวอักษร แต่ตอนนี้เราจำเป็นต้องย้ำกว่าทั้งหมด สายสี่ตัวอักษรที่เป็นไปได้ซึ่ง ที่อาจต้องใช้เวลาอาจจะ 10 นาที และแล้วเมื่อเราไปถึงห้าตัวอักษร สตริงเราต้องย้ำกว่าทั้งหมด ของคนเหล่านั้นซึ่งอาจ ใช้เวลาสองสามชั่วโมง และเราจำเป็นต้องย้ำกว่าเป็นไปได้ทั้งหมด หกตัวอักษรสตริงซึ่ง อาจใช้เวลาสองสามวันและอื่น ๆ ดังนั้นมันอาจจะใช้เวลานานมากที่อาจเกิดขึ้น เวลาที่จะย้ำกว่าเป็นไปได้ทั้งหมด แปดตัวอักษรและสตริงน้อยลง ดังนั้นสังเกตเห็นว่าเรื่องนี้ไม่จำเป็นต้องเป็น อัลกอริทึมที่มีประสิทธิภาพมากสำหรับการค้นหา รหัสผ่าน คุณอาจจะคิดว่ามี วิธีที่ดีกว่านี้ ตัวอย่างเช่น ZYX รหัสผ่าน! 32ab อาจจะไม่ใช้รหัสผ่านที่พบมาก ในขณะที่รหัสผ่านคือ 12345 อาจมากขึ้นทั่วไป ดังนั้นวิธีหนึ่งในการพยายามที่จะหารหัสผ่าน ได้อย่างรวดเร็วคือการเพียงแค่มอง ที่รหัสผ่านที่จะมีอยู่มาก ดังนั้นสำหรับตัวอย่างเช่นเราสามารถพยายามที่จะอ่านคำ จากพจนานุกรมและพยายามทุก คำพูดเหล่านั้นเป็นที่คาดเดารหัสผ่านของเรา ตอนนี้อาจจะใช้รหัสผ่าน ไม่ง่ายที่ บางทีผู้ใช้ก็ค่อนข้างฉลาด และพยายามที่ท้ายตัวเลข ท้ายของคำ ดังนั้นบางทีรหัสผ่านของพวกเขา password1 เพื่อให้คุณสามารถลอง iterating กว่าทุกคำ ในพจนานุกรมที่มีหนึ่ง ต่อท้ายของมัน และแล้วบางทีหลังจากทำที่คุณจะ สองตัวต่อท้ายไปยังจุดสิ้นสุดของมัน หรือบางทีผู้ใช้จะพยายามที่จะเป็นได้ ฉลาดมากขึ้นและพวกเขาต้องการของพวกเขา รหัสผ่านจะเป็น "แฮกเกอร์" แต่พวกเขากำลัง ไปแทนที่ทุกกรณีของ e กับสาม เพื่อให้คุณสามารถทำเช่นนี้เกินไป ย้ำกว่าทุกคำในพจนานุกรม แต่แทนที่ตัวอักษรที่ มีลักษณะเหมือนตัวเลขกับตัวเลขเหล่านั้น ดังนั้นวิธีนี้คุณอาจจะจับได้มากยิ่งขึ้น รหัสผ่านที่รักกัน แต่ในท้ายที่สุดเพียงวิธีเดียวที่คุณสามารถทำได้ จับรหัสผ่านทั้งหมดคือการเดรัจฉาน บังคับให้ย้ำกว่าทั้งหมด สตริงที่เป็นไปได้ ดังนั้นในที่สุดคุณต้องย้ำ กว่าสตริงทั้งหมดจากตัวละครตัวหนึ่งไป แปดตัวอักษรซึ่งอาจต้องใช้เวลา เป็นเวลานานมาก แต่คุณต้องทำมัน ชื่อของฉันคือร็อบโบว์ และนี่คือโปรแกรม