What now?
Buffer
Overflow
dongianchithethoi@gmail.com – Ta Quy_13T1_DUT
Buffer overflow
Lỗi tràn bộ nhớ đệm là một điều kiện bất thường
khi một tiến trình lưu trữ dữ liệu vượt ra ngoài
của bộ nhớ đệm có chiều dài cố định. Kết quả là
dữ liệu có thể đè lên bộ nhớ liền kề.
Dữ liệu ghi đè bao gồm các bộ nhớ đệm khác,
các biến và dữ liệu điều khiển.
Thông thường có hai cách để khai thác lỗi buffer
overflow mà attacker thường dùng:
 Khai thác dựa vào lỗ hổng phần mềm thông qua
ngôn ngữ lập trình (phần mềm viết bằng ngôn ngữ C).
 Khai thác các trang web có tương tác người dùng
nhưng không ràng buộc dự liệu nhập như các trường
username, password….
Buffer overflow
Mỗi lỗi buffer overflow xuất hiện khi buffer cố gắng cấp phát 1
không gian lưu trữ lớn hơn khả năng lưu trữ của nó.
Example:
#include <stdio.h>
int main(){
char target[5]=“TTTT”;
char attacker[11]=“AAAAAAAAAAAA”;
strcpy(attacker,”DDDDDDDDDDDDDDDDDDDDD”);
printf(“%s ”,target);
return 0;
}
Buffer overflow
Kết quả của chương
trình ???
Nguyên nhân gây ra lỗi buffer overflow:
 Phương thức kiểm tra biên không được thực hiện đầy đủ hoặc
bỏ qua.
 Các ngôn ngữ lập trình bản thân nó đã có tiềm ẩn, như ngôn
ngữ C
 Các phương thức strcat(), strcpy(), sprint(), bcopy(), gets() và
canf() trong ngôn ngữ C bị khai thác vì các hàm này không
kiểm tra kích thước bộ nhớ đệm.
Buffer overflow
Có hai kiểu buffer overflow chính:
 Stack overflow
 Heap overflow
Buffer overflow
Tổ chức bộ nhơ:́
Buffer overflow
Environment
Arguments
Variables
Stack
Heap
BSS
Data
Code
High address
Low address
Stack là vùng nhớ dùng để
lưu các tham số và các biến
cục bộ của hàm.
Heap là vùng nhớ dùng để
cấp phát động, các vùng nhớ
được cấp phát bằng malloc.
Stack Overflow
Chức năng
gọi các đối số
Địa chỉ trả về
Bộ đệm 1
( biến cục bộ 1)
Bộ đệm 2
( biến cục bộ 2)
High address
BP tại
các nơi
bên
trong
khung
stack
Low address Các điểm SP
ở đây
Hướng tăng
của stack
Hướng đi
vào
• Stack sử dụng cơ chế Last
In First Out.
• Nó hoạt động như một bộ
đệm, giữ tất cả thông tin
mà hàm cần.
• Được tạo ra vào thời điểm
bắt đầu hàm và giải phóng
lúc kết thúc.
Example: int bof(){
char buffer[2];
strcpy(buffer,"AAAAAAAAAAAAAAAAAAAAAAAAAAA");
return 1;
}
int main(int argc, char **argv){
bof();
printf("Let's go :v n");
return 1;
}
Stack Overflow
Kết quả sẽ
như thế nào
nhỉ?
Phần dưới của
Stack
Dữ liệu trên đoạn
Stack
Phần cuối của Stack
Phần dưới của
Stack
Dữ liệu trên đoạn
Stack
Điạ chỉ trả về
Các dữ liệu khác
trên đoạn Stack
Phần dưới của
Stack
Dữ liệu trên đoạn
Stack
Địa chỉ trả về mới
Dữ liệu bị ghi đè
trên đoạn Stack
SP
SP SP
n Bytes
4 Bytes 4 Bytes
n Bytes +
dữ liệu mới
Một số dữ liệu
có thể bị ghi đè
Machine code
Ex.
Stack bình thường Stack khi bị kẻ tấn công
gọi một chức năng
Stack sau khi bị
một chức năng phá hoại
Stack Overflow
Heap overflow
Các biến được cấp phát tự động trong hàm, như là malloc()
được tạo ra trong heap.
Các attacker làm tràn bộ nhớ sẽ có thể overwrite các dynamic
variables.
Việc này có thể giúp các attacker điều khiển các thực thi của
chương trình.
AAAAAAAAAA BBBBBBBB CCCC
Trường điều
khiển
Dung lượng
bộ nhớ
Dung lượng
bộ nhớ
Dung lượng
bộ nhớTrường điều
khiển
Trường điều
khiển
A= malloc(10) C= malloc(4)Dung lượng Heap đơn giản
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main(int argc, char **argv[]){
char *input = (char *) malloc(15);
char *output =(char *) malloc(15);
strcpy(output,"normal output");
strcpy(input,"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB");
printf("input at %p: %sn", input, input);
printf("output at %p: %sn", output, output);
return 1;
}
Heap overflow
Example:
Result of
program?
XXXXXXXXXXXXXXX “normal output”
input= malloc(15) output= malloc(15)
Heap: before overflow
BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBB BBBBBB
input= malloc(15) output= malloc(15)
Heap: after overflow
Heap overflow
“/root/.rhosts”
“tmpflic.tmp”
Overwriting pointers (viết lại con trỏ): attacker có thể
sử dụng phương pháp này để viết lại filename,
password, uid…
Pointer
Buffer
Pointer
Buffer
Buffer Buffer
Before overflow
Before overflow
After overflow
After overflow
Overwriting a pointer in the heap
int badFunc(void)
int goodFunc(void)
Overwriting pointers (viết lại con trỏ): attacker có thể
sử dụng phương pháp này để viết lại filename,
password, uid…
int (*func)(void)
Buffer
int (*func) (void)
Buffer
Before overflow
After overflow
Overwriting a pointer in the heap
Shellcode
Shellcode là một mã nhỏ được sử dụng trong việc khai thác lỗ
hổng của một phần mềm.
Bộ đệm là mục tiêu ưa thích của attacker, vì chúng rất dễ tràn
nếu xảy ra điều kiện phù hợp.
Shellcode gây tràn bộ đệm, viết bằng hợp ngữ, khai thác lỗ
hổng trong stack và bộ nhớ quản lí heap.
 Example:
