Câu hỏi khó về stack

#include<stdio.h>
#include<conio.h>
void test(int a, int b) {
	unsigned char buffer[20] = "hello world";
	unsigned long i = 5;
	unsigned long c = 6;
	(*(int *)(buffer + k) += y;
}
int main() {
	int x = 1;
	test(2, 3);
	x = 4;
	printf("%d", x);
	_getch();
}

hỏi cần chọn giá trị k và y bao nhiêu để in ra kết quả là 1 ( chương trình bỏ qua x = 4 )

:v Mình nghĩ là tìm k sao cho (buffer + k) trỏ tới địa chỉ thực thi câu lệnh x = 4 và tìm y sao cho khi cộng y vào sẽ thay đổi điều kiện thực thi hoặc hủy bỏ câu lệnh.
k và y không thể có định vì tùy thuộc vào compiler, hệ điều hành, kiến trúc tập lệnh, …

2 Likes

ý ở đây là k chính là độ dịch chuyển sao cho bộ nhớ vừa tràn đến chỗ lưu địa chỉ lệnh tiếp theo sau khi gọi xong hàm ấy

Hmmm, mình không nghĩ cái trên là tràn, vì đơn giản nó chỉ trỏ tới 1 địa chỉ nào đó chứ không bị ghi đè.
Như trên bạn có thể dùng ct (chắc chỉ đúng trên window)

buffer + (test - buffer) + (main - test) là trỏ đc tới hàm main.

:penguin: Nói chung mình suy luận vậy thôi chứ ko rành mấy cái này.

2 Likes

nói thật mình cũng mới học , bài tập môn kiến trúc máy tính mà khó nghĩ qua , lên đây tìm cao nhân

Thớt dùng gcc thì chắc asm đc.

1 Like

Rõ ràng là sửa return offset rồi, dùng gcc biên dịch rồi kiếm cái debugger để xem stack nó thế nào thôi.

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