415

#coding

#bufferOverrunEp
loit

#CprogramLanguag
e

#vmc
Bạn có thể viết một đoạn code có khả năng bị tấn công và sau đó minh họa cách mà hacker lợi dụng lỗ hổng đó không?
Steve Baker, Blogger
LetsRunWithIt.c
om
(2013-nay)
===============
Để tránh vẽ đường cho bọn đần chạy, tôi sẽ chỉ đưa ra một ví dụ cũ kỹ lỗi thời mà thôi.
Nó minh họa một vài trường hợp lỗi có thể gặp phải - nhưng hi vọng là, chỉ có ít chương trình vẫn còn dính lỗi này mà thôi.
Trong ngôn ngữ C, có một hàm với tên gọi “gets” để đọc một dòng ký tự ASCII từ một luồng đầu vào nào đó:
1. char *gets( char *buffer) ;
Nếu bạn chạy đoạn mã này, nó sẽ đọc dữ liệu vào (tức là những thứ được gõ vào từ bàn phím) vào bộ đệm cho tới khi đọc được một ký tự “hoàn tất” (trans - thường là “enter”).
Vì thế có thể sẽ có một vài lập trình viên yếu kém viết thế này:
1. bool checkPassword ()
2. {
3. char buffer [ 100 ] ;
4. int hasPermission = 0 ;
5.
6. printf ( "Please enter your password: " ) ;
7. gets(buffer) ;
8.
9. if ( strcmp ( buffer, "wybbl3" ) == 0 )
10. hasPermission = true ;
11. else
12. printf ( "Incorrect Password!\n" ) ;
13.
14. return hasPermission ;
15. }
(Giờ đây thì, các lập trình viên “đích thực” ấy đang mơ hồ hồi tưởng lại và có cảm giác thốn không hề nhẹ!)
Và - hàm “checkPassword(
)” đặt “hasPermission”
thành 0 (không được phép) - rồi sau đó nó sẽ yêu cầu bạn nhập mật khẩu vào - và nếu mật khẩu đó là “wybbl3” thì nó sẽ chuyển “hasPermission”
thành ‘1’ (được cấp quyền) - còn không, nó sẽ hiện dòng chữ “Incorrect Password!” và trả về ‘0’ - tức là “false”.
Đối với những mật khẩu “thông thường”, hàm này sẽ hoạt động được. Bất cứ ai kiểm tra đoạn mã này có lẽ sẽ thử gõ một vài mật khẩu sai rồi sau đó là mật khẩu đúng, có thể sẽ gõ Enter mà không có ký tự nào - và có vẻ như mọi thứ đều hoạt động trơn tru, vì thế đoạn này sẽ được đưa vào code của sản phẩm.
NHƯNG nếu luồng đầu vào lại có trên 100 ký tự (thực sự thì là 99) - nó sẽ cần nhiều không gian hơn so với những gì có trong “buffer”.
Trong C thì, chẳng có cách nào để hàm này có thể biết không gian có trong một mảng là bao nhiêu, vì thế nếu có quá nhiều dữ liệu, thì, liệu chuyện gì sẽ xảy ra?
Chà, ở ví dụ trên, “buffer” là một biến địa phương, nên nó được lưu trữ trên stack... và biến “hasPermission”
cũng thế.
Vì thế NẾU một kẻ ma quái nào đó muốn hack máy tính của bạn, tất cả những gì mà họ phải làm là gõ trên 100 ký tự vào máy tính khi có màn hình nhắc mật khẩu xuất hiện!
Mảng buffer không có đủ không gian dành cho (tạm cho là) 101 ký tự - nên ký tự thứ 101 sẽ vô tình được ấn vào không gian bộ nhớ tiếp theo - đó là byte đầu tiên dành cho biến “hasPermission”
!
Giờ đây, hàm so sánh xâu không chạy được vì gã kia không biết mật khẩu - nhưng lại chẳng hề quan trọng chút nào bởi biến “hasPermission”
giờ đây chứa một ký tự khác không từ byte thứ 101 mà gã kia gõ vào.
Có nghĩa là hàm “checkPassword”
trả về giá trị “true” ngay cả khi hắn không biết được mật khẩu!
CHÚC MỪNG! BẠN ĐÃ BỊ HACK!
Cách này được gọi là “khai thác tràn bộ đệm” và nó vẫn là một cách phổ biến để đột nhập vào các đoạn mã.
Nếu họ có thể truy cập vào mã nguồn chương trình của bạn - họ sẽ nhìn vào những tình huống như thế này và khai thác các lỗ hổng một cách dễ dàng - nhưng ngay cả khi họ không có mã nguồn, họ sẽ vẫn chạy chương trình đưa những thứ rác rưởi linh tinh cho tới khi nó hoạt động sai lầm theo cách nào đó... Sau đó họ sẽ tìm xem code bị hổng chỗ nào và thử lại với một vài input có tính toán để xem xem dạng dữ liệu nào sẽ bẻ gãy được nó và bằng cách nào.
Hướng dẫn sử dụng thư viện C chuẩn giờ đã gắn cờ hàm “gets” là “deprecated” (lỗi thời) vì lý do này.

https://
linux.die.net/
man/3/gets
Nó nói rằng “Không bao giờ sử dụng hàm gets()”. …Và thực sự là chuẩn 100% luôn!
Cách khai thác lỗi tràn bộ đệm có thể tinh vi hơn nhiều, và thường họ có thể viết mã máy đưa vào trong stack và thực thi nó, việc này cho phép thực hiện những khai thác còn tinh quái hơn NHIỀU.

https://
www.quora.com/
Can-you-write-a-
piece-of-code-t
hat-is-suscepti
ble-to-be-hacke
d-and-then-demo
nstrate-how-a-h
acker-would-hac
k-it/answer/
Steve-Baker-100


An Đức
javhdfullkhongche2160pixel

1 lỗi cơ bản mà mình đã từng gặp là số âm, hàm trong ảnh có nhiệm vụ chuyển tiền qua cho người khác. Nhập số dương thì sẽ chuyển tiền , nhập số âm sẽ tăng tiền cho mình và trừ tiền người kia :v tương tự 4 - (-3) = 7

Đạt Trần
freenhok

Học assembly cô cũng bày cho cái này :)) xong làm bt kiểu lợi dụng cái hàm gets() này để truyền mấy cái hàm theo ý muốn vào ctrình

Nguyễn Hiếu
gaquyt0c231

Phải nói là đọc những writeup về cách ngta suy nghĩ rồi suy ra các bước để khai thác rất đã 😀 nhưng nó cũng yêu cầu 1 lượng kiến thức nhất định.Mình xin góp ý thêm vài key word là capture the flag (CTF), wargame, bug bounty để những bạn qan tâm thử tìm hiểu 😀

Nguyễn Trung
scila1996

Viet Khoa:v

Trương Hoàng Hiệp
hiep.truonghoang

Buffer overflow

Huỳnh Quang Huy
quanghuy.huynh.583

Nam Phạm

Lê Anh Tuấn
mt.blackwingsz

Sql injection tới giờ vẫn nhiều site dính kìa :v lỗi cơ bản luôn ấy

Nguyễn Tuấn
tuannguyenb5

Overflow :))

Có vẻ bài này ko dành cho người ngoài ngành :D

V nếu biến hasPermission đc khai báo đầu tiên thì s nhỉ?

Lê Công Tuyền
tuyenle0705

lí do hàm gets_s ra đời

Phạm Trung Đức
baynam1995

Bài viết hay