Bagikan melalui


Kesalahan: stack-buffer-overflow

Kesalahan Pembersih Alamat: Luapan buffer tumpukan

Luapan buffer tumpukan dapat terjadi banyak cara di C atau C++. Kami memberikan beberapa contoh untuk kategori kesalahan ini yang dapat Anda tangkap dengan kompilasi ulang sederhana.

Contoh - luapan buffer tumpukan

// example1.cpp
// stack-buffer-overflow error
#include <string.h>

int main(int argc, char **argv) {
    char x[10];
    memset(x, 0, 10);
    int res = x[argc * 10];  // Boom! Classic stack buffer overflow

    return res;
}

Untuk membuat dan menguji contoh ini, jalankan perintah ini di perintah Visual Studio 2019 versi 16.9 atau yang lebih baru:

cl example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe

Kesalahan yang dihasilkan

Cuplikan layar debugger menampilkan kesalahan stack-buffer-overflow dalam contoh 1.

Contoh - Matematika buffer tumpukan

// example2.cpp
// stack-buffer-overflow error
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int main(int argc, char **argv) {
    assert(argc >= 2);
    int idx = atoi(argv[1]);
    char AAA[10], BBB[10], CCC[10];
    memset(AAA, 0, sizeof(AAA));
    memset(BBB, 0, sizeof(BBB));
    memset(CCC, 0, sizeof(CCC));
    int res = 0;
    char *p = AAA + idx;
    printf("AAA: %p\ny: %p\nz: %p\np: %p\n", AAA, BBB, CCC, p);

    return *(short*)(p) + BBB[argc % 2] + CCC[argc % 2];  // Boom! ... when argument is 9
}

Untuk membuat dan menguji contoh ini, jalankan perintah ini di perintah Visual Studio 2019 versi 16.9 atau yang lebih baru:

cl example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe 9

Kesalahan yang dihasilkan - Matematika buffer tumpukan

Cuplikan layar debugger yang menampilkan kesalahan stack-buffer-overflow dalam contoh 2.

Contoh - cast down yang tidak tepat pada tumpukan

// example3.cpp
// stack-buffer-overflow error
class Parent {
public:
    int field;
};

class Child : public Parent {
public:
    volatile int extra_field;
};

int main(void) {

    Parent p;
    Child *c = (Child*)&p;
    c->extra_field = 42;  // Boom !

    return (c->extra_field == 42);
}

Untuk membuat dan menguji contoh ini, jalankan perintah ini di perintah Visual Studio 2019 versi 16.9 atau yang lebih baru:

cl example3.cpp /fsanitize=address /Zi
devenv /debugexe example3.exe

Kesalahan yang dihasilkan - pemeran yang tidak tepat pada tumpukan

Cuplikan layar debugger yang menampilkan kesalahan stack-buffer-overflow dalam contoh 3.

Lihat juga

Gambaran umum AddressSanitizer
Masalah yang diketahui AddressSanitizer
Referensi bahasa dan build AddressSanitizer
Referensi runtime AddressSanitizer
Byte bayangan AddressSanitizer
AddressSanitizer cloud atau pengujian terdistribusi
Integrasi debugger AddressSanitizer
Contoh kesalahan AddressSanitizer