Bài giảng Lập trình an toàn - Chương 7: Anti Tampering - Lương Ánh Hoàng
7.1 Phát hiện thay đổi (Detecting modification)
7.2 Che giấu mã (Code hiding)
7.3 Sử dụng con trỏ hàm (Function Pointer)
7.4 Giấu xâu (String hiding)
7.5 Phát hiện debugger (Anti-Debugger)
7.6 Self-modifying code
7.7 Giải pháp tổng thể
Bạn đang xem tài liệu "Bài giảng Lập trình an toàn - Chương 7: Anti Tampering - Lương Ánh Hoàng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Bài giảng Lập trình an toàn - Chương 7: Anti Tampering - Lương Ánh Hoàng
Lương Ánh Hoàng hoangla@soict.hut.edu.vn Chương 7. Anti-‐Tampering 7.1 Phát hiện thay đổi (Detecting modi}ication) 7.2 Che giấu mã (Code hiding) 7.3 Sử dụng con trỏ hàm (Function Pointer) 7.4 Giấu xâu (String hiding) 7.5 Phát hiện debugger (Anti-‐Debugger) 7.6 Self-‐modifying code 7.7 Giải pháp tổng thể Nội dung 119 • Mục tiêu: Phát hiện chương trình đã bị crack chưa (Detecting modi}ication) • Kỹ thuật: – Tính MD5, SHA1, hoặc HMAC mã lệnh của }ile thực thi. – Đánh dấu một đoạn trong chương trình sẽ dùng để lưu mã băm }ile thực thi và ghi giá trị băm vào đó bằng một chương trình Hex edit khác. – Tại thời điểm runtime tính lại giá trị băm của }ile thực thi và so sánh với mã băm trước đó. • Ví dụ: 7.1 Phát hiện thay đổi mã lệnh 120 // Khai báo xâu đánh dấu mã băm char * md5hash = "AAAAXXXXXXXXXXXXXXXX"; int _tmain(int argc, _TCHAR* argv[]) { unsigned char hash[16];// Giá trị băm tính được unsigned char expectedhash[16];// Giá trị băm lưu trong }ile FILE * fp = fopen(argv[0],"rb");// Mở }ile để tính lại giá trị băm unsigned char * pFile ; fseek(fp,0,SEEK_END); int len = ftell(fp); • Ví dụ: 7.1 Phát hiện thay đổi mã lệnh 121 pFile = (unsigned char*)malloc(len); fseek(fp,0,SEEK_SET); fread(pFile,1,len,fp); md5hash = 0; for (int i=0;i<len-‐20;i++) // Dò tìm giá trị băm trong }ile if ((pFile[i]=='A')&&(pFile[i+1]=='A')&& (pFile[i+2]=='A')&&(pFile[i+3]=='A')) { memcpy(expectedhash,pFile+i+4,16); // Lưu ra mảng khác memset(pFile+i+4,0,16); // Xóa trắng giá trị này trong }ile } MD5(pFile,len,hash); // Tính lại giá trị băm printf("File hash:"); print_md5(hash); printf("Expected hash:"); print_md5(expectedhash); if (memcmp(hash,expectedhash,16)) { printf("File veri}ication failed"); } getch(); return 0; } • Hạn chế – Dễ bị đánh bại nếu sử dụng hash vì cracker cũng có thể tính lại giá trị băm và sửa }ile cho chính xác. – Nếu sử dụng HMAC thì phải lưu mật khẩu ở đâu đó • Lưu trong }ile: Cũng sẽ bị cracker dò ra • Lưu trên internet: cần có kết nối internet và dễ dàng bị dò ra nếu dùng sniffer. • CURL 7.1 Phát hiện thay đổi mã lệnh 122 • Mục tiêu – Gây khó khăn cho quá trình dịch ngược và phân tích bằng các disassembler (Obfuscating code). Windasm, OllyDbg, IDA – Che giấu các cấu trúc điều khiển quan trọng trong chương trình. • Cấu trúc điều kiện • Cấu trúc lặp • Kỹ thuật – Cần sự hỗ trợ của trình biên dịch – Thực hiện ở mức hợp ngữ – Sử dụng các điều kiện so sánh “bất thường” • So sánh khác thay vì bằng • Vòng lặp giảm thay vì tăng. • Vòng lặp có chỉ số tăng khác 1. • 7.2 Che giấu mã 123 • Mục tiêu – Gây khó khăn cho các công cụ disassembler trong việc phân tích lời gọi hàm • Kỹ thuật – Không thực hiện lời gọi hàm trực tiếp trong chương trình mà sử dụng các con trỏ hàm. – VD 7.3 Sử dụng con trỏ hàm 124 void my_func() { } typedef void (*FUNC)(); int _tmain(int argc, _TCHAR* argv[]) { FUNC ptr; ptr = my_func; printf("ptr address:%p",ptr); ptr(); /* make the function call */ return 0; } • Mục tiêu – Gây khó khăn cho các công cụ disassembler trong việc phân tích các xâu nhạy cảm trong chương trình.VD • Invalid cd-‐key • Registration successful • • Kỹ thuật – Mã hóa các xâu trong chương trình • Base64 • RC4 • Giải thuật tự chọn • 7.4 Giấu xâu 125 • Ví dụ: dịch mã các ký tự trong xâu đi 0x19 7.4 Giấu xâu 126 #include #de}ine A(c) (c) -‐ 0x19 #de}ine UNHIDE_STR(str) do { char *p = str; while (*p) *p++ += 0x19; } while (0) #de}ine HIDE_STR(str) do { char *p = str; while (*p) *p++ -‐= 0x19; } while (0) int main(int argc, char *argv[ ]) { char str[ ] = { A('/'), A('e'), A('t'), A('c'), A('/'), A('p'), A('a'), A('s'), A('s'), A('w'), A('d'), 0 }; UNHIDE_STR(str); printf("%s\n", str); HIDE_STR(str); return 0; } • Mục đích: Phát hiện sự tồn tại của debugger • Kỹ thuật: rất nhiều (google : anti-‐debugger) – Kernel32!IsDebuggerPresent – PEB!IsDebugged – PEB!NtGlobalFlags – Self-‐debugging – . • Ví dụ 7.5 Phát hiện debugger 127 #include int _tmain(int argc, _TCHAR* argv[]) { if(IsDebuggerPresent()) { printf("Program is being debugged"); } return 0; } • Mục đích: – Mã hóa lệnh quan trọng, chỉ giải mã khi cần thực hiện • Kỹ thuật – Không có sự trợ giúp của trình biên dịch. – Gần như không thể thực hiện bằng C/C++ – Cần hiểu rất sâu về hệ điều hành + hợp ngữ – Googe: shellcode • Ưu điểm – Không thể dissassembler nếu chưa giải mã. – Không dành cho amater cracker. • Nhược điểm – Rất khó bảo trì – Vẫn có thể crack được nếu đặt đúng breakpoint tại điểm decrypt – Xung đột với DEP (Data Execution Preventation) 7.6 Self-‐modifying code 128 • Các kỹ thuật trên nếu kết hợp lại có thể có kết quả rất tốt. • Trên Windows: – Sử dụng các chương trình all-‐in-‐one: “Packer” • ASPack • ASProtect • PECompact • PECrypt • Themida • – Code-‐sign ứng dụng bằng chữ ký số ‐us/library/ms537361%28v=vs.85%29.aspx • Trên các hệ điều hành khác – Đang tiến dần đến xu hướng code-‐sign: VD iOS, MacOS 7.7 Giải pháp tổng thể 129 • Các kỹ thuật trên nếu kết hợp lại có thể có kết quả rất tốt. • Trên Windows: – Sử dụng các chương trình all-‐in-‐one: “Packer” • ASPack • ASProtect • PECompact • PECrypt • Themida • – Code-‐sign ứng dụng bằng chữ ký số ‐us/library/ms537361%28v=vs.85%29.aspx • Trên các hệ điều hành khác – Đang tiến dần đến xu hướng code-‐sign: VD iOS, MacOS 7.7 Giải pháp tổng thể 130 1. Tìm hiểu và minh hoạ các kỹ thuật SQL Injection hiện nay (đặc biệt là blind sql injection).(Tuần 14 -‐ Thuý) 2. Tìm hiểu và minh hoạ kỹ thuật tấn công tràn bộ đệm buffer over}low và khai thác qua shellcode. Có thể dùng Metasploit để thử nghiệm.(Tuần 15-‐ Xuan Hiep) 3. Tìm hiểu cơ chế leo thang đặc quyền trên một thiết bị chạy hệ điều hành Android (rooting, tìm cái dễ root nhất).(Tuần 15 – Phi Hiệp) 4. Sử dụng một trong các kỹ thuật đồng bộ để thực hiện thuật toán quicksort trên bộ vi xử lý đa nhân. Yêu cầu tốc độ sắp xếp phải đạt được tuyến tính với số nhân của bộ vi xử lý.(Tuần 12 – Ngọc Anh) 5. Sử dụng thuật toán HMAC để phát hiện thay đổi trong mã lệnh của chương trình. Với key và giá trị băm được tải về từ internet trong mỗi lần kiểm tra.(Tuần 12 -‐ Linh) 6. Sử dụng chữ ký số để phát hiện thay đổi trong mã lệnh của chương trình. Với public key được tải về từ internet trong mỗi lần kiểm tra.(Tuần 13 – Quynh, Thành) 7. Tìm hiểu các kỹ thuật phát hiện debugger (anti-‐debugger) và các kỹ thuật chống phát hiện debugger (anti-‐anti-‐debugger).(Tuần 13 – Hoa, Tùng) 8. Xây dựng hệ thống cấp phát chứng thực số dựa trên openssl với CA sinh sẵn Chỉ yêu cầu viết bằng php/html để nhận tham số của chứng thực qua form, sau đó sinh ngay cặp chứng thực/key cho client và biểu diễn dưới dạng PEM (.crt, .key) (Tuần 14 – Dat) Các đề tài tìm hiểu 131
File đính kèm:
- bai_giang_lap_trinhantoan_chuong_7_anti_tampering_luong_anh.pdf