“x2dx07xd3xb4xc1x9bxd3xc4xe6x4axb7xc9x2a”
“x5dx3bx5axc7x3bxa5xd8x67xa3x49x8cx1bx3b”
“xc4xe6x4axb7xc9x2axc7x3bxa5xd8x67xd3xb4”
…………………………………………………………………………………………
Các bước tấn công tràn bộ nhớ:
1
2
3
4
Bước 1
Tìm sự hiện diện và lỗ
hổng của lỗi tràn bộ nhớ
Bước 2
Ghi nhiều dữ liệu vào bộ
đệm hoặc hơn mức mà
nó xử lý
Bước 4
Thay đổi luồng thực
hiện hàm bằng các
mã hacker.
Bước 3
Ghi đè lên địa chỉ
quay về của hàm.
Thank you
for your attention

Buffer overflow

  • 1.
  • 2.
    Buffer overflow Lỗi trànbộ nhớ đệm là một điều kiện bất thường khi một tiến trình lưu trữ dữ liệu vượt ra ngoài của bộ nhớ đệm có chiều dài cố định. Kết quả là dữ liệu có thể đè lên bộ nhớ liền kề. Dữ liệu ghi đè bao gồm các bộ nhớ đệm khác, các biến và dữ liệu điều khiển.
  • 3.
    Thông thường cóhai cách để khai thác lỗi buffer overflow mà attacker thường dùng:  Khai thác dựa vào lỗ hổng phần mềm thông qua ngôn ngữ lập trình (phần mềm viết bằng ngôn ngữ C).  Khai thác các trang web có tương tác người dùng nhưng không ràng buộc dự liệu nhập như các trường username, password…. Buffer overflow
  • 4.
    Mỗi lỗi bufferoverflow xuất hiện khi buffer cố gắng cấp phát 1 không gian lưu trữ lớn hơn khả năng lưu trữ của nó. Example: #include <stdio.h> int main(){ char target[5]=“TTTT”; char attacker[11]=“AAAAAAAAAAAA”; strcpy(attacker,”DDDDDDDDDDDDDDDDDDDDD”); printf(“%s ”,target); return 0; } Buffer overflow Kết quả của chương trình ???
  • 5.
    Nguyên nhân gâyra lỗi buffer overflow:  Phương thức kiểm tra biên không được thực hiện đầy đủ hoặc bỏ qua.  Các ngôn ngữ lập trình bản thân nó đã có tiềm ẩn, như ngôn ngữ C  Các phương thức strcat(), strcpy(), sprint(), bcopy(), gets() và canf() trong ngôn ngữ C bị khai thác vì các hàm này không kiểm tra kích thước bộ nhớ đệm. Buffer overflow
  • 6.
    Có hai kiểubuffer overflow chính:  Stack overflow  Heap overflow Buffer overflow
  • 7.
    Tổ chức bộnhơ:́ Buffer overflow Environment Arguments Variables Stack Heap BSS Data Code High address Low address Stack là vùng nhớ dùng để lưu các tham số và các biến cục bộ của hàm. Heap là vùng nhớ dùng để cấp phát động, các vùng nhớ được cấp phát bằng malloc.
  • 8.
    Stack Overflow Chức năng gọicác đối số Địa chỉ trả về Bộ đệm 1 ( biến cục bộ 1) Bộ đệm 2 ( biến cục bộ 2) High address BP tại các nơi bên trong khung stack Low address Các điểm SP ở đây Hướng tăng của stack Hướng đi vào • Stack sử dụng cơ chế Last In First Out. • Nó hoạt động như một bộ đệm, giữ tất cả thông tin mà hàm cần. • Được tạo ra vào thời điểm bắt đầu hàm và giải phóng lúc kết thúc.
  • 9.
    Example: int bof(){ charbuffer[2]; strcpy(buffer,"AAAAAAAAAAAAAAAAAAAAAAAAAAA"); return 1; } int main(int argc, char **argv){ bof(); printf("Let's go :v n"); return 1; } Stack Overflow Kết quả sẽ như thế nào nhỉ?
  • 10.
    Phần dưới của Stack Dữliệu trên đoạn Stack Phần cuối của Stack Phần dưới của Stack Dữ liệu trên đoạn Stack Điạ chỉ trả về Các dữ liệu khác trên đoạn Stack Phần dưới của Stack Dữ liệu trên đoạn Stack Địa chỉ trả về mới Dữ liệu bị ghi đè trên đoạn Stack SP SP SP n Bytes 4 Bytes 4 Bytes n Bytes + dữ liệu mới Một số dữ liệu có thể bị ghi đè Machine code Ex. Stack bình thường Stack khi bị kẻ tấn công gọi một chức năng Stack sau khi bị một chức năng phá hoại Stack Overflow
  • 11.
    Heap overflow Các biếnđược cấp phát tự động trong hàm, như là malloc() được tạo ra trong heap. Các attacker làm tràn bộ nhớ sẽ có thể overwrite các dynamic variables. Việc này có thể giúp các attacker điều khiển các thực thi của chương trình. AAAAAAAAAA BBBBBBBB CCCC Trường điều khiển Dung lượng bộ nhớ Dung lượng bộ nhớ Dung lượng bộ nhớTrường điều khiển Trường điều khiển A= malloc(10) C= malloc(4)Dung lượng Heap đơn giản
  • 12.
    #include <stdlib.h> #include <string.h> #include<stdio.h> int main(int argc, char **argv[]){ char *input = (char *) malloc(15); char *output =(char *) malloc(15); strcpy(output,"normal output"); strcpy(input,"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"); printf("input at %p: %sn", input, input); printf("output at %p: %sn", output, output); return 1; } Heap overflow Example: Result of program?
  • 13.
    XXXXXXXXXXXXXXX “normal output” input=malloc(15) output= malloc(15) Heap: before overflow BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBB BBBBBB input= malloc(15) output= malloc(15) Heap: after overflow Heap overflow
  • 14.
    “/root/.rhosts” “tmpflic.tmp” Overwriting pointers (viếtlại con trỏ): attacker có thể sử dụng phương pháp này để viết lại filename, password, uid… Pointer Buffer Pointer Buffer Buffer Buffer Before overflow Before overflow After overflow After overflow Overwriting a pointer in the heap
  • 15.
    int badFunc(void) int goodFunc(void) Overwritingpointers (viết lại con trỏ): attacker có thể sử dụng phương pháp này để viết lại filename, password, uid… int (*func)(void) Buffer int (*func) (void) Buffer Before overflow After overflow Overwriting a pointer in the heap
  • 16.
    Shellcode Shellcode là mộtmã nhỏ được sử dụng trong việc khai thác lỗ hổng của một phần mềm. Bộ đệm là mục tiêu ưa thích của attacker, vì chúng rất dễ tràn nếu xảy ra điều kiện phù hợp. Shellcode gây tràn bộ đệm, viết bằng hợp ngữ, khai thác lỗ hổng trong stack và bộ nhớ quản lí heap.  Example: “x2dx07xd3xb4xc1x9bxd3xc4xe6x4axb7xc9x2a” “x5dx3bx5axc7x3bxa5xd8x67xa3x49x8cx1bx3b” “xc4xe6x4axb7xc9x2axc7x3bxa5xd8x67xd3xb4” …………………………………………………………………………………………
  • 17.
    Các bước tấncông tràn bộ nhớ: 1 2 3 4 Bước 1 Tìm sự hiện diện và lỗ hổng của lỗi tràn bộ nhớ Bước 2 Ghi nhiều dữ liệu vào bộ đệm hoặc hơn mức mà nó xử lý Bước 4 Thay đổi luồng thực hiện hàm bằng các mã hacker. Bước 3 Ghi đè lên địa chỉ quay về của hàm.
  • 18.