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ể

 

pdf 14 trang yennguyen 2840
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

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:

  • pdfbai_giang_lap_trinhantoan_chuong_7_anti_tampering_luong_anh.pdf