SỰ
TRÀN
BỘ
NHỚ
ĐỆM
TIN
TỨC
BẢO
MẬT
THÔNG
TIN
TRONG
TUẦN
Lỗi
ngày
trở
về
0
vượt
qua
sự
kiểm
soát
của
Người
sử
dụng
Windows.
!"
#$
%
&'
()(
#$
*
!+
!,!
&-
*.
'
&/
(+
0("112
&3
'
!4
(56
7/
8
9)
"
(1
:;
!5
(<=
!"#$%&'%()'*+)(,
+-(%./ #(!,)0'1(2
(2)34
567 )(896&:'/);)<(%$=
%(%>?$@ABCD4)E$F226)G
!>?$@'HA6I)E&(,++1-JK
+L,)2MN,$@0LN(G;'H
O;P0QL,)&R2)226)$
,HJK0!>2R@NPSTUVQ, F4
5677V66W6BOX&(%./
+1?Y(G+$,HSTUV:1(O
0&'+,))8Z HO/2
Z0WB[4
>?>
>@
AB
CD
0DEF
Sự
tràn
bộ
nhớ
đệm
(BoF).
Tràn
bộ
nhớ
đệm
trên
stack
(ngăn
xếp)
Tràn
bộ
nhớ
đệm
trên
heap
Điều
khiển
stack
Các
bước
tràn
bộ
nhớ
đệm
Cách
thức
tấn
công
một
chương
trình
thực
Sự
phá
vỡ
stack
Ví
dụ
của
tràn
bộ
nhớ
đệm
Làm
cách
nào
khai
thác
sự
biến
đổi
của
việc
tràn
bộ
nhớ
đệm
Xác
định
tràn
bộ
nhớ
đệm
Điều
kiện
kiểm
tra
tràn
bộ
nhớ
đệm
trên
heap:
heap.exe
Các
bước
kiểm
tra
việc
tràn
bộ
nhớ
đệm
trên
stack
trong
chương
trình
sửa
lỗi
OllyDbg
Công
cụ
phát
hiện
tràn
bộ
nhớ
đệm
Phòng
chống
tràn
bộ
nhớ
đệm
Công
cụ
đối
phó
với
việc
tràn
bộ
nhớ
đệm
Bút
kiểm
tra
tràn
bộ
nhớ
đệm
GHIE
AJ
0DEF
Khái
niệm
tràn
bộ
nhớ
đệm
Phương
pháp
luận
tràn
bộ
nhớ
đệm
Công
cụ
bảo
mật
tràn
bộ
nhớ
Bút
kiểm
tra
tràn
bộ
nhớ
đệm
Ví
dụ
tràn
bộ
nhớ
đệm
Biện
pháp
đối
phó
tràn
bộ
đệm
Phát
hiện
tràn
bộ
nhớ
đệm
Lỗi
tràn
bộ
đệm
tổng
quát
xảy
ra
khi
một
bộ
nhớ
đệm
đã
được
phân
chia
cho
một
không
gian
lưu
trữ
cụ
thể
có
chứa
nhiều
dữ
liệu
được
sao
chép
vào
lớn
hơn
mức
mà
nó
có
thể
xử
lý.
Khi
chương
trình
được
biên
dịch
và
chạy,
nó
sẽ
chỉ
định
một
phần
của
bộ
nhớ
có
độ
dài
11
bytes
để
chứa
chuỗi
tấn
công.
Hàm
Strcpy
sẽ
sao
chép
chuỗi
“DDDDDDDDDDDDDD”
vào
chuỗi
tấn
công,
lúc
này
bộ
đệm
sẽ
vượt
quá
kích
thước
11
bytes,
dẫn
tới
tràn
bộ
đệm.
Đây
là
loại
dễ
bị
tổn
thương
trong
hệ
thống
dựa
trên
UNIX
và
NT.
Tại
Sao
Các
Chương
Trình
Và
Ứng
Dụng
Dễ
Bị
Tổn
Thương
?
Phương
thức
kiểm
tra
biên
không
được
thực
hiện
đầy
đủ
hoặc,
trong
nhiều
trường
hợp,
chúng
bị
bỏ
qua
hoàn
toàn.
Ngôn
ngữ
lập
trình,
chẳng
hạn
như
C,
có
các
lỗ
hổng
bảo
mật
trong
chính
chúng.
Chương
trình
và
các
ứng
dụng
không
tuân
thủ
đúng
các
hoạt
động
mà
chúng
được
lập
trình.
Các
chức
năng
trong
ngôn
ngữ
lập
trình
C
như
strcat(),
strcpy(),
sprintf(),
vsprintf(),
bcopy(),
gets()
và
scanf()
có
thể
bị
khai
thác
như
việc
chúng
không
kiểm
tra
kích
thước
của
bộ
đệm.
Tìm
Hiểu
Về
Stack
Stack
sử
dụng
cơ
chế
Last-In-
First-Out
(vào
sau
ra
trước)
để
truyền
hàm
tham
số
và
tham
chiếu
với
các
biến
cục
bộ.
Nó
hoạt
động
như
một
bộ
đệm,
giữ
tất
cả
các
thông
tin
mà
hàm
cần.
Được
tạo
ra
vào
thời
điểm
bắt
đầu
của
hàm
và
giải
phóng
lúc
kết
thúc
hàm.
Phần
dưới
của
bộ
nhớ
BP
tại
các
nơi
bên
trong
khung
stack
Phần
trên
của
bộ
\%](D
P#Y%DQ
\%](^
P#Y%^Q
]1(,)<
'
V7_`
200
Các
điểm
SP
ở
đây
Hướng
đi
vào
Hướng
tăng
của
stack
nhớ
K
9%
(+
!(: K
9%
(+
!(:
UF$O
4
K
9%
(+
!(:
UF$O
4
%0F$
+1a
AL
(M
7
N/ AL
(M
7
N/
%
>-(
9O
*'
:-(
!"
&1
!(:
O
*'
O
*'
#L
&P
!"
&1
!(:
%
K
(4
(+
!(: K
(4
(+
!(:
$!
(Q(
R
!(:
:
#L
$!
(Q(
R
6-
1=
Tìm
Hiểu
Về
Heap
Heap
là
một
khu
vực
của
bộ
nhớ
được
sử
dụng
bởi
một
ứng
dụng
và
được
cấp
phát
động
tại
thời
gian
chạy
của
các
hàm,
chẳng
hạn
như
malloc().
Các
biến
tĩnh
được
lưu
trữ
trên
stack
cùng
với
dữ
liệu
được
giao,
sử
dụng
giao
diện
malloc.
Heap
lưu
trữ
tất
cả
các
trường
hoặc
thuộc
tính,
hàm
tạo
và
phương
thức
của
4
UF
$
O
0$!
!(:
#S
!T
!(:
:
#L
:;
!5
(<
U
một
lớp
hoặc
một
đối
tượng.
*V
#$
%
"T
&/
*V
#$
%
*V
#$
%
"T
&/
:3
:3
*V
W6
&X
"T
&/
:3
"
G$
%
A'
"
W6
Nếu
một
ứng
dụng
sao
chép
dữ
liệu
mà
không
kiểm
tra
dù
nó
phù
hợp
với
nơi
được
sao
chép
tới,
thì
kẻ
tấn
công
có
thể
cung
cấp
một
lượng
lớn
dữ
liệu
cho
ứng
dụng
đó,
thực
hiện
ghi
đè
lên
thông
tin
quản
lý
của
heap.
Kẻ
tấn
công
làm
một
bộ
nhớ
đệm
bị
tràn
trên
phần
dưới
của
heap,
ghi
đè
lên
các
biến
động
khác
gây
nên
các
biến
đổi
bất
ngờ
và
không
mong
muốn.
Y
!"1
K
Z!
(-(
<
!"T[
&/
\
(1
6]6
:;
!5
(<
:3
1-!
&V(
N'(
!(
!
(+
(X
!"S=
Hoạt
Aộng
>ủa
Stack
"Hủybỏ"một
mụctrên
cùngcủangăn
xếp
b
,`%
_>#4
b
]L(%(Y
$c
_>#4
<%M$
PSdbQ
SdbM#O(G(O
N4e O
`
(%(&fg!$
F
_
>#
1
?
Y4
hO%b'b
i)<'%!c<M
')M4
<%MX
PSXbQ
V2O
SXbM#'jO_
>#'-'7!(
'
'
$O
M
k
_
>#
R
2
?
Y
O
%
'
L2N"#M
_>#4
<%M
PS\bQ
V2(2)S\b(%1(
l17 "
_>#02#'
F$(%(?Y
204
W**(19W
*
$!
^
_
&V(
8
9)
!"1
N'(
:
!-(
*`
a
(+
$!
6K
/=
G$
&'
*
)(
b
!c(
(+
(-(
:;
!5
(<
NS
(d
"5!
9
!"
Z
e
"
&/
:'
6f
V6=
W**(19W
!"
#$
&'[
NZ!
#g
V6
O[
:
!-(
(-(
*`
a
!"1
R
eZ6
N
#$
%
7
*c
W6=
h<
8
i
jDk
hZ#2VbT+(%
$m6"Pe
O%Qn+ $(
ofp)$
M4
5 J&O+1
L(%0f
HoO
P=Q4
hZ#2>;(8
02PdUXQR
2q(#(F@!
mb4
e./ 2(#(
R((YjrZ$=
%(R2$
OmbP(%mb
)1%L!Q'
#VbTg $(o
H+8!:N
j[PH:M
,)'Q4
sU6P<eDQ/8
(%$=%(R(
2$Z''
tO(%
+7_
PoQ4
GHIE
AJ
0DEF
h-
'
!"
#$
%
&'
b
2$8
%H
(
><
()
#1
,!
!"
#$
%
&'
Gd!
:3
!"
!"
#$
%
&'
c
9)
!"
#$
%
&'
G'
6-6
&4
6
!"
#$
&'
-!
'
!"
#$
%
&'
Kiến
Thức
Cần
Thiết
Để
Khai
Thác
Lỗi
Tràn
Bộ
Đệm
Trong
Chương
Trình
3
#Z!
N/
1!
&$
(+
#$
%
!(:
N
W6
3
#Z!
N/
(-(
'
!4
U
(<
N'(
l
(56
&$
^
-
mW
N%
(-(
(<
()
#
9L(
N
8
*`
9#
hZ
!Q(
N/
*n6
"-6
N
<
O
-
hZ
!Q(
<
O
*,6
!"S
>
N
W"*
Các
Bước
Tràn
Bộ
Đệm
Bước1
Tìmsựhiệndiệnvàvịtrí
củalỗhổngtrànbộđệm
Bước3
ua$c,)'
(4
Bước2
uF$'%
((7(++
1>?$@4
Bước4
5)$vN
(R2(G64
Tấn
Công
Một
Chương
Trình
Thực
8
"g
$!
(`
#L
:
!-([
:;
!5
(<
(
!3
8
$!
(`
9
&K
N1=
>1
!"_
!"
N/
(+
bZ
&P[
N
:;
!5
(<
!
(<
!"1
N'(
!
&a
*o
!(
'
*'=
Z
T
8
9)
(P
N1
^
&K
N1[
!
1p(
(<
!
(
!3
#Z!
(c
e-(
&L
(M
N
:c(
!%(
(+
R
eZ6
N
*
(1
!"_
!"l
N/
%
!%
&1
^
(+
S
&3
!(
'
(M
!L=
Chuỗi
Định
Dạng
Có
Vấn
Đề
>
N5
&/
Z
T
9f
qrssssssssssst
"1
>[
e]!
Nc
9)
(+
(`
&L
9
(
N5
&/=
H!
u(j("
vW"k
Y
w6"x
j
!91![
W"ky
z
>X
!"S
(
!3
)6
&a
"
$!
1=
Z
:<[
(X
!"S
\
$
9
#$
%
`
!1
9'
e
"
#g
(-(
8
9)
T
9f
qrst
S
!Q(
&d
H!
u(
j("
vW"k
Y
w6"x
j
!91![
rst[
W"k
y
z
Gây
Tràn
Bộ
Đệm
Bằng
Cách
Sử
Dụng
Chuỗi
Định
Dạng
"1
>[
e]!
Nc
9)
(+
G1w
8
9)
(`
&L
9
(
N5
&/=
!Z
1
Z
T
9f
q
rs{||9
}16~
}W**(19W~t
Sẽ
bỏ
qua
giới
hạn
“%400s”
Sẽ
tràn
biến
outbuf.
Phá
Vỡ
Stack
Ý
tưởng
chung
là
gây
ra
tràn
bộ
đệm
để
sau
đó
ghi
đè
lên
địa
chỉ
trả
về.
"
#$
%
&'
(1
6]6
(d
!
!
&a
&L
(M
!"
N/
(+
$!
=
h
&V(
!(
'
e1
\
!%
#5!
:•
&L
(M
1
!"
R
eZ6=
Ap!
$!
4
^
!"1
#$
&'
N
!Z!
*,6
&L
(M
!"l
N/=
Một
Khi
Stack
Bị
Phá
Vỡ
]!-)8
0$!
:
7
!"S
9
!a
!X
#L
(Z[
:;
!5
(<
(
(-(
&p(
7/
!X
!
7
!"S
N
(
!3
&/
:3
!"
(,6
#S
!T=
&
!
1p(
(<
!
(
!3
:
!-(
$!
*`
!"
#$
&'
()(
#$
&3
&!
&V(
7/
!"
(,6
(+
T
9f=
Tạo
một
cửa
sau
X?YPTdwY1Q6
X?Yx5bj,`P5x5bQv(
WBD***'(%0TdwLK4
X?Y6
8
9)
W!(!
&3
*
!<
N
:Z!
4
!X
!-(=
uTdwY14
VY$O(%#0Z0w4
GHIE
AJ
0DEF
h-
'
!"
#$
%
&'
X
6-6
*,
!"
#$
%
&'
><
()
#1
,!
!"
#$
%
&'
#d!
:3
!"
\f1(
#
%
%H
'
(
c
9)
!"
#$
%
&'
!"
$
&
G'
6-6
&4
6
!"
#$
&'
-!
'
!"
#$
%
&'
Lỗi
Tràn
Bộ
Đệm
Không
Thể
Kiểm
Soát
Đơn
Giản
c
9)
(+
N'(
!"
R
eZ6
:<
!3
:3
1-!= c
9)
(+
N'(
!"
W6
:<
!3
:3
1-!
€vA
*
$!
(X
!"S
(1
!5
$!
*`
!"
:<
!3
:3
1-!
&X
!"
R
eZ6v€
yz/'6zy
yz-D*)6s'%(zy
CW!"
y
yz,)<$O&)g;)(%)
82-'2_>#({zy
yz`27_fzy
yz(%"rr&'Ng 1
"#!'oJ1()%(zy
yzJM27_jzy
Tràn
Bộ
Đệm
Đơn
Giản
Trong
C
>X
!"S
>
9
#L
!a
!X
1NW""=>
Điềuđầutiêncủabấtkìchươngtrìnhnàolà
khaibáohaichuỗibiếnvàcấpphátbộnhớ
chochúng.
:5[#g$/)^*)6%HP(g
-+F(%=^*@NQ4
:V2$)1(H0[+#
^D|)64
\O1RV&0%H
2#g!LN"#O
%H
o4
Gb;5j
:G8![&7`(%=kZ'"p#'j,)%H&
+L1(}8:[4
])+~$+g`2@N(+/)Z#1#f•&)
+'!,'j0K!;%H4
##!)&(%./ +1;)%H:[HH%
H:2$)1([&'O)/€$(/)) /)(04
Để
biên
dịch
chương
trình
overrun.c,
chạy
lệnh
này
trong
Linux.
Tràn
đầu
ra
bộ
đệm
AL
(M
(1
#Z
r*'
'
!4
3t
*
•
#!W
#n!
&K
!.
#Z
r!t=
•
#!W
!
*
(
6c
&V(
8
9)
#l
'
!4
r1(t
&3
(1
6]6
#$
%
!"l
*
&3
8
9)
(
:
&V(
6
Khai
Thác
Ngữ
Nghĩa
Của
Các
Giải
Thích
Trong
C
(Chú
Thích)
>d
!c(
(
!3
&V(
&L
r‚t
r€vt
Thêm“@”sau“/*”(đượcxemlàchú
thíchtrongC)đượccôngnhậnnhưcú
phápcácthựcthểbởicôngcụLCLint.
'8)&(%(02&
+2 ,(0)
+1 04
VD:/*@thisvalueneednotbenull@*/
ƒ
#l
(-(
'
&/
8
9)
>!=
V2('%(+
1! ,(4
V2O2%(O
#2(,)<
''O#?Y2
'jY•(X6&(>X6&
(‚6'(>‚64
Làm
Thế
Nào
Để
Khai
Thác
Lỗi
Tràn
Bộ
Đệm
Đối
với
phần
NOP
Đối
với
“Các
sự
kiện
chính”
Đối
với
“Con
trỏ
quay
về”
„
!
!Z
(-(
D
N%
(-(
6
&1
(Q(
R
!X
&X
(+
^
jW==
e……y
e†y
‡D
Dk
?6
9)
DC
&3
:Z!
V6
^
N%
$!
:
:
3
„
(1
H =
>-(
^
>E
(ˆ
6
^
(-(
^
:<
3
&V(
!"1
!T
(
(X
!"S
^=Gl
!Z[
#$
^
!"l
!
&
S
N
"5!
:
&3
6-!
'=
„
(M
8
G
(+
(1
!"_
%
!%
:
N(
(+
D=
GHIE
AJ
0DEF
h-
'
!"
#$
%
&'
6X
6-6
*,
!"
#$
%
&'
(<
()
#1
,!
!"
#$
%
&'
#d!
:3
!"
!"
#$
%
&'
Nc
9)
!"
#$
%
&'
#'
6-6
&4
6
!"
#$
&'
6-!
'
!"
#$
%
&'
w2]5\%H](
\H^
\H
D
\H
C
Chạymáychủweb
trênmáycụcbộ
Phátyêucầuvớimọi
thẻdài,thẻkếtthúc
với“$$$$$”
Nếumáychủwebbị
treo,tìmkiếmnơitập
kếtlõicủa“$$$$$”để
tìmkiếmvịtrítràn.
\Hƒ \H„
\H
…
SửdụngIDA-Protođể
xâydựnglạinơibị
khaithác
Sửdụngbộphậnphân
táchvàtrìnhgỡrối
Sửdụngcáccôngcụ
tựđộngnhư
codeBlocker,eEye Retina,…
Z
1
A3
-!
'
`
"
G$
A'
"1
0$!
>X
"S
‡
GZ
()(
#$
"1
!"T
V6
[
:;
!5
(<
(
!3
*
(1
(-(
(`
:
#-1
!"<
4
(-(
#Z
()(
#$
!"1
(-(
1p(
(-(
6X
!Q([
N
e-(
,
(
p!
(+
(-(
"
%
:3
!"=
*
&/
:'
(K
!Z!
&3
:3
!"
N'(
8
9)
(
6f
V6
N%
(-(
b
(‰[
&p(
#'!
*
(-(
N'(
*
7
!%
(`
N
&K
N1
1p(
&K
"=
>-(
b
(‰
%22$/27Y'H0$!$HF$'1(
2
'/J4
BOU
(Tiện
Ích
Tràn
Bộ
Đệm)
>-(
(<
()
GDE
(
!3
&V(
8
9)
#l
$!
:;
!5
(<
g
:3
!"
(-(
Q
9)
ŠW#
&3
!1
&/
:'
(1
*`
!"
#$
&'=
c
9)
(+
!,6
b
‹"W7W!Œ
><
()
(K
&K
N1
Các
tập
tin
“yêu
cầu”,
dùng
để
kiểm
tra
Cách
thức
để
nhiều
mã
cùng
tấn
công
(quy
định
trong
một
tập
tin
gọi
là
“lệnh”).
*5
$!
!,6
b
(K
&3
:3
!"
N
e5!
"
!5!
(
(-(
1!
&$
!%
DE
9
!"
Q(
&$
(+
7
&L
•
9
9Ž=
c
9)
(+
!,6
b
‹(19Œ
h3
"
A/
h'
"
W6
>-(
#Z
!3
(+
!"
W6
j!
ˆ
W6k
=
>1
6]6
&P
*
(1
!"_
•=h
!-(
(5
!"d(
7
*i
#$
%
&3
!(
!
^
!f
i
h3
!"
!"
W6
#g
(-(
(
(56
(-(
(`
&K
N1
9
X
9
:Z=
=
0$!
!"1
&a
(1
!"_
9
"
:
!"S
7
*c
!T
e
W6
&
N1
1!
&$=
!
F•
N
F>[
(
!3
&V(
&p!
(f
N%
&L
(M
T
8
9)
(
(56=
=
0$!
!"1
(-(
&L
(M
(
!3
%
!%
$!
(1
!"_
&3
bZ
&P[
Nc
9)
EFw
j#$
*U(
1
*'
(
e8
*ik=
=
•=
>-(
&L
(M
:-(
(
!3
*
&L
(M
(+
^
T
9f
(
(56
(K
6
&V(
!(
'=
h
*'
0D
3
!L
!"1
:
#
!"-
(+
()6
S
&V(
!(
'[
N'(
&P
&V(
9
"=
h
(-(
&V(
U[
^
T
9f
(
(56
&V(
!(
!=
8
'
A/
h'
"
W6
>-(
G%(
8
'
"
R
Z6
"1
D**#
W#W"=
8
'
"
R
Z6
"1
D**#