// pico8-fill-in.c // 16.11.2020 04:02 #include #include #include #include #include // prefix for debug prints #define SSS "-fillin-\t" // TODO: use this to enable / disable debug prints #if 1 # define DBP printf #else # define DBP(...) #endif // https://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/libc---strcpy-chk-1.html // TODO: actually check for overflows char * __strcpy_chk(char * dest, const char * src, size_t destlen) { char *d = dest; //printf(SSS "STRCPY %s :::: %s\n", src, dest); while (*src != '\0') { *d++ = *src++; } *d++ = *src++; //printf("STRCPY FINAL %s\n", dest); return dest; } // https://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/libc---stpcpy-chk-1.html char * __stpcpy_chk(char * dest, const char * src, size_t destlen) { // printf(SSS "STPCPY %s :::: %s\n", src, dest); return stpcpy(dest, src); } // https://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/libc---strncpy-chk-1.html char * __strncpy_chk(char * dest, const char * src, size_t n, size_t dest_1len) { // printf(SSS "STRNCPY %s :::: %s\n", src, dest); return strncpy(dest, src, n); } // https://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/libc---strcat-chk-1.html // TODO: There's some good info being dumped here char * __strcat_chk(char * dest, const char * src, size_t destlen) { // printf("!!! strcat %s :::: %s\n", src, dest); char *res = strncat(dest, src, destlen); return res; } // https://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/libc---memcpy-chk-1.html void * __memcpy_chk(void * dest, const void * src, size_t len, size_t destlen) { //puts(SSS "MEMCPY \n"); return memcpy(dest, src, len); } // https://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/libc---memset-chk-1.html void * __memset_chk(void * dest, int c, size_t len, size_t destlen) { // puts(SSS "MEMSET\n"); return memset(dest, c, len); } // https://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/libc---printf-chk-1.html int __printf_chk(int flag, const char * format, ...) { va_list args; //printf("\nPRINTF\n"); va_start(args, format); int ret = vprintf(format, args); va_end(args); return ret; } // https://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/libc---fprintf-chk-1.htm int __fprintf_chk(FILE * stream, int flag, const char * format, ...) { va_list args; //printf("\nFPRINTF\n"); va_start(args, format); int ret = vfprintf(stream, format, args); va_end(args); return ret; } // https://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/libc---sprintf-chk-1.html // TODO: some intresting info int __sprintf_chk(char * str, int flag, size_t strlen, const char * format, ...) { va_list args; //printf("!!!ORIGINAL %s\n", str); va_start(args, format); // int ret = vsnprintf(str, strlen, format, args); // TOOD: Look more into the nature of this function getting passed a -1 // strlen and how else it might be mitigated ? int ret = vsprintf(str, format, args); va_end(args); //printf("!!! sprintf !!!ADR:%p !!!STRLEN:%i !!!RET::%i !!!FORMAT::%s\n!!!OUTPUT::%s\n", str, strlen, ret, format, str); return ret; } void __longjmp_chk () { // puts(SSS "LONG JMP\n"); asm("pop %rbp"); // I think this is a GNU extention, but it's an easy way to do it goto *(&longjmp); } void __fread_chk () { // asm ("pop %rbp"); puts(SSS "FREAD\n"); // stub }