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ố
14 trang |
Chia sẻ: huongthu9 | Lượt xem: 484 | Lượt tải: 0
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:
- giao_trinh_lap_trinh_an_toan_chuong_7_anti_tampering_luong_a.pdf