crackme mở
Hãy sẵn sàng cho một số niềm vui hack! Trong bài đăng trên blog này, chúng tôi sẽ chỉ cho bạn cách đột nhập vào một tệp thực thi C đơn giản được bảo mật bằng mật khẩu sử dụng Ubuntu 20.04 LTS. Cho dù bạn mới bắt đầu hay một chuyên gia dày dạn kinh nghiệm, hướng dẫn này đều có nội dung dành cho tất cả mọi người. Thời gian để linh hoạt những kỹ năng mạng!
Tất cả các tệp được sử dụng trong hướng dẫn này có thể được tìm thấy trên GitHub tại đây . Bạn có thể sao chép kho lưu trữ vào môi trường cục bộ của mình để truy cập các tệp được mã hóa.
Để bắt đầu, chúng ta có thể thực thi crackmetệp để quan sát hành vi của nó bằng cách điều hướng đến thư mục crackme và nhập lệnh sau:
$ ./crackme
Access Denied
Lệnh fileđược sử dụng để xác định loại tệp. Nó thực hiện điều này bằng cách thực hiện một loạt kiểm tra theo một thứ tự cụ thể: kiểm tra hệ thống tập tin , kiểm tra số ma thuật và kiểm tra ngôn ngữ .
Các thử nghiệm này được thiết kế để xác định loại tệp dựa trên nội dung của tệp và bất kỳ siêu dữ liệu nào được liên kết với tệp. Nếu bạn muốn sử dụng filelệnh để xác định loại tệp cụ thể, bạn có thể làm như vậy bằng cách chạy file [filename]trong thiết bị đầu cuối của mình. Ví dụ:
$ 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
- Một tệp thực thi được thiết kế để chạy trên hệ điều hành Linux 64 bit
- Được biên dịch cho kiến trúc x86–64 và được liên kết động, nghĩa là nó dựa vào các thư viện dùng chung để hoạt động
- Được giải thích bởi trình thông dịch /lib64/ld-linux-x86–64.so.2
- Được xây dựng cho GNU/Linux 2.6.24 và có một mã định danh duy nhất được gọi là “BuildID”
- Chưa bị loại bỏ, vì vậy nó vẫn chứa thông tin gỡ lỗi và các biểu tượng có thể được sử dụng để phân tích.
Cũng đáng lưu ý rằng ltracecó thể được sử dụng cùng với các công cụ khác như gdb( GNU Debugger ) để phân tích sâu hơn hành vi của chương trình và có khả năng thiết kế ngược nó mà chúng ta sẽ không sử dụng cho hướng dẫn này.
Chúng ta có thể chạy ltracetrên file crack me bằng cách nhập lệnh sau:
$ 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_mainlà một chức năng thiết lập môi trường của chương trình và gọi chức năng chính của nó. Nó có nhiều đối số khác nhau và được cung cấp bởi thư viện chuẩn C ( libc ). Nó được gọi bởi chức năng điểm vào chính của chương trình.- Các dòng bắt đầu bằng
strncmpcho thấy rằng chương trình đang gọistrncmphàm, đây là hàm so sánh một số ký tự đã cho (trong trường hợp này là 9 ký tự) của hai chuỗi. Các chuỗi được so sánh dường như là các biến môi trường khác nhau (ví dụ: "SHELL", "PWD", "LOGNAME", v.v.) và chuỗi"Passw0rd=". Có vẻ như chương trình đang kiểm tra xem có bất kỳ biến môi trường nào bắt đầu bằng chuỗi hay không"Passw0rd=". - Hàm
putsđược gọi ở cuối với chuỗi " Access Denied ", điều này có thể cho biết chương trình đang in thông báo này nếu không có biến môi trường nào bắt đầu bằng"Passw0rd=".
Để đặt biến môi trường trong Linux, chúng ta có thể sử dụng exportlệnh trong terminal. Ví dụ: để đặt biến môi trường có tên Passw0rdthành giá trị là test, chúng ta có thể chạy:
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
- Chúng ta đã biết dòng đầu tiên cho thấy
__libc_start_mainhàm được gọi với bốn đối số: địa chỉ của hàm chính, số lượng đối số của chương trình, một con trỏ tới một mảng các đối số của chương trình và một con trỏ tới hàm được gọi khi hàm chính trở lại. - Các dòng sau hiển thị một loạt lệnh gọi đến
strncmphàm so sánh hai chuỗi và trả về một số nguyên cho biết thứ tự từ điển của chúng. Có vẻ như chương trình đang cố so sánh từng biến môi trường trong hệ thống với chuỗi"Passw0rd=". - Sau đó, có các cuộc gọi đến các hàm
MD5_Init,MD5_UpdatevàMD5_Finallà một phần của hàm băm mật mã MD5 . Có vẻ như chương trình đang tính toán hàm băm MD5 của giá trị của biến môi trường Passw0rd. - Tiếp theo, có các lời gọi đến
sprintfhàm, định dạng một chuỗi và lưu trữ nó trong bộ đệm. Có vẻ như chương trình đang định dạng các byte của hàm băm MD5 dưới dạng giá trị thập lục phân và lưu trữ chúng trong chuỗi. - Đầu ra bao gồm lệnh gọi
strcmphàm với hai chuỗi làm đối số: "c4032d9e95a93d91b9b595dcfcca640b" và "098f6bcd4621d373cade4e832627b4f6". Điều này chỉ ra rằng chương trình đang so sánh hàm băm MD5 của mật khẩu với hàm băm của biến môi trường Passw0rd đã được xuất. - Hàm
putsđược gọi ở cuối với chuỗi "Truy cập bị từ chối", cho biết rằng Passw0rd không chính xác. Tuy nhiên, điều này có thể sẽ sớm được giải quyết.
Chúng tôi có thể sử dụng trang web này để đảo ngược các chuỗi đã băm thành giá trị của chúng.
Bây giờ chúng tôi đã xác định rằng mật khẩu băm là LionelMessi , chúng tôi có thể đặt Passw0rdbiến môi trường thành giá trị này và chạy lại ltracelệnh để xem nó có tạo ra kết quả khác không. Thử một lần đi!
$ export Passw0rd=LionelMessi
$ ./crackme
Access Granted
Điều quan trọng cần nhớ là sử dụng mật khẩu mạnh, duy nhất và không bao giờ sử dụng lại mật khẩu trên các tài khoản khác nhau.
Hãy theo dõi bản phát hành sắp tới của chúng tôi trên GitHub của chương trình C so sánh các giá trị băm MD5 với từ điển và đảo ngược chúng về dạng chuỗi ban đầu. Giữ nguyên!
Chúng tôi hy vọng bạn thích hướng dẫn bẻ khóa một tệp đơn giản này. Nếu bạn có bất kỳ nhận xét hoặc câu hỏi nào, xin vui lòng để lại chúng trong phần bình luận bên dưới. Chúc mừng hack!

![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































