# Reversing ELF (TryHackMe) ![image](https://hackmd.io/_uploads/SyJ0f-7B6.png) #### crackme1 ![image](https://hackmd.io/_uploads/SJBbXbXSa.png) tôi download file về và chạy nó và ra flag: ![image](https://hackmd.io/_uploads/rkgJPmbmSp.png) #### crackme2 ![image](https://hackmd.io/_uploads/ryooQ-Xr6.png) tôi tải file về và chạy nó trên gdb-peda ![image](https://hackmd.io/_uploads/BJSx4-7rp.png) sau đó tôi chạy lệnh: ```disas main``` để xem luồng chạy của chương trình và đặt break point tại địa chỉ hàm compare là 0x080484e1 bằng lênh: ```break *0x080484e1``` ![image](https://hackmd.io/_uploads/SkepIbQrp.png) sau đó tôi chạy chương trình đến break point đã đặt bằng lệnh ```run 1234``` (tôi nhập password bừa là 1234) ![image](https://hackmd.io/_uploads/S1B4_ZXB6.png) chương trình đã chạy đến lời gọi hàm cmp tôi đã đặt break point trước đó và tôi có thể thấy ở phần stack là các tham số chương trình đã đẩy vào bộ nhớ stack để chuẩn bị cho hàm cmp ![image](https://hackmd.io/_uploads/ryVytW7rT.png) trong stack tôi thấy phần password tôi đã nhập vào là 1234 và password cần tìm đó là ```super_secret_password``` và tôi chạy tiếp vào hàm cmp bằng lệnh ```step``` có thể thấy password của tôi sẽ được so sánh với "super_secret_password" ![image](https://hackmd.io/_uploads/Bk1n9-mH6.png) #### Crackme3 ![image](https://hackmd.io/_uploads/SJvJob7B6.png) tôi tải file về và chạy lệnh ```strings Crackme3``` và tôi thấy trước dòng chữ dòng chữ "Correct password!" là một đoạn mã hóa Base64 là "ZjByX3kwdXJfNWVjMG5kX2xlNTVvbl91bmJhc2U2NF80bGxfN2gzXzdoMW5nNQ==" ![image](https://hackmd.io/_uploads/S19Ds-QHT.png) và tôi đi decode nó bằng cyberchef và được flag ![image](https://hackmd.io/_uploads/S1hijb7Bp.png) #### Crackme4 tôi chạy file này: ![image](https://hackmd.io/_uploads/B16gpWQBa.png) và tôi tiếp tục chạy gdb-peda và ```disas main``` và tôi đặt break point tại lời gọi hàm compare_pwd: ```break *0x0000000000400754``` ![image](https://hackmd.io/_uploads/H17tyGQH6.png) tôi ```run 123``` sau đó dùng lệnh ```step``` đề nhảy vào hàm compare_pwd và tiếp tục chạy từng câu lệnh của chương trình bằng lệnh ```ni``` và theo dõi trên stack thấy được password cần tìm là "my_m0r3_secur3_pwd" ![image](https://hackmd.io/_uploads/rkkH1MQS6.png) #### Crackme5 tôi tiếp tục chạy như Crackme4 đặt break point tại ```break *0x000000000040082f``` sau đó chạy chương trình đến điểm này và nhảy vào hàm strcmp bằng ```step``` ![image](https://hackmd.io/_uploads/H1gRbfXHp.png) và chạy tiếp các dòng lệnh trong này bằng lệnh ```ni``` và tôi tìm được flag là ```OfdlDSA|3tXb32~X3tX@sX`4tXtz``` ![image](https://hackmd.io/_uploads/rkkrMz7rT.png) #### Crackme6 ![image](https://hackmd.io/_uploads/B1LJXMQHa.png) tôi vẫn đặt break point tại hàm compare_pwd và chạy vào hàm đó bằng lệnh ```step``` để xem cấu trúc code ![image](https://hackmd.io/_uploads/SyDc_H7B6.png) tiếp theo đó tôi thấy trong hàm này có lời gọi hàm "my_secure_test" và tôi vào trong hàm này xem cấu trúc code bằng lệnh: ```disas my_secure_test``` ![image](https://hackmd.io/_uploads/r1-HKSXHp.png) và tôi thấy 1 khối code rất dài với nhiều điều kiện so sánh, để dễ đọc code hơn tôi đã chuyển sang dùng IDA ![image](https://hackmd.io/_uploads/HyXl3SXra.png) tôi kiểm tra các hàm điều không thấy ghi pass có thể bài này sẽ kiểm tra password hợp lệ trong hàm my_secure_test sẽ giúp tôi suy ra đáp án tôi vào hàm my_secure_test để đọc ![image](https://hackmd.io/_uploads/r176KHXra.png) ![image](https://hackmd.io/_uploads/HJm45rXHT.png) ở đây là 1 khối code if else rất dài và tôi có gắng bypass qua từng lệnh điều khiển và trên từng lệnh tôi thấy có comment các ký tự như "1","_","p","d","w" ![image](https://hackmd.io/_uploads/rJGIsHmHp.png) và tôi ghép chúng lại ra đáp án là ![image](https://hackmd.io/_uploads/ryXCqBQr6.png) bài này không viết sẵn một chuỗi password để kiểm tra mà tách từng kí tự của chuỗi ra để kiểm tra nên chúng ta cần vượt qua từng testcase để đạt được password cuối cùng #### Crackme7 ![image](https://hackmd.io/_uploads/SyI_arQS6.png) chạy chương trình tôi không thấy có gì chỉ đơn giản là chào và làm phép toán cộng và chúng ta có thể nhập các số để yêu cầu chương trình thực hiện và để tìm được flag thì chúng ta cần tìm được số này để nhập vào tồi dùng IDA và nhấn ```F5``` đề đọc source trong hàm main ![image](https://hackmd.io/_uploads/B1KEnI7Sp.png) tôithấy hàm giveFlag() và thử vào hàm giveFlag đọc: ![image](https://hackmd.io/_uploads/rkKkTLXrp.png) ở hàm này không có chuỗi password mà nó gen ra bởi hàm for ![image](https://hackmd.io/_uploads/BJ5BTUmH6.png) ở đây tôi thấy nhập vào tham số là 31337 thì sẽ gọi được đến hàm giveFlag() và tôi nhập số đó vào ![image](https://hackmd.io/_uploads/By2i1Lmrp.png) #### Crackme8 tương tự bài 7 tôi dùng IDA vào hàm main chuyển sang source code C và thấy "atoi(argv[1]) == -889262067" thì sẽ gọi hàm giveFlag() vậy khi chuyền vào chương trihh giá trị trên thì sẽ lấy được flag ![image](https://hackmd.io/_uploads/HyBkRU7Ba.png) vậy khi chuyền vào chương trihh giá trị trên thì sẽ lấy được flag ![image](https://hackmd.io/_uploads/rkou0ImHT.png)