Giáo trình Lập trình An toàn - Chương 7: Anti-Tampering - Lương Ánh Hoàng

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ố

pdf14 trang | Chia sẻ: huongthu9 | Lượt xem: 484 | Lượt tải: 0download
Bạn đang xem nội dung tài liệu Giáo trình Lập trình An toàn - Chương 7: Anti-Tampering - Lương Ánh Hoàng, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
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  

Các file đính kèm theo tài liệu này:

  • pdfgiao_trinh_lap_trinh_an_toan_chuong_7_anti_tampering_luong_a.pdf