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 ạ
Các hàm bị lỗ hổng bảo mật
Buffer overflow nếu hàm ko kiểm soát số kí tự đi vào chuỗi.
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 main
là 0xdeadbeef
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
thanks anh nhé. ví dụ hay quá