Chương  7.  Anti-­‐Tampering     Lương  Ánh  Hoàng   hoangla@soict.hut.edu.vn

Nội  dung

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ể

119

7.1  Phát  hiện  thay  đổi  mã  lệnh

•  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

•  Ví  dụ:

//  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);

trước  đó.

120

7.1  Phát  hiện  thay  đổi  mã  lệnh

•  Ví  dụ:

pFile  =  (unsigned  char*)malloc(len);   fseek(fp,0,SEEK_SET);   fread(pFile,1,len,fp);   md5hash  =  0;   for  (int  i=0;i

//  Dò  tìm  giá  trị  băm  trong  }ile

//  Lưu  ra  mảng  khác    //  Xóa  trắng  giá  trị  này  trong  }ile

if  ((pFile[i]=='A')&&(pFile[i+1]=='A')&&  (pFile[i+2]=='A')&&(pFile[i+3]=='A'))    {    memcpy(expectedhash,pFile+i+4,16);  memset(pFile+i+4,0,16);  }

MD5(pFile,len,hash);

//  Tính  lại  giá  trị  băm

printf("File  veri}ication  failed");

printf("File  hash:");    print_md5(hash);  printf("Expected  hash:");    print_md5(expectedhash);    if  (memcmp(hash,expectedhash,16))    {      }    getch();    return  0;

}

121

7.1  Phát  hiện  thay  đổi  mã  lệnh

•  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

122

7.2  Che  giấu  mã

•  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.

•  Kỹ  thuật

•  Cấu  trúc  điều  kiện   •  Cấu  trúc  lặp

–  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.   •  …

123

7.3  Sử  dụng  con  trỏ  hàm

•  Mục  tiêu

•  Kỹ  thuật

–  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

–  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.

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;

}

–  VD

124

7.4  Giấu  xâu

•  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   •  …

125

7.4  Giấu  xâu

•  Ví  dụ:  dịch  mã  các  ký  tự  trong  xâu  đi  0x19

#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;   }

126

7.5  Phát  hiện  debugger

•  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)

printf("Program  is  being  debugged");

if(IsDebuggerPresent())    {      }    return  0;

}

–  Kernel32!IsDebuggerPresent   –  PEB!IsDebugged   –  PEB!NtGlobalFlags   –  Self-­‐debugging   –  ….   •  Ví  dụ     #include     int  _tmain(int  argc,  _TCHAR*  argv[])     {

127

7.6  Self-­‐modifying  code

•  Mục  đích:

•  Kỹ  thuật

–  Mã  hóa  lệnh  quan  trọng,  chỉ  giải  mã  khi  cần  thực  hiện

•  Ưu  điểm

–  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

•  Nhược  điểm

–  Không  thể  dissassembler  nếu  chưa  giải  mã.   –  Không  dành  cho  amater  cracker.

–  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)

128

7.7  Giải  pháp  tổng  thể

•  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ố

•  Trên  các  hệ  điều  hành  khác

http://msdn.microsoft.com/en-­‐us/library/ms537361%28v=vs.85%29.aspx

–  Đang  tiến  dần  đến  xu  hướng  code-­‐sign:  VD  iOS,  MacOS…

129

7.7  Giải  pháp  tổng  thể

•  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ố

•  Trên  các  hệ  điều  hành  khác

http://msdn.microsoft.com/en-­‐us/library/ms537361%28v=vs.85%29.aspx

–  Đang  tiến  dần  đến  xu  hướng  code-­‐sign:  VD  iOS,  MacOS…

130

131

Các  đề  tài  tìm  hiểu   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)