// hack1.cpp : Defines the entry point for the console application. // #include #include #include #include const size_t buffer_size = 16; const size_t buffer_ret_offset = 8 ; char* buffer_data = "AAAABBBBCCCCDDD"; //"DEEEEFFFFGGGG"; void print_mem(unsigned char* mem, const int len, const int bytes_in_line = 8); void stack_func(char* data); void heap_func(char* data); int main(int argc, char* argv[]) { stack_func(buffer_data); // 28 + 1 heap_func(buffer_data); // 28 + 1 system("pause"); return 0; } void stack_func(char* data) { char buffer[buffer_size]; // Staticky vytvoreny buffer printf("stack_func(data = 0x%p) - buffer(STACK %d Bytes) = 0x%p\n",data,buffer_size,&buffer); strcpy(buffer,data); print_mem((unsigned char*)&buffer+buffer_size+buffer_ret_offset,4); buffer[buffer_size+buffer_ret_offset+0] = 'A'; buffer[buffer_size+buffer_ret_offset+1] = 'A'; buffer[buffer_size+buffer_ret_offset+2] = 'A'; buffer[buffer_size+buffer_ret_offset+3] = 'A'; print_mem((unsigned char*)&buffer+buffer_size+buffer_ret_offset,4); } void heap_func(char* data) { char* buffer = (char*) malloc(buffer_size); // Dynamicky vytvoreny model printf("heap_func(data = 0x%p) - buffer(HEAP %d Bytes) = 0x%p\n",data,buffer_size,buffer); strcpy(buffer,data); print_mem((unsigned char*)buffer,2*buffer_size); free(buffer); } void print_mem(unsigned char* mem, const int len, const int bytes_in_line) { printf("MEMORY DUMP BEGIN - 0x%p (%d Bytes)\n",mem, len); for(int i = 0; i < (len/bytes_in_line)+1; i++) // Prizpusobene zpracovani po radcich { for(int j = 0; j < bytes_in_line && (i*bytes_in_line+j < len); j++) { int c = (int)mem[i*bytes_in_line+j]; if(isprint(c)) { printf("%c (0x%02X) ",mem[i*bytes_in_line+j],mem[i*bytes_in_line+j]); } else { printf("%? (0x%02X) ",mem[i*bytes_in_line+j]); } } } printf("\nMEMORY DUMP END\n"); }