Tôi đã cố gắng tìm hiểu các khái niệm cơ bản về tấn công tràn vùng heap. Tôi chủ yếu quan tâm đến việc sử dụng một tham nhũng hoặc sửa đổi siêu dữ liệu đoạn cho cơ sở của cuộc tấn công, nhưng tôi cũng mở cho các đề xuất khác. Tôi biết rằng mục tiêu của tôi về khai thác nên được ghi đè lên con trỏ hàm printf()
với con trỏ hàm challenge()
, nhưng tôi không thể tìm ra cách để đạt được điều đó. Tôi có đoạn mã sau đây mà tôi muốn khai thác, đó là sử dụng malloc
từ glibc 2.11.2
:Sử dụng tràn bộ nhớ để ghi dữ liệu tùy ý
void challenge()
{
puts("you win\n");
}
int main(int argc, char **argv)
{
char *inputA, *inputB, *inputC;
inputA = malloc(32);
inputB = malloc(32);
inputC = malloc(32);
strcpy(inputA, argv[1]);
strcpy(inputB, argv[2]);
strcpy(inputC, argv[3]);
free(inputC);
free(inputB);
free(inputA);
printf("execute challenge to win\n");
}
Rõ ràng, việc đạt được một ghi đè thực tế của siêu dữ liệu một đoạn phân bổ là tầm thường. Tuy nhiên, tôi đã không thể tìm ra cách để khai thác mã này bằng cách sử dụng bất kỳ kỹ thuật chuẩn nào. Tôi đã đọc và cố gắng thực hiện các kỹ thuật từ:
- Bài viết: w00w00 trên Heap Overflows
- Mặc dù giấy là rất rõ ràng, kỹ thuật
unlink
đã lỗi thời trong một thời gian.
- Mặc dù giấy là rất rõ ràng, kỹ thuật
- Malloc Maleficarum.txt
- Bài viết này được cải tiến từ khai thác kỹ thuật từ những ngày w00w00, và chiếm các phiên bản mới hơn của glibc. Tuy nhiên, tôi đã không thấy rằng với 5 kỹ thuật chi tiết trong bài báo, mã ở trên phù hợp với bất kỳ điều kiện tiên quyết nào cho những kỹ thuật đó.
- Understanding the Heap By Breaking it(pdf)
- Các pdf cho một bài đánh giá khá tốt về cách thức hoạt động của heap, nhưng tập trung vào các kỹ thuật miễn phí kép.
tôi ban đầu đã cố gắng để khai thác mã này bằng cách điều chỉnh giá trị kích thước của đoạn cho inputC, do đó nó chỉ trở lại vào đầu của đoạn inputC. Khi điều đó không hiệu quả, tôi đã cố gắng chỉ trở lại phần đầu vàoB. Đó là khi tôi nhận ra rằng glibc mới thực hiện kiểm tra độ chính xác về giá trị kích thước.
Làm cách nào người dùng có thể khai thác để tận dụng miễn phí, giả sử anh có khả năng chỉnh sửa siêu dữ liệu của phân đoạn được phân bổ thành giá trị tùy ý và người dùng ghi đè giá trị trong GOT hoặc ghi vào bất kỳ địa chỉ tùy ý nào khác ?
Lưu ý: Khi tôi viết 'địa chỉ tùy ý', tôi hiểu rằng các trang bộ nhớ có thể chỉ đọc hoặc được bảo vệ, ý tôi là địa chỉ mà tôi có thể giả sử tôi có thể ghi vào.
Bạn có thể làm rõ siêu dữ liệu nào bạn đang đề cập đến không? – ose
Nhận kết quả có thể dự đoán được (chỉ đơn giản là đâm ứng dụng) ra khỏi một cuộc tấn công tràn bộ nhớ heap là hầu như không thể. Về cơ bản bạn cần phải biết thứ tự của các thứ trong đống, và đó là chỉ có thể dự đoán được trong một vài trường hợp hạn chế. Tốt nhất bạn có thể sử dụng một số loại "peek" chương trình để tìm thấy rằng bạn đang tìm kiếm, nhưng sau đó nó sẽ cần phải có một chữ ký đáng tin cậy "" để tìm kiếm. Trong trường hợp của bạn, bạn có thể tìm kiếm văn bản "Thực hiện thử thách để giành chiến thắng", nhưng thậm chí việc tìm kiếm văn bản đó cũng không giúp được gì nhiều vì nó có khả năng lưu trữ được bảo vệ. –
@ tôi đã chỉnh sửa câu hỏi để làm cho nó rõ ràng hơn một chút. Tôi quan tâm đến việc sửa đổi siêu dữ liệu của đoạn được phân bổ (hoặc miễn phí, nếu có thể).Những thứ như kích thước, cờ A | M | P hoặc con trỏ tiến và lùi cho khi đoạn đó được hợp nhất. – amccormack