01/10/2018, 09:12

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 )

*grab popcorn* viết 11:16 ngày 01/10/2018

: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, …

Hoàng Mạnh viết 11:12 ngày 01/10/2018

ý ở đâ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

*grab popcorn* viết 11:13 ngày 01/10/2018

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.

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

Hoàng Mạnh viết 11:28 ngày 01/10/2018

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

rogp10 viết 11:27 ngày 01/10/2018

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

明玉 viết 11:12 ngày 01/10/2018

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.

Bài liên quan
0