Re: Bitflipping: memóriahack élesben
#21
Elküldve: 2015. 03. 13. 16:44
#22
Elküldve: 2015. 03. 13. 16:56
Idézet: 'Geri' - Dátum: 2015. 03. 13. 15:46
amúgy felesleges nyálat verni, mert ha olyan okosak lennétek, akkor ti írnátok testcaset, de persze ez nem így van.
Én írtam már párezer testcase-et, de ennek mi köze ahhoz hogy te nem tudsz programozni!
#23
Elküldve: 2015. 03. 13. 16:57
Idézet: 'Geri' - Dátum: 2015. 03. 13. 16:24
Szerintem menj gyula után
#24
Elküldve: 2015. 03. 13. 17:00
Idézet: 'Geri' - Dátum: 2015. 03. 13. 16:44
A kérdés, hogy miért nem tudsz programozni.
Szóval az a 4 (0100) igazából 3 (0011) és így lesz néggyel osztható az eredmény.
A következő kérdés az, hogy mi értelme van két egymástól független helyen párhuzamosan csinálni mindezt?
geri: "én a hwsw egy kiemelkedő szakmai színvonallal bíró, megbecsült, elsőrangú tagja vagyok."
#25
Elküldve: 2015. 03. 13. 17:04
#include <stdio.h> #include <stdlib.h> inline void clflush( void *p){ asm ("clflush (%0)" :: "r"(p));} int main(){ if(sizeof(void*)!=8){ printf("64bit only\n"); exit(0); } printf("bitfliptest by Geri\n"); unsigned long long * m=( unsigned long long * )malloc(1024+1024*1024*128*sizeof( unsigned long long )); for(unsigned long long sz=0;sz<100LL;sz++){ if(1){ for(int i=0;i<1024*1024*128;i++) m[i]=0; for(int k=0;k<10;k++){ long long r1=(rand()%1024*1024*128); long long r2=(rand()%1024*1024*128); while((r1&3)!=0) r1=(rand()%1024*1024*128); while((r2&3)!=0) r2=(rand()%1024*1024*128); for(long long i=0;i<2061587ULL;i++){ unsigned long long *m1cs=&m[r1]; unsigned long long *m2cs=&m[r2]; *m1cs=++i; *m2cs=++i; clflush(m1cs);clflush(m2cs); *m1cs=++i; *m2cs=++i; clflush(m1cs);clflush(m2cs); *m1cs=++i; *m2cs=++i; clflush(m1cs);clflush(m2cs); *m1cs=++i; *m2cs=++i; clflush(m1cs);clflush(m2cs); *m1cs=++i; *m2cs=++i; clflush(m1cs);clflush(m2cs); *m1cs=++i; *m2cs=++i; clflush(m1cs);clflush(m2cs); *m1cs=++i; *m2cs=++i; clflush(m1cs);clflush(m2cs); *m1cs=++i; *m2cs=++i; clflush(m1cs);clflush(m2cs); *m1cs=++i; *m2cs=++i; clflush(m1cs);clflush(m2cs); *m1cs=++i; *m2cs=++i; clflush(m1cs);clflush(m2cs); *m1cs=0; *m2cs=0; } } long long t=0; for(long long i=0;i<1024ULL*1024ULL*128ULL;i++){ t+=m[i]; } if(t!=0){ printf("vulnerable! %d\n", (int)t); exit(0); }else{ printf("%d%% ok\n", (int)sz); } } } printf("not vulnerable\n"); }
Szerkesztette: 'Geri' 2015. 03. 13. 17:08 -kor
#26
Elküldve: 2015. 03. 13. 17:16
"They pick Y = X + 8MByte based on knowledge of the physical address mapping used by the memory controllers in Intel and AMD’s CPUs."
Még mielőtt átírnád, olvasd el a teljes "How can we pick pairs of addresses that satisfy the “different row, same bank” requirements?" bekezdést.
Szerkesztette: philcsy 2015. 03. 13. 17:19 -kor
geri: "én a hwsw egy kiemelkedő szakmai színvonallal bíró, megbecsült, elsőrangú tagja vagyok."
#27
Elküldve: 2015. 03. 13. 17:46
Egyébként 3 évente 1x kell bitműveleteket használnom, szóval elnézést kérek ha elsőre nem látom át egy számomra ismeretlen nyelvben 22 másodperc alatt amit rászántam hogy mire gondolt a szerző. Te viszont elvileg kurva optimálisan programozol 1000 magon, és még az ASM is magasszintű neked, szóval elvárná az ember, hogy ne egy kibaszott lassú randomot rakjál ciklusba, ha 1 bitmaszkolással is meg lehet oldani a problémát. Mert ha itt megcsinálod, megcsinálod máshol is, aztán csodálkozol hogy kevés neked bármilyen processzor.
#28
Elküldve: 2015. 03. 13. 17:50
#29
Elküldve: 2015. 03. 13. 17:52
A simpler approach is to pick address pairs at random. We allocate a large block of memory (e.g. 1GB) and then pick random virtual addresses within that block. On a machine with 16 DRAM banks (as one of our test machines has: 2 DIMMs with 8 banks per DIMM), this gives us a 1/16 chance that the chosen addresses are in the same bank, which is quite high. (The chance of picking two addresses in the same row is negligible.)
Furthermore, we can increase our chances of successful row hammering by modifying code1a to hammer more addresses per loop iteration. We find we can hammer 4 or 8 addresses without slowing down the time per iteration.