แคร็กมีโอเพ่น
เตรียมตัวให้พร้อมสำหรับความสนุกในการแฮ็ก! ในบล็อกโพสต์นี้ เราจะแสดงวิธีแยกไฟล์ปฏิบัติการ C อย่างง่ายที่รักษาความปลอดภัยด้วยรหัสผ่านโดยใช้ Ubuntu 20.04 LTS ไม่ว่าคุณจะเพิ่งเริ่มต้นหรือมืออาชีพที่ช่ำชอง บทช่วยสอนนี้มีบางสิ่งสำหรับทุกคน ได้เวลาพลิกแพลงทักษะด้านไซเบอร์แล้ว!
ไฟล์ทั้งหมดที่ใช้ในบทช่วยสอนนี้สามารถพบได้บน GitHub ที่นี่ คุณสามารถโคลนที่เก็บลงในสภาพแวดล้อมภายในเครื่องของคุณเพื่อเข้าถึงไฟล์ที่เข้ารหัส
ในการเริ่มต้น เราสามารถเรียกใช้งานcrackmeไฟล์เพื่อสังเกตพฤติกรรมของมันได้โดยไปที่ไดเร็กทอรีของ crackme และป้อนคำสั่งต่อไปนี้:
$ ./crackme
Access Denied
คำfileสั่งใช้เพื่อระบุประเภทของไฟล์ ทำได้โดยดำเนินการทดสอบเป็นชุดตามลำดับเฉพาะ: การทดสอบระบบไฟล์ การทดสอบเลขมหัศจรรย์และการทดสอบภาษา
การทดสอบเหล่านี้ออกแบบมาเพื่อกำหนดประเภทของไฟล์ตามเนื้อหาและข้อมูลเมตาที่เกี่ยวข้อง หากคุณต้องการใช้fileคำสั่งเพื่อระบุประเภทของไฟล์เฉพาะ คุณสามารถทำได้โดยเรียกใช้file [filename]ในเทอร์มินัลของคุณ ตัวอย่างเช่น:
$ file crackme
crackme: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=e06e0b0229279a69506925702a7f79e36bdc3eb2, not stripped
- ไฟล์ปฏิบัติการที่ออกแบบมาเพื่อรันบนระบบปฏิบัติการ Linux แบบ 64 บิต
- คอมไพล์สำหรับสถาปัตยกรรม x86–64 และเชื่อมโยงแบบไดนามิก หมายความว่ามันอาศัยไลบรารีที่ใช้ร่วมกันในการทำงาน
- ตีความโดยล่าม /lib64/ld-linux-x86–64.so.2
- สร้างขึ้นสำหรับ GNU/Linux 2.6.24 และมีตัวระบุเฉพาะที่เรียกว่า “BuildID”
- ยังไม่ได้ลอกออก ดังนั้นจึงยังคงมีข้อมูลการดีบักและสัญลักษณ์ที่สามารถใช้สำหรับการวิเคราะห์ได้
นอกจากนี้ยังควรสังเกตว่าltraceสามารถใช้ร่วมกับเครื่องมืออื่นๆ เช่นgdb( GNU Debugger ) เพื่อวิเคราะห์พฤติกรรมของโปรแกรมเพิ่มเติมและอาจทำวิศวกรรมย้อนกลับซึ่งเราจะไม่ใช้สำหรับบทช่วยสอนนี้
เราสามารถเรียกใช้ltraceไฟล์ crack me ได้โดยป้อนคำสั่งต่อไปนี้:
$ ltrace ./crackme
__libc_start_main(0x40087d, 1, 0x7ffeef764458, 0x400a70 <unfinished ...>
strncmp("SHELL=/bin/bash", "Passw0rd=", 9) = 3
strncmp("PWD=/home/vagrant/crackme_tutori"..., "Passw0rd=", 9) = -10
strncmp("LOGNAME=vagrant", "Passw0rd=", 9) = -4
strncmp("XDG_SESSION_TYPE=tty", "Passw0rd=", 9) = 8
strncmp("MOTD_SHOWN=pam", "Passw0rd=", 9) = -3
strncmp("HOME=/home/vagrant", "Passw0rd=", 9) = -8
strncmp("LANG=C.UTF-8", "Passw0rd=", 9) = -4
strncmp("LS_COLORS=rs=0:di=01;34:ln=01;36"..., "Passw0rd=", 9) = -4
strncmp("SSH_CONNECTION=10.0.2.2 61015 10"..., "Passw0rd=", 9) = 3
strncmp("LESSCLOSE=/usr/bin/lesspipe %s %"..., "Passw0rd=", 9) = -4
strncmp("XDG_SESSION_CLASS=user", "Passw0rd=", 9) = 8
strncmp("TERM=xterm-256color", "Passw0rd=", 9) = 4
strncmp("LESSOPEN=| /usr/bin/lesspipe %s", "Passw0rd=", 9) = -4
strncmp("USER=vagrant", "Passw0rd=", 9) = 5
strncmp("SHLVL=1", "Passw0rd=", 9) = 3
strncmp("XDG_SESSION_ID=22", "Passw0rd=", 9) = 8
strncmp("XDG_RUNTIME_DIR=/run/user/1000", "Passw0rd=", 9) = 8
strncmp("SSH_CLIENT=10.0.2.2 61015 22", "Passw0rd=", 9) = 3
strncmp("XDG_DATA_DIRS=/usr/local/share:/"..., "Passw0rd=", 9) = 8
strncmp("PATH=/usr/local/sbin:/usr/local/"..., "Passw0rd=", 9) = -32
strncmp("DBUS_SESSION_BUS_ADDRESS=unix:pa"..., "Passw0rd=", 9) = -12
strncmp("SSH_TTY=/dev/pts/0", "Passw0rd=", 9) = 3
strncmp("OLDPWD=/home/vagrant/crackme_tut"..., "Passw0rd=", 9) = -1
strncmp("_=/usr/bin/ltrace", "Passw0rd=", 9) = 15
puts("Access Denied"Access Denied
) = 14
+++ exited (status 1) +++
PC: ALX
__libc_start_mainเป็นฟังก์ชันที่ตั้งค่าสภาพแวดล้อมของโปรแกรมและเรียกใช้ฟังก์ชันหลัก ใช้อาร์กิวเมนต์ต่าง ๆ และจัดทำโดยไลบรารีมาตรฐาน C ( libc ) มันถูกเรียกโดยฟังก์ชันจุดเข้าใช้งานหลักของโปรแกรม- บรรทัดที่ขึ้นต้นด้วย
strncmpแสดงว่าโปรแกรมกำลังเรียกใช้strncmpฟังก์ชัน ซึ่งเป็นฟังก์ชันที่เปรียบเทียบจำนวนอักขระที่กำหนด (ในกรณีนี้คือ 9 อักขระ) ของสองสตริง สตริงที่ถูกเปรียบเทียบดูเหมือนจะเป็นตัวแปรสภาพแวดล้อมต่างๆ (เช่น "SHELL", "PWD", "LOGNAME" ฯลฯ) และ"Passw0rd="สตริง ดูเหมือนว่าโปรแกรมกำลังตรวจสอบว่ามีตัวแปรสภาพแวดล้อมใด ๆ ที่ขึ้นต้นด้วย string"Passw0rd="หรือไม่ - ฟังก์ชัน
putsนี้ถูกเรียกใช้ที่ท้ายด้วยสตริง " Access Denied " ซึ่งอาจแสดงว่าโปรแกรมกำลังพิมพ์ข้อความนี้หากไม่มีตัวแปรสภาพแวดล้อมที่ขึ้นต้น"Passw0rd="ด้วย
ในการตั้งค่าตัวแปรสภาพแวดล้อมใน Linux เราสามารถใช้exportคำสั่งในเทอร์มินัล ตัวอย่างเช่น ในการตั้งค่าตัวแปรสภาพแวดล้อมที่ตั้งชื่อPassw0rdเป็นค่าtestเราสามารถเรียกใช้:
export Passw0rd=test
$ ltrace ./crackme
__libc_start_main(0x40087d, 1, 0x7fff085f1d38, 0x400a70 <unfinished ...>
strncmp("SHELL=/bin/bash", "Passw0rd=", 9) = 3
strncmp("PWD=/home/vagrant/crackme_tutori"..., "Passw0rd=", 9) = -10
strncmp("LOGNAME=vagrant", "Passw0rd=", 9) = -4
strncmp("XDG_SESSION_TYPE=tty", "Passw0rd=", 9) = 8
strncmp("MOTD_SHOWN=pam", "Passw0rd=", 9) = -3
strncmp("HOME=/home/vagrant", "Passw0rd=", 9) = -8
strncmp("LANG=C.UTF-8", "Passw0rd=", 9) = -4
strncmp("LS_COLORS=rs=0:di=01;34:ln=01;36"..., "Passw0rd=", 9) = -4
strncmp("SSH_CONNECTION=10.0.2.2 61015 10"..., "Passw0rd=", 9) = 3
strncmp("LESSCLOSE=/usr/bin/lesspipe %s %"..., "Passw0rd=", 9) = -4
strncmp("XDG_SESSION_CLASS=user", "Passw0rd=", 9) = 8
strncmp("TERM=xterm-256color", "Passw0rd=", 9) = 4
strncmp("LESSOPEN=| /usr/bin/lesspipe %s", "Passw0rd=", 9) = -4
strncmp("USER=vagrant", "Passw0rd=", 9) = 5
strncmp("SHLVL=1", "Passw0rd=", 9) = 3
strncmp("XDG_SESSION_ID=22", "Passw0rd=", 9) = 8
strncmp("XDG_RUNTIME_DIR=/run/user/1000", "Passw0rd=", 9) = 8
strncmp("SSH_CLIENT=10.0.2.2 61015 22", "Passw0rd=", 9) = 3
strncmp("XDG_DATA_DIRS=/usr/local/share:/"..., "Passw0rd=", 9) = 8
strncmp("PATH=/usr/local/sbin:/usr/local/"..., "Passw0rd=", 9) = -32
strncmp("Passw0rd=test", "Passw0rd=", 9) = 0
MD5_Init(0x7fff085f1b90, 0x400b06, 9, 6) = 1
strlen("test") = 4
MD5_Update(0x7fff085f1b90, 0x7fff085f2f68, 4, 0x7fff085f2f68) = 1
MD5_Final(0x7fff085f1bf0, 0x7fff085f1b90, 0x7fff085f1b90, 0) = 1
sprintf("09", "%02x", 0x9) = 2
sprintf("8f", "%02x", 0x8f) = 2
sprintf("6b", "%02x", 0x6b) = 2
sprintf("cd", "%02x", 0xcd) = 2
sprintf("46", "%02x", 0x46) = 2
sprintf("21", "%02x", 0x21) = 2
sprintf("d3", "%02x", 0xd3) = 2
sprintf("73", "%02x", 0x73) = 2
sprintf("ca", "%02x", 0xca) = 2
sprintf("de", "%02x", 0xde) = 2
sprintf("4e", "%02x", 0x4e) = 2
sprintf("83", "%02x", 0x83) = 2
sprintf("26", "%02x", 0x26) = 2
sprintf("27", "%02x", 0x27) = 2
sprintf("b4", "%02x", 0xb4) = 2
sprintf("f6", "%02x", 0xf6) = 2
strcmp("c4032d9e95a93d91b9b595dcfcca640b"..., "098f6bcd4621d373cade4e832627b4f6"...) = 51
puts("Access Denied"Access Denied
) = 14
+++ exited (status 1) +++
PC: Here
- เราทราบอยู่แล้วว่าบรรทัดแรกแสดงว่า
__libc_start_mainฟังก์ชันถูกเรียกใช้โดยมีอาร์กิวเมนต์สี่ตัว: ที่อยู่ของฟังก์ชันหลัก จำนวนอาร์กิวเมนต์ของโปรแกรม ตัวชี้ไปยังอาร์เรย์ของอาร์กิวเมนต์ของโปรแกรม และตัวชี้ไปยังฟังก์ชันที่จะเรียกเมื่อฟังก์ชันหลัก ผลตอบแทน - บรรทัดต่อไปนี้แสดงชุดของการเรียกใช้
strncmpฟังก์ชัน ซึ่งเปรียบเทียบสองสตริงและส่งกลับจำนวนเต็มซึ่งระบุการเรียงลำดับคำศัพท์ ดูเหมือนว่าโปรแกรมกำลังพยายามเปรียบเทียบตัวแปรสภาพแวดล้อมแต่ละตัวในระบบกับ"Passw0rd="สตริง - หลังจากนี้ จะมีการเรียกใช้ ฟังก์ชัน
MD5_Init,MD5_UpdateและMD5_Finalซึ่งเป็นส่วนหนึ่งของฟังก์ชันแฮชการเข้ารหัส MD5 ดูเหมือนว่าโปรแกรมกำลังคำนวณแฮช MD5 ของค่าของตัวแปรสภาพแวดล้อม Passw0rd - ถัดไป มีการเรียกใช้
sprintfฟังก์ชัน ซึ่งจัดรูปแบบสตริงและเก็บไว้ในบัฟเฟอร์ ดูเหมือนว่าโปรแกรมกำลังจัดรูปแบบไบต์ของแฮช MD5 เป็นค่าเลขฐานสิบหกและจัดเก็บไว้ในสตริง - เอาต์พุตรวมการเรียกใช้
strcmpฟังก์ชันที่มีอาร์กิวเมนต์สองสตริง: "c4032d9e95a93d91b9b595dcfcca640b" และ "098f6bcd4621d373cade4e832627b4f6" สิ่งนี้บ่งชี้ว่าโปรแกรมกำลังเปรียบเทียบแฮช MD5 ของรหัสผ่านกับแฮชของตัวแปรสภาพแวดล้อม Passw0rd ที่ถูกเอ็กซ์พอร์ต - ฟังก์ชัน
putsนี้ถูกเรียกใช้ในตอนท้ายด้วยสตริง "Access Denied" ซึ่งบ่งชี้ว่า Passw0rd ไม่ถูกต้อง อย่างไรก็ตาม ปัญหานี้น่าจะได้รับการแก้ไขในเร็วๆ นี้
เราสามารถใช้ เว็บไซต์ นี้เพื่อย้อนกลับสตริงที่แฮชเป็นค่าได้
ตอนนี้เราได้พิจารณาแล้วว่ารหัสผ่านที่แฮชคือLionelMessiเราสามารถตั้งค่าPassw0rdตัวแปรสภาพแวดล้อมเป็นค่านี้และรันltraceคำสั่งอีกครั้งเพื่อดูว่าสร้างผลลัพธ์ที่แตกต่างออกไปหรือไม่ มาลองกัน!
$ export Passw0rd=LionelMessi
$ ./crackme
Access Granted
จำไว้เสมอว่าให้ใช้รหัสผ่านที่รัดกุมและไม่ซ้ำใคร และห้ามใช้รหัสผ่านซ้ำในบัญชีต่างๆ
คอยติดตามการเปิดตัวGitHubของโปรแกรม C ที่เปรียบเทียบแฮช MD5 กับพจนานุกรมและแปลงกลับเป็นรูปแบบสตริงดั้งเดิม คอยติดตาม!
เราหวังว่าคุณจะชอบบทช่วยสอนเกี่ยวกับการแคร็กไฟล์อย่างง่ายนี้ หากคุณมีความคิดเห็นหรือคำถามใดๆ โปรดอย่าลังเลที่จะทิ้งไว้ในส่วนความคิดเห็นด้านล่าง มีความสุขในการแฮ็ค!





































![รายการที่เชื่อมโยงคืออะไร? [ส่วนที่ 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)