Các hàm bị lỗ hổng bảo mật

Hi các anh! e có gặp 1 đề bào và có yêu cầu “Không sử dụng các hàm bị lỗ hổng bảo mật như gets, …”. Em không rõ các hàm như thế nào là bị lỗ hổng bảo mật và các a có thể phân tích giúp e tại sao nó lại bị lỗ hổng bảo mật ko ạ

1 Like

Buffer overflow :slight_smile: nếu hàm ko kiểm soát số kí tự đi vào chuỗi.

5 Likes

vâng. cám ơn anh. a có thể cho e thêm 1 vài hàm nữa kiểu như vậy để tránh khi dùng không ạ

Hàm gets() có thể bị tấn công Buffer overflow attack.
Mình lấy 1 ví dụ thế này:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
	char overflowme[32];
	printf("overflow me : ");
	gets(overflowme);	// smash me!
	if(key == 0xcafebabe){
		printf("Login successful\n");
	}
	else{
		printf("Login failed..\n");
	}
}
int main(int argc, char* argv[]){
	func(0xdeadbeef);
	return 0;
}

Theo đoạn code trên thì gần như chương trình sẽ chạy vào nhánh else tức là Login failed. Vì key nhập vào ở hàm main0xdeadbeef
Tuy nhiên, hacker có thể bypass vào nhánh if bằng cách nhập 1 chuỗi byte lớn hơn độ lớn khai báo của buffer overflowme (tức là lớn hơn 32 bytes) để overwrite giá trị lưu trong biến key từ 0xdeadbeef thành 0xcafebabe.
Lưu ý rằng khi bạn gọi hàm func(0xdeadbeef) từ hàm main, biến key và array overflowme[32] đều được cấp phát ở vùng nhớ stack. Do đó, một hàm như gets có thể overwrite tới vùng nhớ ngoài phạm vi được cho phép ban đầu (32 bytes) là một hàm bị lỗ hổng bảo mật.

Ví dụ trên mình sửa lại từ bài bof trên trang http://pwnable.kr/play.php
Cụ thể video giải thích cái giải bài tập đó: https://www.youtube.com/watch?v=rwfKScdQybE&t=631s

3 Likes

thanks anh nhé. ví dụ hay quá

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?