Skip to content

Latest commit

 

History

History
122 lines (92 loc) · 3.64 KB

error-stack-buffer-overflow.md

File metadata and controls

122 lines (92 loc) · 3.64 KB
title description ms.date f1_keywords helpviewer_keywords
Error: stack-buffer-overflow
Source examples and live debug screenshots for Stack buffer overflow errors.
09/29/2021
stack-buffer-overflow
stack-buffer-overflow error
AddressSanitizer error stack-buffer-overflow

Error: stack-buffer-overflow

Address Sanitizer Error: Stack buffer overflow

A stack buffer overflow can happen many ways in C or C++. We provide several examples for this category of error that you can catch by a simple recompile.

Example - stack buffer overflow

// 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;
}

To build and test this example, run these commands in a Visual Studio 2019 version 16.9 or later developer command prompt:

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

Resulting error

:::image type="content" source="media/stack-buffer-overflow-example-1.png" alt-text="Screenshot of debugger displaying stack-buffer-overflow error in example 1.":::

Example - Stack buffer math

// 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
}

To build and test this example, run these commands in a Visual Studio 2019 version 16.9 or later developer command prompt:

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

Resulting error - Stack buffer math

:::image type="content" source="media/stack-buffer-overflow-example-2.png" alt-text="Screenshot of debugger displaying stack-buffer-overflow error in example 2.":::

Example - improper down cast on stack

// 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);
}

To build and test this example, run these commands in a Visual Studio 2019 version 16.9 or later developer command prompt:

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

Resulting error - improper down cast on stack

:::image type="content" source="media/stack-buffer-overflow-example-3.png" alt-text="Screenshot of debugger displaying stack-buffer-overflow error in example 3.":::

See also

AddressSanitizer overview
AddressSanitizer known issues
AddressSanitizer build and language reference
AddressSanitizer runtime reference
AddressSanitizer shadow bytes
AddressSanitizer cloud or distributed testing
AddressSanitizer debugger integration
AddressSanitizer error examples