Переполнение статического указателя в bss - PullRequest
0 голосов
/ 08 июня 2018

Я использую упражнения w00w00 по переполнению статического указателя в bss.Я поместил буфер и указатель буфера в статическую структуру, чтобы вызвать переполнение указателя.В противном случае, он помещает указатель перед и в буфер, и переполнения не происходит.

   #include <stdio.h>
   #include <stdlib.h>
   #include <unistd.h>
   #include <string.h>
   #include <errno.h>

   #define BUFSIZE 16
   #define ADDRLEN 4 /* # of bytes in an address */


int main()
   {
        u_long diff;
    struct buf {
    char buf[BUFSIZE];
    char *bufptr  ;
    } ;

    static struct buf a;

    a.bufptr = a.buf, diff = (u_long)a.buf - (u_long)&a.bufptr;

    printf("bufptr (%p) = %p, buf = %p, diff = 0x%x (%d) bytes\n",
            &a.bufptr,a.bufptr, a.buf, diff, diff);

    memset(a.buf, 'A', (u_int)(diff + ADDRLEN));

    printf("bufptr (%p) = %p, buf = %p, diff = 0x%x (%d) bytes\n",
            &a.bufptr, a.bufptr, a.buf, diff, diff);

      return 0;
   }

В настоящее время я получаю эту ошибку при использовании AddressSanitizer

==27643==ERROR: AddressSanitizer: negative-size-param: (size=-12)

SUMMARY: AddressSanitizer: negative-size-param ??:0 __asan_memset
==27643==ABORTING

Есть ли флаг или способ принудительного переполнения?


Редактировать: Я понял проблему.Разный результат был -16.Я с ума сошел, это выглядит так

diff = (u_long)&a.bufptr - (u_long)a.buf

Теперь все работает нормально.

1 Ответ

0 голосов
/ 08 июня 2018

Попробуйте размер, который больше размера структуры, но недостаточно большой, чтобы его можно было интерпретировать как отрицательное:

memset(a.buf, 'A', 1024);

Также обязательно скомпилируйте с -fno-common, как описано в FAQ по Asan .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...