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 • 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 • 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 • 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 • 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 • Ví
dụ:
dịch
mã
các
ký
tự
trong
xâu
đi
0x19 #include
126 • 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
127 • 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 • 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 • 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 1317.1
Phát
hiện
thay
đổi
mã
lệnh
7.2
Che
giấu
mã
7.3
Sử
dụng
con
trỏ
hàm
7.4
Giấu
xâu
7.4
Giấu
xâu
7.5
Phát
hiện
debugger
7.6
Self-‐modifying
code
7.7
Giải
pháp
tổng
thể
7.7
Giải
pháp
tổng
thể
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)