Câu hỏi thực sự là về sự tràn ngăn xếp trong C. Tôi có một sự đảm bảo rằng tôi không thể làm được cho cuộc đời của tôi, tôi đã xem xét mọi thứ trong gdb và tôi không thể đoán được .Stack Overflow Exploit trong C
Câu hỏi đặt ra là như sau:
int i,n;
void confused()
{
printf("who called me");
exit(0);
}
void shell_call(char *c)
{
printf(" ***Now calling \"%s\" shell command *** \n",c);
system(c);
exit(0);
}
void victim_func()
{
int a[4];
printf("[8]:%x\n", &a[8]);
printf("Enter n: "); scanf("%d",&n);
printf("Enter %d HEX Values \n",n);
for(i=0;i<n;i++) scanf("%x",&a[i]);
printf("Done reading junk numbers\n");
}
int main()
{
printf("ls=736c --- ps = 7370 --- cal = 6c6163\n");
printf("location of confused %x \n", confused);
printf("location of shell_call %x \n", shell_call);
victim_func();
printf("Done, thank you\n");
}
Ok, vì vậy tôi quản lý để có được những câu hỏi đầu tiên một cách chính xác, mà là để tùy tiện gọi một trong hai chức năng không rõ ràng gọi trong đường dẫn chính. Bằng cách này, điều này phải được thực hiện trong khi chạy chương trình mà không có bất kỳ sửa đổi nào. Tôi đã thực hiện điều này bằng cách chạy chương trình, thiết lập N
thành 7
, đưa tôi đến Con trỏ chức năng của khung victim_func
, tôi viết a[7]
với địa chỉ bộ nhớ bị nhầm lẫn hoặc shell_call
và hoạt động. (Tôi có một máy 64 bit, đó là lý do tại sao tôi phải lấy nó đến 7, vì con trỏ EBI là 2 ints rộng, thay vì 1)
Câu hỏi của tôi là như sau, làm cách nào để kiểm soát đối số nào được chuyển đến shell_code
funcion? I E. làm cách nào để viết một số string
đến char* c
. Toàn bộ điểm đang thực hiện các lệnh unix như ps v.v. bằng cách chỉ chạy chương trình.
Tôi đã tìm ra con trỏ EBI với biểu diễn hex của ps và đặt danh sách arg là shell_call
cho điều đó, nhưng điều đó không hiệu quả. Tôi cũng đã thử nhập các đối số argsv
và đặt danh sách arg là shell_call
thành số arg_list
chính, nhưng không hoạt động.
Tôi nghĩ rằng phiên bản thứ hai sẽ hoạt động, nhưng tôi tin rằng tôi không đặt danh sách arg của khung ngăn xếp mới một cách chính xác (tôi đã làm điều đó bằng cách viết a[8]
to 0
, vì phần đầu tiên của con trỏ hàm và viết a[9]=736c
và a[10]=0000
, nhưng có lẽ nó không đúng bởi vì đó là các thông số của victim_func
vì vậy, làm thế nào để truy cập vào các thông số của shell_call
lưu ý rằng đây là tràn _buffer_, không phải là tràn _stack_. –
@Greg Rogers thực sự có, đây là một ngăn xếp tràn. Trong thực tế, heap không được sử dụng trong ứng dụng này. – rook
@Rook: Bộ đệm nằm trên ngăn xếp. Nhưng tràn bộ đệm là lỗ hổng. Một tràn ngăn xếp không thể khai thác được - nếu không thì mọi trình phân tích cú pháp XML trên trái đất sẽ dễ bị tổn thương;) –