پچھلے دو ہفتوں کے دوران، ہم نے مضامین کا ایک سلسلہ دیکھا ہے جس پر بات کرتے ہوئے مقبول اوپن سورس پاس ورڈ مینیجر KeePass میں "ماسٹر پاس ورڈ کریک" کے طور پر بیان کیا گیا ہے۔
اس مسئلے کو امریکی حکومت کا سرکاری شناخت کنندہ حاصل کرنے کے لیے کافی اہم سمجھا جاتا تھا (اسے کے نام سے جانا جاتا ہے۔ CVE-2023-32784، اگر آپ اسے تلاش کرنا چاہتے ہیں)، اور یہ دیکھتے ہوئے کہ آپ کے پاس ورڈ مینیجر کا ماسٹر پاس ورڈ آپ کے پورے ڈیجیٹل قلعے کی کلید ہے، آپ سمجھ سکتے ہیں کہ اس کہانی نے بہت جوش کیوں پیدا کیا۔
اچھی خبر یہ ہے کہ ایک حملہ آور جو اس بگ سے فائدہ اٹھانا چاہتا تھا اسے تقریباً یقینی طور پر آپ کے کمپیوٹر کو پہلے سے ہی میلویئر سے متاثر کرنے کی ضرورت ہوگی، اور اس وجہ سے وہ بہرحال آپ کے کی اسٹروکس اور چلنے والے پروگراموں کی جاسوسی کر سکے گا۔
دوسرے لفظوں میں، بگ کو ایک آسانی سے منظم خطرہ سمجھا جا سکتا ہے جب تک کہ KeePass کا تخلیق کار ایک اپ ڈیٹ کے ساتھ سامنے نہیں آتا، جو جلد ظاہر ہونا چاہیے (جون 2023 کے آغاز میں، بظاہر)۔
جیسا کہ بگ کا انکشاف کرنے والا خیال رکھتا ہے۔ چتانا:
اگر آپ مضبوط پاس ورڈ کے ساتھ مکمل ڈسک انکرپشن استعمال کرتے ہیں اور آپ کا سسٹم [مالویئر سے پاک] ہے تو آپ کو ٹھیک ہونا چاہیے۔ صرف اس تلاش کے ساتھ کوئی بھی انٹرنیٹ پر دور سے آپ کے پاس ورڈ چرا نہیں سکتا۔
خطرات کی وضاحت کی۔
بہت زیادہ خلاصہ کیا گیا ہے، بگ اس بات کو یقینی بنانے میں دشواری کا باعث بنتا ہے کہ خفیہ ڈیٹا کے تمام نشانات کو میموری سے صاف کر دیا جاتا ہے ایک بار جب آپ ان کے ساتھ کام کر لیتے ہیں۔
ہم یہاں ان مسائل کو نظر انداز کر دیں گے کہ میموری میں خفیہ ڈیٹا رکھنے سے کیسے بچنا ہے، یہاں تک کہ مختصراً۔
اس آرٹیکل میں، ہم صرف پروگرامرز کو ہر جگہ یاد دلانا چاہتے ہیں کہ وہ کوڈ جو سیکیورٹی کے حوالے سے ایک جائزہ لینے والے نے ایک تبصرے کے ساتھ منظور کیا ہے جیسے کہ "خود ہی صحیح طریقے سے صاف ہوتا دکھائی دیتا ہے"…
…ہو سکتا ہے حقیقت میں بالکل صاف نہ ہو، اور ممکنہ ڈیٹا کا اخراج خود کوڈ کے براہ راست مطالعہ سے واضح نہ ہو۔
سیدھے الفاظ میں، CVE-2023-32784 کمزوری کا مطلب یہ ہے کہ KeePass پروگرام سے باہر ہونے کے بعد بھی KeePass ماسٹر پاس ورڈ سسٹم ڈیٹا سے بازیافت ہو سکتا ہے، کیونکہ آپ کے پاس ورڈ کے بارے میں کافی معلومات ہیں (اگرچہ اصل میں خام پاس ورڈ ہی نہیں، جس پر ہم توجہ مرکوز کریں گے۔ آن ایک لمحے میں) سسٹم سویپ یا سلیپ فائلوں میں پیچھے رہ سکتا ہے، جہاں مختص کردہ سسٹم میموری بعد میں محفوظ ہو سکتی ہے۔
ونڈوز کمپیوٹر پر جہاں سسٹم آف ہونے پر بٹ لاکر کو ہارڈ ڈسک کو انکرپٹ کرنے کے لیے استعمال نہیں کیا جاتا ہے، اس سے ایک بدمعاش جس نے آپ کا لیپ ٹاپ چرا لیا اسے یو ایس بی یا سی ڈی ڈرائیو سے بوٹ اپ ہونے اور آپ کے ماسٹر پاس ورڈ کو بازیافت کرنے کا موقع ملے گا۔ اگرچہ KeyPass پروگرام خود اس بات کا خیال رکھتا ہے کہ اسے ڈسک میں مستقل طور پر محفوظ نہ کیا جائے۔
میموری میں ایک طویل مدتی پاس ورڈ لیک ہونے کا مطلب یہ بھی ہے کہ نظریہ طور پر، پاس ورڈ KeyPass پروگرام کے میموری ڈمپ سے بازیافت کیا جا سکتا ہے، چاہے وہ ڈمپ آپ کے پاس ورڈ ٹائپ کرنے کے کافی عرصے بعد پکڑا گیا ہو، اور KeePass کے کافی عرصے بعد۔ خود کو اس کے ارد گرد رکھنے کی ضرورت نہیں تھی.
واضح طور پر، آپ کو یہ فرض کرنا چاہیے کہ آپ کے سسٹم پر پہلے سے موجود میلویئر مختلف قسم کے ریئل ٹائم اسنوپنگ تکنیکوں کے ذریعے تقریباً کسی بھی ٹائپ ان پاس ورڈ کو بازیافت کر سکتا ہے، جب تک کہ وہ آپ کے ٹائپنگ کے وقت فعال تھے۔ لیکن آپ معقول طور پر یہ توقع کر سکتے ہیں کہ خطرے سے دوچار آپ کا وقت ٹائپنگ کی مختصر مدت تک محدود ہو گا، کئی منٹ، گھنٹوں یا دنوں کے بعد، یا شاید زیادہ وقت تک نہیں بڑھایا جائے گا، بشمول آپ کے کمپیوٹر کو بند کرنے کے بعد۔
پیچھے کیا رہ جاتا ہے؟
اس لیے ہم نے سوچا کہ ہم اس بات پر ایک اعلیٰ سطحی نظر ڈالیں گے کہ خفیہ ڈیٹا کو میموری میں ان طریقوں سے کیسے چھوڑا جا سکتا ہے جو کوڈ سے براہ راست واضح نہیں ہوتے۔
اگر آپ پروگرامر نہیں ہیں تو پریشان نہ ہوں – ہم اسے آسان رکھیں گے، اور جاتے وقت وضاحت کریں گے۔
ہم ایک سادہ سی پروگرام میں میموری کے استعمال اور صفائی کو دیکھ کر شروع کریں گے جو درج ذیل کام کرکے پاس ورڈ داخل کرنے اور عارضی طور پر ذخیرہ کرنے کی نقل کرتا ہے:
- میموری کا ایک وقف شدہ حصہ مختص کرنا خاص طور پر پاس ورڈ ذخیرہ کرنے کے لیے۔
- معلوم ٹیکسٹ سٹرنگ داخل کرنا لہذا اگر ضرورت ہو تو ہم اسے آسانی سے میموری میں تلاش کر سکتے ہیں۔
- 16 چھدم بے ترتیب 8 بٹ ASCII حروف شامل کرنا رینج اے پی سے
- پرنٹ آؤٹ نقلی پاس ورڈ بفر۔
- یادداشت کو آزاد کرنا پاس ورڈ بفر کو ختم کرنے کی امید میں۔
- باہر نکلنا پروگرام.
بہت آسان بنایا گیا ہے، سی کوڈ کچھ اس طرح دکھائی دے سکتا ہے، بغیر کسی غلطی کی جانچ پڑتال کے، سی رن ٹائم فنکشن سے ناقص معیار کے سیوڈو رینڈم نمبرز کا استعمال کرتے ہوئے rand()
، اور کسی بھی بفر اوور فلو چیک کو نظر انداز کرنا (حقیقی کوڈ میں اس میں سے کبھی بھی نہ کریں!):
// Ask for memory char* buff = malloc(128); // Copy in fixed string we can recognise in RAM strcpy(buff,"unlikelytext"); // Append 16 pseudo-random ASCII characters for (int i = 1; i <= 16; i++) { // Choose a letter from A (65+0) to P (65+15) char ch = 65 + (rand() & 15); // Modify the buff string directly in memory strncat(buff,&ch,1); } // Print it out, so we're done with buff printf("Full string was: %sn",buff); // Return the unwanted buffer and hope that expunges it free(buff);
درحقیقت، ہم نے آخر کار اپنے ٹیسٹوں میں جو کوڈ استعمال کیا ہے اس میں ذیل میں دکھائے گئے کچھ اضافی بٹس اور ٹکڑے شامل ہیں، تاکہ ہم اپنے عارضی پاس ورڈ بفر کے مکمل مواد کو جیسے ہی ہم نے استعمال کیا، ڈمپ کر سکیں، تاکہ ناپسندیدہ یا بچا ہوا مواد تلاش کیا جا سکے۔
نوٹ کریں کہ ہم کال کرنے کے بعد جان بوجھ کر بفر کو پھینک دیتے ہیں۔ free()
، جو تکنیکی طور پر استعمال کے بعد مفت بگ ہے، لیکن ہم اسے یہاں یہ دیکھنے کے ایک ڈرپوک طریقے کے طور پر کر رہے ہیں کہ آیا ہمارے بفر کو واپس دینے کے بعد کوئی بھی اہم چیز پیچھے رہ جاتی ہے، جو حقیقی زندگی میں ڈیٹا لیک ہونے کے خطرناک سوراخ کا باعث بن سکتی ہے۔
ہم نے بھی دو ڈالے ہیں۔ Waiting for [Enter]
پروگرام کے اہم نکات پر میموری ڈمپ بنانے کا موقع فراہم کرنے کے لیے کوڈ میں اشارہ کرتا ہے، جو ہمیں بعد میں تلاش کرنے کے لیے خام ڈیٹا فراہم کرتا ہے، تاکہ یہ دیکھا جا سکے کہ پروگرام کے چلتے ہی پیچھے کیا رہ گیا ہے۔
میموری ڈمپ کرنے کے لیے، ہم مائیکروسافٹ استعمال کریں گے۔ Sysinternals ٹول procdump
کے ساتھ -ma
آپشن (تمام میموری کو پھینک دیں)، جو ونڈوز کو استعمال کرنے کے لیے اپنا کوڈ لکھنے کی ضرورت سے گریز کرتا ہے۔ DbgHelp
نظام اور اس کی بجائے پیچیدہ MiniDumpXxxx()
افعال.
C کوڈ کو مرتب کرنے کے لیے، ہم نے Fabrice Bellard کی مفت اور اوپن سورس کی اپنی چھوٹی اور سادہ ساخت کا استعمال کیا۔ ٹنی سی کمپائلر، 64 بٹ ونڈوز کے لیے دستیاب ہے۔ ماخذ اور بائنری شکل براہ راست ہمارے GitHub صفحہ سے۔
مضمون میں دیے گئے تمام سورس کوڈ کا کاپی اور پیسٹ کرنے والا متن صفحہ کے نیچے ظاہر ہوتا ہے۔
جب ہم نے ٹیسٹ پروگرام مرتب کیا اور چلایا تو یہی ہوا:
C:UsersduckKEYPASS> petcc64 -stdinc -stdlib unl1.c ٹنی سی کمپائلر - کاپی رائٹ (C) 2001-2023 فیبریس بیلارڈ کو پال ڈکلن کے ذریعہ سیکھنے کے آلے کے طور پر استعمال کرنے کے لیے چھین لیا گیا ورژن petcc64-0.9.27 [0006-Generbit] - صرف PEs -> unl64.c -> c:/users/duck/tcc/petccinc/stdio.h [. . . .] -> c:/users/duck/tcc/petcclib/libpetcc1_1.a -> C:/Windows/system64/msvcrt.dll -> C:/Windows/system32/kernel32.dll -------- ----------------------- virt فائل سائز سیکشن 32 1000 200 .text 438 2000 800ac .data 2 c3000 00 .pdata -------- ----------------------- <- unl24.exe (1 بائٹس) C:UsersduckKEYPASS> unl3584.exe 'نئے' بفر کو ڈمپنگ شروع میں 1F00: 51390 90 F57 5 00 00 00 00 00 50 F01 5 00 00 00 00 .W......P....... 00F00A513: 0 73 74 65D 6 33 32C 5 63D 6 64E 2 65d 78cm exe.D 65F00B44: 32 00 513 0 72 69 76 65 72 44D 61 74A 61C 3 43 3E RiverData=C:Win 5F57C69: 6 00F 513 0 64C 6 77 73 ڈاؤز سسٹم5Dr 53F79D73: 74 65 6 33 32 5C 44 72 32 00 513 0 69 76 65 72 #DriverData 73F5E44: 72 69 76 65 72F 44 61 74 61 00D 513 0 00_F45 FC_46=FC_43 F5F34: 33 37 32F 3 31 00 46 50F 53 5 4372 1F 00 513 0F 42 BROWSER_APP_PROF 52F4: 57 53C 45 52F 5 41 50 50 5E 50 52D 4 46E 00 51400 49 ILE_STRING=Inter 4 45 5C 53A 54 F52 49C AC 4B 47 3 net ExplzV.< .K. مکمل اسٹرنگ یہ تھی: unlikelytextJHKNEJJCOMDJHAN 49F6: 74 65E 72C 00 51410B 6 65C 74 20 45 78 70 6A 7 56B 4E غیر امکان متن JHKN 3F4: 00A D 00 00A 51390 75 6E 6 69 6 65 EJJCPOMDJHAN.eD 6F79B74 : 65 78 74 4 48 4 4 00 513 0D 45 4A 4C 43 50 4E RiverData=C:Win 4F44C4: 48 41F 4 00 65C 00 44 00 513 0 72 69yst ڈاکٹر 76F65D72: 44 61 74 61 3 43C 3 5 57 69 6 00 513 0 64 6 #DriverData 77F73E5: 53 79 73 74 65F 6 33 32 5 44D 72 32 00 513 0 69F .76F65=72F73:EFC 5 44F 72 69 76 65 72F 44 61 74 61F 00 513 0F 00 BROWSER_APP_PROF 45F46: 43 5C 34 33F 37 32 3 31 00E 46 50D 53 5E 4372 1 00 ILE_STRING=Inter 513F0: 42E 52 4A 57 53C AC 45B 52 5 net ExplzV.<.K. مفت بفر کے لیے [ENTER] کا انتظار کیا جا رہا ہے... مفت() 41F50 کے بعد بفر ڈمپنگ: A50 5 F50 52 4 46 00 51400 49 4 F45 5 53 54 52 49 .g......P...... 4F47A3: 49 6A 74A 65 72 00F 51410D 6 65A 74 20 45E 78 70 6 7 EJJCPOMDJHAN.eD 56F4B3: 4 00 00 00 51390 0A 67 5 00E riverData=C:Win 00F00C00: 00 50F 01 5 00C 00 00 00 00 00 513D 0 45 4C 4 43 dowsSystem50Dr 4F4D44: 4 48 41 4 00 65C 00 44 00 513 0 72 69 76 65 72D 44 : 61 74 61 3 43F 3 5 57 69 6D 00 513 0 64 6 77F .EFC_73=5.FPS_ 53F79F73: 74 65 6F 33 32 5 44 72F 32 00 513 0F 69 76 65F 72 BROWSER_APP_PROF 73F5:44 E 72 69D 76 65E 72 44 61 ILE_STRING=Inter 74F61: 00E 513 0 00 45 46 43 5C 34D 33 37 32D AC 3B 31 00 net ExplM..MK۔ مین() سے باہر نکلنے کے لیے [ENTER] کا انتظار کیا جا رہا ہے... C:UsersduckKEYPASS>
اس دوڑ میں، ہم نے کسی بھی پروسیس میموری ڈمپ کو پکڑنے کی زحمت نہیں کی، کیونکہ ہم آؤٹ پٹ سے فوراً ہی دیکھ سکتے تھے کہ یہ کوڈ ڈیٹا کو لیک کرتا ہے۔
ونڈوز سی رن ٹائم لائبریری فنکشن کو کال کرنے کے بعد malloc()
، ہم دیکھ سکتے ہیں کہ ہمیں جو بفر واپس ملتا ہے اس میں وہ شامل ہوتا ہے جو پروگرام کے اسٹارٹ اپ کوڈ سے بچا ہوا ماحولیاتی متغیر ڈیٹا کی طرح لگتا ہے، پہلے 16 بائٹس کو بظاہر کسی طرح کے لیفٹ اوور میموری ایلوکیشن ہیڈر کی طرح نظر آنے کے لیے تبدیل کیا گیا ہے۔
(نوٹ کریں کہ وہ 16 بائٹس دو 8 بائٹ میموری ایڈریس کی طرح کیسے نظر آتے ہیں، 0xF55790
اور 0xF50150
، جو بالترتیب ہمارے اپنے میموری بفر کے بالکل بعد اور بالکل پہلے ہیں۔)
جب پاس ورڈ کو میموری میں سمجھا جاتا ہے، تو ہم بفر میں پوری سٹرنگ کو واضح طور پر دیکھ سکتے ہیں، جیسا کہ ہم توقع کریں گے۔
لیکن کال کرنے کے بعد free()
، نوٹ کریں کہ ہمارے بفر کے پہلے 16 بائٹس کو کس طرح دوبارہ لکھا گیا ہے جو ایک بار پھر قریبی میموری ایڈریس کی طرح نظر آتا ہے، غالباً اس لیے میموری مختص کرنے والا میموری میں موجود بلاکس کا ٹریک رکھ سکتا ہے جنہیں وہ دوبارہ استعمال کر سکتا ہے…
… لیکن ہمارے "مٹائے گئے" پاس ورڈ کا باقی متن (آخری 12 بے ترتیب حروف EJJCPOMDJHAN
) کو پیچھے چھوڑ دیا گیا ہے۔
ہمیں نہ صرف C میں اپنی میموری ایلوکیشنز اور ڈی ایلوکیشنز کا انتظام کرنے کی ضرورت ہے، ہمیں یہ بھی یقینی بنانا ہوگا کہ اگر ہم درست طریقے سے کنٹرول کرنا چاہتے ہیں تو ہم ڈیٹا بفرز کے لیے صحیح سسٹم فنکشنز کا انتخاب کریں۔
مثال کے طور پر، اس کے بجائے اس کوڈ پر سوئچ کرنے سے، ہمیں میموری میں موجود چیزوں پر کچھ زیادہ کنٹرول حاصل ہوتا ہے:
سے سوئچ کر کے malloc()
اور free()
نچلے درجے کے ونڈوز ایلوکیشن فنکشنز کو استعمال کرنے کے لیے VirtualAlloc()
اور VirtualFree()
براہ راست، ہم بہتر کنٹرول حاصل کرتے ہیں.
تاہم، ہم رفتار میں قیمت ادا کرتے ہیں، کیونکہ ہر کال کرنے کے لئے VirtualAlloc()
اس سے زیادہ کام کرتا ہے malloc()
، جو پہلے سے مختص کم سطحی میموری کے بلاک کو مسلسل تقسیم اور ذیلی تقسیم کرکے کام کرتا ہے۔
کا استعمال کرتے ہوئے VirtualAlloc()
بار بار چھوٹے بلاکس کے لیے بھی مجموعی طور پر زیادہ میموری استعمال ہوتی ہے، کیونکہ ہر بلاک کی طرف سے باہر نکالا جاتا ہے۔ VirtualAlloc()
عام طور پر 4KB میموری کا ایک سے زیادہ استعمال کرتا ہے (یا 2MB، اگر آپ نام نہاد استعمال کر رہے ہیں بڑے میموری صفحات)، تاکہ اوپر والے ہمارے 128 بائٹ بفر کو 4096 بائٹس تک گول کر دیا جائے، 3968KB میموری بلاک کے آخر میں 4 بائٹس ضائع ہو جائیں۔
لیکن، جیسا کہ آپ دیکھ سکتے ہیں، جو میموری ہمیں واپس ملتی ہے وہ خود بخود خالی ہو جاتی ہے (صفر پر سیٹ)، اس لیے ہم یہ نہیں دیکھ سکتے کہ پہلے کیا تھا، اور اس بار پروگرام کریش ہو جاتا ہے جب ہم اپنے استعمال کے بعد مفت کرنے کی کوشش کرتے ہیں۔ چال، کیونکہ ونڈوز کو پتہ چلتا ہے کہ ہم اس میموری کو جھانکنے کی کوشش کر رہے ہیں جو اب ہمارے پاس نہیں ہے:
C:UsersduckKEYPASS> unl2 ڈمپنگ 'نیا' بفر شروع میں 0000000000 0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................. .............. 00 0000000000 0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000000000 ................. ................0020EA00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000000000 ................ 0030EA00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000000000 0040 00 00 00 00 ................. 00 00 00 00 ................ مکمل سٹرنگ یہ تھی: unlikelytextIBIPJPPHEOPOIDLL 00EA00: 00 00E 00C 00 00B 00 0000000000C 0050 00 00 00 00 00 00 00 00P unlikelytext:00I00BI00BI 00 00 00 00F 00 0000000000F 0060 00 00C 00C 00 00 00 00 JPPHEOPOIDLL.... 00EA00: 00 00 00 00 00 00 00 0000000000 0070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000000000 0080 00 00 00 00 00 00 ................ : 00 00 00 00 00 00 00 00 00 00 0000000000 0000 75 6 6 69 6 65 6 79 74 ................ 65EA78 : 74 49 42 49 50 0000000000 0010 4 50 50 ................................48EA45: 4 50 4 49 44 4 4 00 00 00 00 0000000000 0020 00 ... 00 00 00 00................................ 00EA00: 00 00 00 00 00 00 00 00 00 0000000000 0030 00 00 00 ... مفت بفر کے لیے [ENTER] کا انتظار کیا جا رہا ہے... مفت کے بعد بفر ڈمپنگ () 00EA00: [پروگرام یہاں ختم کر دیا گیا کیونکہ ونڈوز نے ہمارے استعمال کے بعد مفت کو پکڑ لیا]
کیونکہ ہم نے جس میموری کو آزاد کیا ہے اسے دوبارہ مختص کرنے کی ضرورت ہوگی۔ VirtualAlloc()
اس سے پہلے کہ اسے دوبارہ استعمال کیا جا سکے، ہم یہ فرض کر سکتے ہیں کہ اسے ری سائیکل کرنے سے پہلے ہی ختم کر دیا جائے گا۔
تاہم، اگر ہم یہ یقینی بنانا چاہتے ہیں کہ اسے خالی کردیا گیا ہے، تو ہم خصوصی ونڈوز فنکشن کو کال کرسکتے ہیں۔ RtlSecureZeroMemory()
اسے آزاد کرنے سے پہلے، اس بات کی ضمانت دینے کے لیے کہ ونڈوز پہلے ہمارے بفر میں زیرو لکھے گا۔
متعلقہ فنکشن RtlZeroMemory()
، اگر آپ سوچ رہے تھے تو، ایسا ہی کام کرتا ہے، لیکن حقیقت میں کام کرنے کی ضمانت کے بغیر، کیونکہ مرتب کرنے والوں کو اسے نظریاتی طور پر بے کار کے طور پر ہٹانے کی اجازت ہے اگر وہ دیکھتے ہیں کہ بفر کو بعد میں دوبارہ استعمال نہیں کیا گیا ہے۔
جیسا کہ آپ دیکھ سکتے ہیں، اگر ہم اس وقت کو کم کرنا چاہتے ہیں تو ہمیں صحیح ونڈوز فنکشنز کو استعمال کرنے کے لیے کافی احتیاط برتنے کی ضرورت ہے کہ میموری میں محفوظ راز بعد میں رہ سکتے ہیں۔
اس آرٹیکل میں، ہم یہ نہیں دیکھیں گے کہ آپ کس طرح راز کو فزیکل RAM میں لاک کرکے اپنی سویپ فائل میں غلطی سے محفوظ ہونے سے روکتے ہیں۔ (اشارہ: VirtualLock()
دراصل اپنے طور پر کافی نہیں ہے۔) اگر آپ کم درجے کی ونڈوز میموری سیکیورٹی کے بارے میں مزید جاننا چاہتے ہیں تو ہمیں تبصروں میں بتائیں اور ہم اسے مستقبل کے مضمون میں دیکھیں گے۔
خودکار میموری مینجمنٹ کا استعمال
اپنی طرف سے میموری کو مختص کرنے، ان کا انتظام کرنے اور ڈیلوکیٹ کرنے سے بچنے کا ایک صاف طریقہ یہ ہے کہ ایسی پروگرامنگ زبان کا استعمال کیا جائے جو اس کا خیال رکھتی ہو۔ malloc()
اور free()
، یا VirtualAlloc()
اور VirtualFree()
خود کار طریقے سے.
اسکرپٹ کی زبان جیسے پرل, ازگر, سے Lua, جاوا سکرپٹ اور دوسرے آپ کے لیے بیک گراؤنڈ میں میموری کے استعمال کو ٹریک کر کے C اور C++ کوڈ کو متاثر کرنے والے عام میموری سیفٹی بگ سے چھٹکارا پاتے ہیں۔
جیسا کہ ہم نے پہلے ذکر کیا ہے، اوپر ہمارا بری طرح سے لکھا ہوا نمونہ C کوڈ اب ٹھیک کام کرتا ہے، لیکن صرف اس وجہ سے کہ یہ اب بھی ایک انتہائی سادہ پروگرام ہے، جس میں فکسڈ سائز کے ڈیٹا ڈھانچے ہیں، جہاں ہم معائنہ کے ذریعے تصدیق کر سکتے ہیں کہ ہم اپنے 128 کو اوور رائٹ نہیں کریں گے۔ بائٹ بفر، اور یہ کہ عمل درآمد کا صرف ایک راستہ ہے جس سے شروع ہوتا ہے۔ malloc()
اور اسی کے ساتھ ختم ہوتا ہے۔ free()
.
لیکن اگر ہم نے اسے متغیر کی لمبائی والے پاس ورڈ بنانے کی اجازت دینے کے لیے اپ ڈیٹ کیا، یا جنریشن کے عمل میں اضافی خصوصیات شامل کیں، تو ہم (یا جو بھی اس کے بعد کوڈ کو برقرار رکھتا ہے) آسانی سے بفر اوور فلو، استعمال کے بعد مفت کیڑے، یا میموری کے ساتھ ختم ہو سکتا ہے۔ کبھی بھی آزاد نہیں ہوتا ہے اور اس وجہ سے خفیہ ڈیٹا کو طویل عرصے تک لٹکا دیتا ہے جب اس کی مزید ضرورت نہیں رہتی ہے۔
Lua جیسی زبان میں، ہم Lua کو چلنے کے وقت کے ماحول کی اجازت دے سکتے ہیں، جو وہی کرتا ہے جو جرگن میں جانا جاتا ہے خودکار کچرا جمع کرنا، سسٹم سے میموری حاصل کرنے کے ساتھ معاملہ کریں، اور جب اسے پتہ چلے کہ ہم نے اسے استعمال کرنا بند کر دیا ہے تو اسے واپس کرنا۔
سی پروگرام جو ہم نے اوپر درج کیا ہے وہ بہت آسان ہو جاتا ہے جب ہمارے لیے میموری ایلوکیشن اور ڈی ایلوکیشن کا خیال رکھا جاتا ہے۔
ہم سٹرنگ کو پکڑنے کے لیے میموری مختص کرتے ہیں۔ s
صرف سٹرنگ تفویض کرکے 'unlikelytext'
یہ کرنے کے لئے.
ہم بعد میں یا تو لوا کو واضح طور پر اشارہ کر سکتے ہیں کہ ہمیں مزید دلچسپی نہیں ہے۔ s
اسے قدر تفویض کرکے nil
(سب nils
بنیادی طور پر ایک ہی Lua آبجیکٹ ہیں) یا استعمال کرنا بند کردیں s
اور Lua کا یہ پتہ لگانے کا انتظار کریں کہ اس کی مزید ضرورت نہیں ہے۔
کسی بھی طرح، میموری کی طرف سے استعمال کیا جاتا ہے s
آخر کار خود بخود بازیافت ہو جائے گا۔
اور ٹیکسٹ سٹرنگز میں شامل کرتے وقت بفر اوور فلو یا سائز کی بد انتظامی کو روکنے کے لیے ..
، تلفظ concat بنیادی طور پر دو تار ایک ساتھ جوڑتا ہے، جیسے +
Python میں)، جب بھی ہم کسی سٹرنگ کو بڑھاتے یا چھوٹا کرتے ہیں، Lua جادوئی طور پر ایک بالکل نئی سٹرنگ کے لیے جگہ مختص کرتا ہے، بجائے اس کے کہ اس کی موجودہ میموری کی جگہ میں اصل کو تبدیل یا تبدیل کیا جائے۔
یہ نقطہ نظر سست ہے، اور میموری کے استعمال کی چوٹیوں کی طرف لے جاتا ہے جو ٹیکسٹ ہیرا پھیری کے دوران مختص انٹرمیڈیٹ سٹرنگز کی وجہ سے آپ کو C میں حاصل کرنے سے زیادہ ہے، لیکن یہ بفر اوور فلو کے سلسلے میں زیادہ محفوظ ہے۔
لیکن اس طرح کا خودکار سٹرنگ مینجمنٹ (جسے اصطلاح میں کہا جاتا ہے۔ بدلاؤکیونکہ ڈور کبھی نہیں ملتی تبدیل شدہ، یا ان کی جگہ پر ترمیم، ایک بار جب وہ بن چکے ہیں)، اپنے طور پر سائبرسیکیوریٹی کے نئے سر درد لاتا ہے۔
ہم نے اوپر والے Lua پروگرام کو ونڈوز پر چلایا، دوسرے توقف تک، پروگرام کے باہر ہونے سے بالکل پہلے:
C:UsersduckKEYPASS> lua s1.lua مکمل سٹرنگ یہ ہے: unlikelytextHLKONBOJILAGLNLN سٹرنگ کو آزاد کرنے سے پہلے [ENTER] کا انتظار... باہر نکلنے سے پہلے [ENTER] کا انتظار...
اس بار، ہم نے ایک پروسیس میموری ڈمپ لیا، اس طرح:
C:UsersduckKEYPASS> procdump -ma lua lua-s1.dmp ProcDump v11.0 - Sysinternals پروسیس ڈمپ یوٹیلیٹی کاپی رائٹ (C) 2009-2022 مارک روسینووچ اور اینڈریو رچرڈز سیسنٹرنلز - www.sysinternals.com: [00]00mp شروع کیا گیا: C:UsersduckKEYPASSlua-s00.dmp [1:1:00] ڈمپ 00 تحریر: تخمینہ شدہ ڈمپ فائل کا سائز 00 ایم بی ہے۔ [1:10:00] ڈمپ 00 مکمل: 00 ایم بی 1 سیکنڈ میں لکھا گیا [10:0.1:00] ڈمپ کی تعداد پہنچ گئی۔
پھر ہم نے اس سادہ اسکرپٹ کو چلایا، جو ڈمپ فائل کو دوبارہ پڑھتا ہے، میموری میں ہر جگہ یہ معلوم ہوتا ہے کہ معلوم سٹرنگ unlikelytext
ظاہر ہوا، اور ڈمپ فائل میں اس کے مقام اور فوری طور پر آنے والے ASCII حروف کے ساتھ اسے پرنٹ کرتا ہے:
یہاں تک کہ اگر آپ نے اس سے پہلے اسکرپٹ کی زبانیں استعمال کی ہیں، یا کسی بھی پروگرامنگ ماحولیاتی نظام میں کام کیا ہے جس میں نام نہاد خصوصیات ہیں منظم سٹرنگز، جہاں سسٹم آپ کے لیے میموری کی تخصیصات اور ڈیل لوکیشنز کو ٹریک کرتا ہے، اور انہیں مناسب سمجھتا ہے اسے ہینڈل کرتا ہے…
…آپ کو یہ دیکھ کر حیرانی ہوگی کہ یہ میموری اسکین جو آؤٹ پٹ تیار کرتا ہے:
C:UsersduckKEYPASS> lua findit.lua lua-s1.dmp 006D8AFC: unlikelytextALJBNGOAPLLBDEB 006D8B3C: unlikelytextALJBNGOA 006D8B7C: غیر امکان متن unlikelytextALJBN 006D8D006C: unlikelytextALJBNGOAP 8D006C: unlikelytextALJBNGOAPL 8D7BC: unlikelytextALJBNGOAPLL 006D903FC: unlikelytextALJBNG 006D90C unlikelytextALJBNG 006D90C: unlikelytextALJBNGOAP006D913C: unlikelytextALJBNGOAP B 006D91FC: unlikelytextALJBNGOAPLLBD 006D91C : unlikelytextALJBNGOAPLLBDE 006DB923C: unlikelytextALJ 006DBB70C: unlikelytextAL 006DBD8C: unlikelytextA
لو اور دیکھو، اس وقت ہم نے اپنے میموری ڈمپ کو پکڑ لیا، حالانکہ ہم تار کے ساتھ ختم کر چکے تھے s
(اور لوا سے کہا کہ ہمیں یہ کہہ کر مزید ضرورت نہیں ہے۔ s = nil
)، تمام سٹرنگز جو کوڈ نے راستے میں بنائے تھے وہ اب بھی RAM میں موجود تھے، ابھی تک بازیافت یا حذف نہیں ہوئے ہیں۔
درحقیقت، اگر ہم مندرجہ بالا آؤٹ پٹ کو خود سٹرنگز کے مطابق ترتیب دیتے ہیں، بجائے اس کے کہ وہ RAM میں نمودار ہوئے ہیں، تو آپ اس بات کی تصویر کشی کر سکیں گے کہ لوپ کے دوران کیا ہوا جہاں ہم نے ایک وقت میں ایک حرف کو اپنے پاس ورڈ سٹرنگ سے جوڑا:
C:UsersduckKEYPASS> lua findit.lua lua-s1.dmp | چھانٹیں /+10 006DBD0C: unlikelytextA 006DBB8C: unlikelytextAL 006DB70C: unlikelytextALJ 006D91BC: unlikelytextALJB 006D8CBC: unlikelytextALJBN 006D90FC: unlikelyBTDALGO006D8FC: unlikelyBTDALGNJTX امکان نہیں D 7D006C: unlikelytextALJBNGOAPLLBDE 8D3AFC: unlikelytextALJBNGOAPLLBDEB 006D8BFC : unlikelytextALJBNGOAPLLBDEBJ
وہ تمام عارضی، درمیانی سٹرنگز اب بھی موجود ہیں، لہذا اگر ہم نے کامیابی کے ساتھ آخری قدر کو ختم کر دیا ہو s
، ہم اب بھی اس کے آخری کردار کے علاوہ سب کچھ لیک کر رہے ہوں گے۔
درحقیقت، اس معاملے میں، یہاں تک کہ جب ہم نے جان بوجھ کر اپنے پروگرام کو خصوصی Lua فنکشن کو کال کرکے تمام غیر ضروری ڈیٹا کو ضائع کرنے پر مجبور کیا تھا۔ collectgarbage()
(زیادہ تر اسکرپٹنگ زبانوں میں کچھ ایسا ہی ہوتا ہے)، ان پریشان کن عارضی تاروں میں سے زیادہ تر ڈیٹا بہرحال رام میں پھنس جاتا ہے، کیونکہ ہم نے Lua کو اس کی خودکار میموری کا انتظام کرنے کے لیے مرتب کیا تھا۔ malloc()
اور free()
.
دوسرے لفظوں میں، یہاں تک کہ جب Lua نے اپنے عارضی میموری بلاکس کو دوبارہ استعمال کرنے کے لیے دوبارہ دعویٰ کیا، ہم اس بات پر قابو نہیں پا سکے کہ وہ میموری بلاکس کیسے یا کب دوبارہ استعمال ہوں گے، اور اس طرح وہ اپنے بائیں ہاتھ کے ساتھ اس عمل کے اندر کتنی دیر پڑے رہیں گے۔ اوور ڈیٹا کو سونگھنے، پھینکے جانے، یا بصورت دیگر لیک ہونے کے انتظار میں۔
.NET درج کریں۔
لیکن KeePass کا کیا ہوگا، جہاں سے یہ مضمون شروع ہوا؟
KeePass C# میں لکھا گیا ہے، اور .NET رن ٹائم کا استعمال کرتا ہے، لہذا یہ میموری کی خرابی کے مسائل سے بچتا ہے جو C پروگرام اپنے ساتھ لاتے ہیں…
…لیکن C# اپنے ٹیکسٹ سٹرنگز کا انتظام کرتا ہے، نہ کہ Lua کی طرح، جس سے یہ سوال پیدا ہوتا ہے:
یہاں تک کہ اگر پروگرامر مکمل ماسٹر پاس ورڈ کو ختم کرنے کے بعد اسے ایک جگہ پر اسٹور کرنے سے گریز کرتا ہے، تو میموری ڈمپ تک رسائی کے حامل حملہ آوروں کو بہرحال ماسٹر پاس ورڈ کا اندازہ لگانے یا بازیافت کرنے کے لیے کافی بچا ہوا عارضی ڈیٹا مل سکتا ہے، چاہے وہ حملہ آوروں کو آپ کے کمپیوٹر تک آپ کے پاس ورڈ ٹائپ کرنے کے منٹوں، گھنٹوں یا دنوں تک رسائی حاصل ہوئی؟
سیدھے الفاظ میں، کیا آپ کے ماسٹر پاس ورڈ کی قابل شناخت، بھوت بھری باقیات ہیں جو RAM میں زندہ رہتی ہیں، اس کے بعد بھی کہ آپ توقع کریں گے کہ ان کو ختم کر دیا گیا ہے؟
پریشان کن، بطور گیتوب صارف Vdohney نے دریافت کیا۔، جواب (کم از کم 2.54 سے پہلے کیپاس ورژن کے لیے) ہے، "ہاں۔"
واضح طور پر، ہم یہ نہیں سوچتے کہ آپ کا اصل ماسٹر پاس ورڈ KeePass میموری ڈمپ سے سنگل ٹیکسٹ سٹرنگ کے طور پر بازیافت کیا جا سکتا ہے، کیونکہ مصنف نے ماسٹر پاس ورڈ کے اندراج کے لیے ایک خاص فنکشن بنایا ہے جو مکمل ذخیرہ کرنے سے بچنے کے لیے اپنے راستے سے ہٹ جاتا ہے۔ پاس ورڈ جہاں اسے آسانی سے دیکھا اور سونگھا جا سکتا ہے۔
ہم نے اپنا ماسٹر پاس ورڈ ترتیب دے کر اس سے خود کو مطمئن کیا۔ SIXTEENPASSCHARS
، اسے ٹائپ کرنا، اور پھر فوراً، جلد ہی، اور بہت دیر بعد میموری ڈمپ لینا۔
ہم نے ایک سادہ لوا اسکرپٹ کے ساتھ ڈمپ کو تلاش کیا جو اس پاس ورڈ کے متن کے لیے ہر جگہ نظر آتا ہے، دونوں 8 بٹ ASCII فارمیٹ میں، اور 16 بٹ UTF-16 (ونڈوز وائیڈچار) فارمیٹ میں، اس طرح:
نتائج حوصلہ افزا تھے:
C:UsersduckKEYPASS> lua searchknown.lua kp2-post.dmp ڈمپ فائل میں پڑھنا... ہو گیا۔ SIXTEENPASSCHARS کو 8 بٹ ASCII کے طور پر تلاش کیا جا رہا ہے... نہیں ملا۔ SIXTEENPASSCHARS کو UTF-16 کے طور پر تلاش کیا جا رہا ہے... نہیں ملا۔
لیکن CVE-2023-32784 کے دریافت کنندہ Vdohney نے دیکھا کہ جیسے ہی آپ اپنا ماسٹر پاس ورڈ ٹائپ کرتے ہیں، KeePass آپ کو یونیکوڈ "بلاب" حروف پر مشتمل پلیس ہولڈر سٹرنگ بنا کر اور ڈسپلے کر کے آپ کو بصری تاثرات دیتا ہے پاس ورڈ:
ونڈوز پر وائیڈ چار ٹیکسٹ سٹرنگز میں (جو دو بائٹس فی کریکٹر پر مشتمل ہوتا ہے، نہ کہ صرف ایک بائٹ جیسا کہ ASCII میں)، "بلاب" کریکٹر کو ہیکس بائٹ کے طور پر RAM میں انکوڈ کیا جاتا ہے۔ 0xCF
اس کے بعد 0x25
(جو ASCII میں صرف ایک فیصد نشان ہوتا ہے)۔
لہذا، یہاں تک کہ اگر KeePass ان خام حروف کے ساتھ بہت احتیاط برت رہا ہے جو آپ ٹائپ کرتے وقت خود پاس ورڈ داخل کرتے ہیں، تو آپ کے پاس "بلاب" حروف کے بائیں سے زیادہ تار ہو سکتے ہیں، جو کہ بار بار چلنے کے طور پر میموری میں آسانی سے پہچانے جا سکتے ہیں۔ CF25CF25
or CF25CF25CF25
...
…اور، اگر ایسا ہے تو، آپ کو ملنے والے بلاب کریکٹرز کی طویل ترین دوڑ شاید آپ کے پاس ورڈ کی لمبائی کو دور کر دے گی، جو کہ پاس ورڈ کی معلومات کے رساو کی ایک معمولی شکل ہوگی، اگر کچھ نہیں تو۔
ہم نے لیفٹ اوور پاس ورڈ پلیس ہولڈر سٹرنگ کے نشانات تلاش کرنے کے لیے درج ذیل لوا اسکرپٹ کا استعمال کیا:
آؤٹ پٹ حیران کن تھا (جگہ بچانے کے لیے ہم نے ایک ہی نمبر کے بلاب کے ساتھ لگاتار لائنوں کو حذف کر دیا ہے، یا پچھلی لائن سے کم بلابز کے ساتھ):
C:UsersduckKEYPASS> lua findblobs.lua kp2-post.dmp 000EFF3C: * [۔ . .] 00BE621B: ** 00BE64C7: *** [. . .] 00BE6E8F: **** [. . .] 00BE795F: ***** [. . .] 00BE84F7: ****** [. . .] 00BE8F37: ******* [ 8 بلابس، 9 بلابس وغیرہ کے لیے اسی طرح جاری ہے۔ *** 16C00: **************** 0503C00: * 05077C00: * [ باقی تمام میچز ایک بلاب لمبے ہیں] 09337B00: *
ایک دوسرے کے قریب لیکن مسلسل بڑھتی ہوئی میموری ایڈریس پر، ہمیں 3 بلابز، پھر 4 بلابز، اور اسی طرح 16 بلابس (ہمارے پاس ورڈ کی لمبائی) کی ایک منظم فہرست ملی، جس کے بعد سنگل بلاب تاروں کی بہت سی تصادفی طور پر بکھری ہوئی مثالیں ہیں۔ .
لہذا، وہ پلیس ہولڈر "بلاب" سٹرنگز واقعی میموری میں لیک ہو رہی ہیں اور پاس ورڈ کی لمبائی کو لیک کرنے کے پیچھے رہ رہی ہیں، KeePass سافٹ ویئر کے آپ کے ماسٹر پاس ورڈ کے ساتھ ختم ہونے کے بہت بعد۔
اگلا قدم
ہم نے مزید کھودنے کا فیصلہ کیا، بالکل ویڈوہنی کی طرح۔
ہم نے بلاب حروف کی زنجیروں کا پتہ لگانے کے لیے اپنے پیٹرن مماثل کوڈ کو تبدیل کیا ہے جس کے بعد 16 بٹ فارمیٹ میں کوئی ایک ASCII کریکٹر ہے (ASCII حروف کو UTF-16 میں ان کے معمول کے 8 بٹ ASCII کوڈ کے طور پر دکھایا جاتا ہے، اس کے بعد صفر بائٹ ہوتا ہے)۔
اس بار، جگہ بچانے کے لیے، ہم نے کسی بھی میچ کے لیے آؤٹ پٹ کو دبا دیا ہے جو بالکل پچھلے میچ سے ملتا ہے:
حیرت، تعجب:
C:UsersduckKEYPASS> lua searchkp.lua kp2-post.dmp 00BE581B: *I 00BE621B: **X 00BE6BD3: ***T 00BE769B: ****E 00BE822B: *****E 00BE8C6B: ******N 00BE974B: *******P 00BEA25B: ********A 00BEAD33: *********S 00BEB81B: **********S 00BEC383: ***********C 00BECEEB: ************H 00BEDA5B: *************A 00BEE623: **************R 00BEF1A3: ***************S 03E97CF2: *N 0AA6F0AF: *W 0D8AF7C8: *X 0F27BAF8: *S
دیکھیں کہ ہم .NET کے مینیجڈ سٹرنگ میموری ریجن سے کیا حاصل کرتے ہیں!
عارضی "بلاب سٹرنگز" کا ایک قریبی گروپ جو ہمارے پاس ورڈ میں یکے بعد دیگرے حروف کو ظاہر کرتا ہے، دوسرے حرف سے شروع ہوتا ہے۔
ان لیکی سٹرنگز کے بعد وسیع پیمانے پر تقسیم شدہ واحد کریکٹر میچ ہوتے ہیں جو ہم فرض کرتے ہیں کہ اتفاق سے پیدا ہوئے ہیں۔ (ایک KeePass ڈمپ فائل کا سائز تقریباً 250MB ہے، اس لیے "بلاب" کے حروف کے لیے کافی گنجائش موجود ہے جیسے کہ قسمت سے۔)
یہاں تک کہ اگر ہم ان اضافی چار مماثلتوں کو مدنظر رکھتے ہیں، بجائے اس کے کہ ان کو ممکنہ طور پر مماثلت کے طور پر رد کر دیں، ہم اندازہ لگا سکتے ہیں کہ ماسٹر پاس ورڈ ان میں سے ایک ہے:
?XTEENPASSCHARS ?NXTEENPASSCHARS ?WXTEENPASSCHARS ?SXTEENPASSCHARS
ظاہر ہے، اس سادہ تکنیک میں پاس ورڈ میں پہلا حرف نہیں ملتا، کیونکہ پہلی "بلاب سٹرنگ" صرف اس کے بعد بنائی جاتی ہے جب پہلا حرف ٹائپ کیا جاتا ہے۔
نوٹ کریں کہ یہ فہرست اچھی اور مختصر ہے کیونکہ ہم نے ایسے میچوں کو فلٹر کیا ہے جو ASCII حروف میں ختم نہیں ہوتے تھے۔
اگر آپ مختلف رینج میں حروف تلاش کر رہے تھے، جیسے کہ چینی یا کورین حروف، تو آپ کو زیادہ حادثاتی کامیابیاں مل سکتی ہیں، کیونکہ اس پر مماثل ہونے کے لیے بہت زیادہ ممکنہ حروف موجود ہیں۔
…لیکن ہمیں شبہ ہے کہ آپ بہرحال اپنے ماسٹر پاس ورڈ کے بالکل قریب پہنچ جائیں گے، اور پاس ورڈ سے متعلق "بلاب سٹرنگز" کو RAM میں ایک ساتھ گروپ کیا گیا ہے، غالباً اس لیے کہ وہ تقریباً ایک ہی وقت میں اسی حصے کے ذریعے مختص کیے گئے تھے۔ .NET رن ٹائم۔
اور وہاں، ایک طویل اور متضاد مختصر میں، کی دلچسپ کہانی ہے۔ CVE-2023-32784.
کیا کیا جائے؟
- اگر آپ KeePass صارف ہیں تو گھبرائیں نہیں۔ اگرچہ یہ ایک بگ ہے، اور تکنیکی طور پر ایک فائدہ مند کمزوری ہے، لیکن دور دراز کے حملہ آور جو اس بگ کا استعمال کرتے ہوئے آپ کے پاس ورڈ کو کریک کرنا چاہتے ہیں انہیں پہلے آپ کے کمپیوٹر پر میلویئر لگانے کی ضرورت ہوگی۔ یہ انہیں آپ کے پاس ورڈز کو براہ راست چوری کرنے کے بہت سے دوسرے طریقے فراہم کرے گا، یہاں تک کہ اگر یہ بگ موجود نہیں ہے، مثال کے طور پر آپ کے ٹائپ کرتے وقت اپنے کی اسٹروکس کو لاگ کرکے۔ اس مقام پر، آپ آسانی سے آنے والی تازہ کاری پر نگاہ رکھ سکتے ہیں، اور تیار ہونے پر اسے پکڑ سکتے ہیں۔
- اگر آپ فل ڈسک انکرپشن استعمال نہیں کر رہے ہیں تو اسے فعال کرنے پر غور کریں۔ آپ کی سویپ فائل یا ہائبرنیشن فائل (آپریٹنگ سسٹم ڈسک فائلیں جو بھاری بوجھ کے دوران عارضی طور پر میموری کے مواد کو محفوظ کرنے کے لیے استعمال ہوتی ہیں یا جب آپ کا کمپیوٹر "سو رہا ہے") سے بچ جانے والے پاس ورڈز نکالنے کے لیے حملہ آوروں کو آپ کی ہارڈ ڈسک تک براہ راست رسائی کی ضرورت ہوگی۔ اگر آپ کے پاس بٹ لاکر یا دوسرے آپریٹنگ سسٹمز کے لیے اس کے مساوی ایکٹیویٹ ہے، تو وہ آپ کی سویپ فائل، آپ کی ہائبرنیشن فائل، یا کسی دوسرے ذاتی ڈیٹا جیسے دستاویزات، اسپریڈ شیٹس، محفوظ کردہ ای میلز وغیرہ تک رسائی حاصل نہیں کر سکیں گے۔
- اگر آپ پروگرامر ہیں تو اپنے آپ کو میموری کے انتظام کے مسائل کے بارے میں آگاہ رکھیں۔ یہ مت سمجھو کہ ہر
free()
اس سے مطابقت رکھتا ہے۔malloc()
کہ آپ کا ڈیٹا محفوظ اور اچھی طرح سے منظم ہے۔ بعض اوقات، آپ کو خفیہ ڈیٹا کے ارد گرد پڑے رہنے سے بچنے کے لیے اضافی احتیاطی تدابیر اختیار کرنے کی ضرورت پڑ سکتی ہے، اور وہ احتیاطی تدابیر آپریٹنگ سسٹم سے لے کر آپریٹنگ سسٹم تک۔ - اگر آپ QA ٹیسٹر یا کوڈ کا جائزہ لینے والے ہیں، تو ہمیشہ "پردے کے پیچھے" سوچیں۔ یہاں تک کہ اگر میموری مینجمنٹ کوڈ صاف ستھرا اور متوازن نظر آتا ہے، تو اس بات سے آگاہ رہیں کہ پردے کے پیچھے کیا ہو رہا ہے (کیونکہ اصل پروگرامر کو ایسا کرنا معلوم نہیں ہو سکتا ہے)، اور رن ٹائم مانیٹرنگ اور میموری جیسے کچھ پینٹسٹنگ طرز کے کام کرنے کے لیے تیار ہو جائیں۔ اس بات کی تصدیق کرنے کے لیے کہ محفوظ کوڈ واقعی ایسا ہی برتاؤ کر رہا ہے جیسا کہ اسے سمجھا جاتا ہے۔
آرٹیکل سے کوڈ: UNL1.C
#شامل #شامل #شامل void hexdump(غیر دستخط شدہ char* buff, int len) { // پرنٹ بفر 16 بائٹ کے ٹکڑوں میں برائے (int i = 0; i < len+16; i = i+16) { printf("%016X: ",buff +i) // (int j = 16; j <0; j = j+16) { printf("%1X",buff[i+j]) کے لیے 02 بائٹس کو ہیکس ویلیو کے بطور دکھائیں۔ } // ان 16 بائٹس کو حروف کے طور پر دہرائیں (int j = 0; j < 16; j = j+1) { unsigned ch = buff[i+j]؛ printf("%c"،(ch>=32 && ch<=127)?ch:'.'); } printf("n")؛ } printf("n")؛ } int main(void) { // پاس ورڈ ذخیرہ کرنے کے لیے میموری حاصل کریں، اور ظاہر کریں کہ // بفر میں کیا ہے جب یہ باضابطہ طور پر "نیا" ہو... char* buff = malloc(128); printf("شروع میں 'نیا' بفر ڈمپنگ")؛ ہیکس ڈمپ (بف، 128)؛ // pseudorandom بفر ایڈریس کو random seed srand((غیر دستخط شدہ)بف کے طور پر استعمال کریں؛ // کچھ فکسڈ، قابل تلاش ٹیکسٹ strcpy(buff,"unlikelytext") کے ساتھ پاس ورڈ شروع کریں۔ // (int i = 16; i <= 1; i++) { // A (16+65) سے P (0+65) چار ch = 15 + کے لئے ایک وقت میں 65 سیوڈورنڈم حروف شامل کریں (رینڈ() اور 15)؛ // پھر اس جگہ پر بف سٹرنگ میں ترمیم کریں strncat(buff,&ch,1); } // مکمل پاس ورڈ اب میموری میں ہے، لہذا پرنٹ کریں // اسے سٹرنگ کے طور پر، اور پورا بفر دکھائیں... printf("Full string was: %sn", buff); ہیکس ڈمپ (بف، 128)؛ // ابھی پراسیس RAM کو ڈمپ کرنے کے لیے موقوف کریں (کوشش کریں: 'procdump -ma') ڈالتا ہے ("بفر کو فری کرنے کے لیے [ENTER] کا انتظار کر رہا ہے...")؛ getchar()؛ // رسمی طور پر مفت() میموری اور بفر دکھائیں // دوبارہ دیکھیں کہ آیا کچھ پیچھے رہ گیا ہے... free(buff); printf("مفت کے بعد بفر ڈمپنگ()n")؛ ہیکس ڈمپ (بف، 128)؛ // اختلافات کا معائنہ کرنے کے لیے دوبارہ رام ڈمپ کرنے کے لیے روک دیں getchar()؛ واپسی 0؛ }
آرٹیکل سے کوڈ: UNL2.C
#شامل #شامل #شامل #شامل void hexdump(غیر دستخط شدہ char* buff, int len) { // پرنٹ بفر 16 بائٹ کے ٹکڑوں میں برائے (int i = 0; i < len+16; i = i+16) { printf("%016X: ",buff +i) // (int j = 16; j <0; j = j+16) { printf("%1X",buff[i+j]) کے لیے 02 بائٹس کو ہیکس ویلیو کے بطور دکھائیں۔ } // ان 16 بائٹس کو حروف کے طور پر دہرائیں (int j = 0; j < 16; j = j+1) { unsigned ch = buff[i+j]؛ printf("%c"،(ch>=32 && ch<=127)?ch:'.'); } printf("n")؛ } printf("n")؛ } int main(void) { // پاس ورڈ کو ذخیرہ کرنے کے لیے میموری حاصل کریں، اور ظاہر کریں کہ // بفر میں کیا ہے جب یہ باضابطہ طور پر "نیا" ہو... char* buff = VirtualAlloc(0,128,MEM_COMMIT,PAGE_READWRITE); printf("شروع میں 'نیا' بفر ڈمپنگ")؛ ہیکس ڈمپ (بف، 128)؛ // pseudorandom بفر ایڈریس کو random seed srand((غیر دستخط شدہ)بف کے طور پر استعمال کریں؛ // کچھ فکسڈ، قابل تلاش ٹیکسٹ strcpy(buff,"unlikelytext") کے ساتھ پاس ورڈ شروع کریں۔ // (int i = 16; i <= 1; i++) { // A (16+65) سے P (0+65) چار ch = 15 + کے لئے ایک وقت میں 65 سیوڈورنڈم حروف شامل کریں (رینڈ() اور 15)؛ // پھر اس جگہ پر بف سٹرنگ میں ترمیم کریں strncat(buff,&ch,1); } // مکمل پاس ورڈ اب میموری میں ہے، لہذا پرنٹ کریں // اسے سٹرنگ کے طور پر، اور پورا بفر دکھائیں... printf("Full string was: %sn", buff); ہیکس ڈمپ (بف، 128)؛ // ابھی پراسیس RAM کو ڈمپ کرنے کے لیے روکیں (کوشش کریں: 'procdump -ma') puts("Witing for [ENTER] to free buffer..."); getchar(); // رسمی طور پر مفت() میموری اور بفر دکھائیں // دوبارہ دیکھیں کہ آیا کچھ پیچھے رہ گیا ہے یا نہیں... VirtualFree(buff,0,MEM_RELEASE); printf("مفت کے بعد بفر ڈمپنگ()n")؛ ہیکس ڈمپ (بف، 128)؛ // اختلافات کا معائنہ کرنے کے لیے دوبارہ RAM کو ڈمپ کرنے کے لیے روک دیں("مین سے باہر نکلنے کے لیے [ENTER] کا انتظار ہے()..." getchar()؛ واپسی 0؛ }
آرٹیکل سے کوڈ: S1.LUA
-- کچھ مقررہ، تلاش کے قابل متن کے ساتھ شروع کریں s = 'unlikelytext' -- i = 16 do s = s .. string.char(1,16+math.random( 65)) اینڈ پرنٹ ('مکمل اسٹرنگ یہ ہے:',s,'n') -- ڈمپ کرنے کے عمل کو روکیں RAM پرنٹ ('سٹرنگ کو آزاد کرنے سے پہلے [ENTER] کا انتظار ہے...') io.read() - - سٹرنگ کو صاف کریں اور متغیر کو غیر استعمال شدہ s = nil پر نشان زد کریں -- diffs پرنٹ تلاش کرنے کے لیے دوبارہ RAM کو ڈمپ کریں
آرٹیکل سے کوڈ: INDIT.LUA
-- ڈمپ فائل میں پڑھیں لوکل f = io.open(arg[1],'rb'):read('*a') -- مارکر ٹیکسٹ تلاش کریں جس کے بعد ایک -- یا زیادہ بے ترتیب ASCII حروف مقامی b,e ,m = 0,0,nil while true do -- اگلا میچ تلاش کریں اور یاد رکھیں آفسیٹ b,e,m = f:find('(unlikelytext[AZ]+)',e+1) -- باہر نکلیں جب مزید نہ ہو مماثل اگر b نہیں تو بریک اینڈ -- رپورٹ پوزیشن اور سٹرنگ ملا پرنٹ(string.format('%08X: %s',b,m)) end
آرٹیکل سے کوڈ: SEARCHKNOWN.LUA
io.write('ڈمپ فائل میں پڑھنا...') local f = io.open(arg[1],'rb'):read('*a') io.write('DONE.n') io۔ لکھیں('SIXTEENPASSCHARS کو 8-bit ASCII کے طور پر تلاش کرنا...') local p08 = f:find('SIXTEENPASSCHARS') io.write(p08 اور 'FOUND' یا 'نہیں ملا','.n') io.write ('SIXTEENPASSCHARS کو UTF-16 کے طور پر تلاش کیا جا رہا ہے...') local p16 = f:find('Sx00Ix00Xx00Tx00Ex00Ex00Nx00Px00'.. 'Ax00Sx00Sx00Cx00Hx00Ax00Sx00Cx00Hx16AxXNUMXRi' اور'XNUMXpXNUMXRxio. ' یا 'نہیں ملا'،'.n')
آرٹیکل سے کوڈ: FindBLOBS.LUA
-- کمانڈ لائن لوکل f = io.open(arg[1],'rb') پر متعین کردہ ڈمپ فائل میں پڑھیں:read('*a') -- ایک یا زیادہ پاس ورڈ بلاب تلاش کریں، اس کے بعد کوئی بھی نان بلاب ہو۔ -- نوٹ کریں کہ بلاب چارس (●) ونڈوز وائڈ چارس میں انکوڈ ہوتے ہیں -- بطور لٹ اینڈین UTF-16 کوڈز، ہیکس میں CF 25 کے طور پر آتے ہیں۔ local b,e,m = 0,0,nil while true do -- ہم ایک یا زیادہ بلاب چاہتے ہیں، اس کے بعد کوئی بھی نان بلاب ہو۔ -- ہم ایک واضح CF25 تلاش کر کے کوڈ کو آسان بناتے ہیں -- اس کے بعد کوئی بھی سٹرنگ جس میں صرف CF یا 25 ہو، -- تو ہمیں CF25CFCF یا CF2525CF کے ساتھ ساتھ CF25CF25 بھی ملے گا۔ -- اگر کوئی ہے تو ہم بعد میں "غلط مثبت" کو فلٹر کریں گے۔ -- ہمیں x25 کی بجائے '%%' لکھنے کی ضرورت ہے کیونکہ x25 -- کردار (فیصد کا نشان) Lua میں ایک خاص سرچ چار ہے! b,e,m = f:find('(xCF%%[xCF%%]*)',e+1) -- باہر نکلیں جب مزید میچ نہ ہوں اگر b نہیں تو بریک اینڈ -- CMD.EXE پرنٹ نہیں کر سکتا بلاب، تو ہم انہیں ستاروں میں تبدیل کرتے ہیں۔ پرنٹ(string.format('%08X: %s',b,m:gsub('xCF%%','*'))) اختتام
مضمون سے کوڈ: SEARCHKP.LUA
-- کمانڈ لائن لوکل f = io.open(arg[1],'rb') پر بتائی گئی ڈمپ فائل میں پڑھیں: read('*a') لوکل b,e,m,p = 0,0,nil,nil جبکہ سچ کرتے ہیں -- اب، ہم چاہتے ہیں کہ ایک یا زیادہ بلابز (CF25) اس کے بعد کوڈ -- A..Z کے بعد 0 بائٹ کے بعد ACSCII کو UTF-16 b,e,m = f:find(' میں تبدیل کریں۔ ستارے -- جگہ بچانے کے لیے ہم لگاتار میچوں کو دبا دیتے ہیں اگر m ~= p پھر پرنٹ کریں(string.format('%00X: %s',b,m:gsub('xCF%%','*'))) p = m آخر اختتام
- SEO سے چلنے والا مواد اور PR کی تقسیم۔ آج ہی بڑھا دیں۔
- پلیٹوآئ اسٹریم۔ ویب 3 ڈیٹا انٹیلی جنس۔ علم میں اضافہ۔ یہاں تک رسائی حاصل کریں۔
- ایڈریین ایشلے کے ساتھ مستقبل کا نقشہ بنانا۔ یہاں تک رسائی حاصل کریں۔
- PREIPO® کے ساتھ PRE-IPO کمپنیوں میں حصص خریدیں اور بیچیں۔ یہاں تک رسائی حاصل کریں۔
- ماخذ: https://nakedsecurity.sophos.com/2023/05/31/serious-security-that-keepass-master-password-crack-and-what-we-can-learn-from-it/
- : ہے
- : ہے
- : نہیں
- :کہاں
- ][p
- $UP
- 1
- 10
- 12
- 15٪
- 20
- 200
- 2023
- 24
- 250
- 27
- 31
- 3d
- 49
- 50
- 67
- 70
- 72
- 77
- 8
- 9
- a
- قابلیت
- ہمارے بارے میں
- اوپر
- مطلق
- AC
- تک رسائی حاصل
- اکاؤنٹ
- حاصل
- حاصل کرنا
- فعال
- اصل
- اصل میں
- شامل کیا
- ایڈیشنل
- پتہ
- پتے
- جوڑتا ہے
- کے بعد
- بعد
- پھر
- تمام
- مختص
- مختص کرتا ہے
- تین ہلاک
- تین ہلاک
- کی اجازت
- اکیلے
- ساتھ
- پہلے ہی
- بھی
- تبدیل
- اگرچہ
- ہمیشہ
- an
- اور
- اینڈریو
- جواب
- کوئی بھی
- کچھ
- کچھ بھی اہم
- ظاہر
- شائع ہوا
- نقطہ نظر
- کی منظوری دے دی
- کیا
- ارد گرد
- مضمون
- مضامین
- AS
- At
- مصنف
- آٹو
- خودکار
- خود کار طریقے سے
- دستیاب
- سے اجتناب
- سے بچا
- آگاہ
- دور
- واپس
- پس منظر
- پس منظر کی تصویر
- BE
- کیونکہ
- ہو جاتا ہے
- رہا
- اس سے پہلے
- شروع
- پیچھے
- پردے کے پیچھے
- نیچے
- بہتر
- بٹ
- بلاک
- بلاکس
- سرحد
- دونوں
- پایان
- برانڈ
- نئے برانڈ
- توڑ
- مختصر
- لانے
- بفر
- بفر اوور فلو
- بگ کی اطلاع دیں
- کیڑوں
- تعمیر
- لیکن
- by
- C ++
- فون
- بلا
- کر سکتے ہیں
- حاصل کر سکتے ہیں
- پرواہ
- کیس
- پکڑے
- CD
- سینٹر
- یقینی طور پر
- زنجیروں
- موقع
- تبدیل کر دیا گیا
- کردار
- حروف
- جانچ پڑتال
- چیک
- چینی
- میں سے انتخاب کریں
- واضح
- واضح طور پر
- کلوز
- کوڈ
- رنگ
- COM
- آتا ہے
- آنے والے
- تبصرہ
- تبصروں
- کامن
- مکمل
- پیچیدہ
- کمپیوٹر
- غور کریں
- کافی
- سمجھا
- پر مشتمل ہے
- تعمیر
- مواد
- مندرجات
- مسلسل
- جاری ہے
- کنٹرول
- تبدیل
- کاپی رائٹ
- اسی کے مطابق
- سکتا ہے
- احاطہ
- ٹوٹنا
- تخلیق
- بنائی
- خالق
- اہم
- سائبر سیکیورٹی
- خطرے
- خطرناک
- اعداد و شمار
- ڈیٹا رساو
- دن
- نمٹنے کے
- فیصلہ کیا
- وقف
- بیان کیا
- DID
- اختلافات
- مختلف
- مشکلات
- ڈی آئی جی
- ڈیجیٹل
- براہ راست
- براہ راست رسائی
- براہ راست
- دکھائیں
- دکھانا
- ہے
- do
- دستاویزات
- کرتا
- نہیں کرتا
- کر
- کیا
- نہیں
- نیچے
- ڈرائیو
- دو
- پھینک
- کے دوران
- e
- ہر ایک
- اس سے قبل
- آسانی سے
- ماحول
- یا تو
- اور
- ای میل
- کو فعال کرنا
- حوصلہ افزا
- خفیہ کاری
- آخر
- ختم ہو جاتا ہے
- کافی
- کو یقینی بنانے کے
- کو یقینی بنانے ہے
- درج
- اندر
- پوری
- اندراج
- ماحولیات
- مساوی
- خرابی
- بنیادی طور پر
- اندازے کے مطابق
- وغیرہ
- Ether (ETH)
- بھی
- آخر میں
- مسلسل بڑھتی ہوئی
- ہر کوئی
- سب کچھ
- بالکل
- مثال کے طور پر
- اس کے علاوہ
- حوصلہ افزائی
- پھانسی
- وجود
- موجودہ
- باہر نکلیں
- باہر نکلنا
- توقع ہے
- وضاحت
- دھماکہ
- ظاہر
- توسیع
- اضافی
- نکالنے
- حقیقت یہ ہے
- جھوٹی
- دلچسپ
- خصوصیات
- آراء
- کم
- لڑ
- فائل
- فائلوں
- فلٹر
- فائنل
- آخر
- مل
- تلاش
- پتہ ہے
- آخر
- پہلا
- مقرر
- توجہ مرکوز
- پیچھے پیچھے
- کے بعد
- کے لئے
- فارم
- باضابطہ طور پر
- فارمیٹ
- آئندہ
- ملا
- چار
- مفت
- سے
- مکمل
- مکمل طور پر
- تقریب
- افعال
- مزید
- مستقبل
- پیدا ہوتا ہے
- نسل
- حاصل
- حاصل کرنے
- GitHub کے
- دے دو
- دی
- فراہم کرتا ہے
- دے
- Go
- جاتا ہے
- جا
- اچھا
- حکومت
- قبضہ
- عظیم
- اس بات کی ضمانت
- تھا
- ہینڈل
- ہوا
- ہو رہا ہے۔
- ہوتا ہے
- ہارڈ
- ہے
- ہونے
- سر درد
- بھاری
- اونچائی
- یہاں
- ہیکس
- اعلی سطحی
- اعلی
- مشاہدات
- پکڑو
- چھید
- امید ہے کہ
- HOURS
- ہور
- کس طرح
- کیسے
- HTTPS
- شکار
- i
- شناخت
- if
- فوری طور پر
- اہم
- in
- شامل ہیں
- سمیت
- معلومات
- مطلع
- کے بجائے
- دلچسپی
- انٹرمیڈیٹ
- انٹرنیٹ
- میں
- مسائل
- IT
- میں
- خود
- شبدجال
- جون
- صرف
- صرف ایک
- رکھیں
- کلیدی
- جان
- جانا جاتا ہے
- کوریا
- زبان
- زبانیں
- لیپ ٹاپ
- آخری
- بعد
- قیادت
- لیڈز
- لیک
- لیک
- جانیں
- سیکھنے
- کم سے کم
- چھوڑ کر
- چھوڑ دیا
- لمبائی
- خط
- لائبریری
- زندگی
- کی طرح
- امکان
- لمیٹڈ
- لائن
- لائنوں
- لسٹ
- فہرست
- ll
- لوڈ
- مقامی
- محل وقوع
- لاگ ان
- لانگ
- طویل مدتی
- اب
- دیکھو
- کی طرح دیکھو
- دیکھا
- تلاش
- دیکھنا
- بہت
- قسمت
- برقرار رکھتا ہے
- بنا
- میلویئر
- انتظام
- میں کامیاب
- انتظام
- مینیجر
- انتظام کرتا ہے
- ہیرا پھیری
- بہت سے
- مارجن
- نشان
- مارکر
- ماسٹر
- میچ
- کے ملاپ
- زیادہ سے زیادہ چوڑائی
- مئی..
- کا مطلب ہے کہ
- یاد داشت
- ذکر کیا
- مائیکروسافٹ
- شاید
- منٹ
- معمولی
- نظر ثانی کی
- نظر ثانی کرنے
- لمحہ
- نگرانی
- زیادہ
- سب سے زیادہ
- بہت
- ایک سے زیادہ
- Neat
- ضرورت ہے
- ضرورت
- خالص
- کبھی نہیں
- پھر بھی
- نئی
- خبر
- اگلے
- اچھا
- نہیں
- عام
- کچھ بھی نہیں
- نوٹس..
- اب
- تعداد
- تعداد
- اعتراض
- واضح
- of
- بند
- سرکاری
- سرکاری طور پر
- آفسیٹ
- پرانا
- on
- ایک بار
- ایک
- صرف
- اوپن سورس
- کام
- آپریٹنگ سسٹم
- آپریٹنگ سسٹم
- آپریٹر
- اختیار
- or
- حکم
- اصل
- دیگر
- دیگر
- دوسری صورت میں
- ہمارے
- خود
- باہر
- پیداوار
- پر
- مجموعی طور پر
- خود
- صفحہ
- خوف و ہراس
- حصہ
- پاس ورڈ
- پاس ورڈ مینیجر
- پاس ورڈز
- راستہ
- پاٹرن
- پال
- روکنے
- ادا
- فیصد
- شاید
- مدت
- مستقل طور پر
- ذاتی
- ذاتی مواد
- جسمانی
- تصویر
- ٹکڑے ٹکڑے
- مقام
- پلیس ہولڈر
- طاعون
- پلاٹا
- افلاطون ڈیٹا انٹیلی جنس
- پلیٹو ڈیٹا
- کافی مقدار
- پوائنٹ
- پوائنٹس
- مقبول
- پوزیشن
- ممکن
- مراسلات
- ممکنہ
- ٹھیک ہے
- حال (-)
- خوبصورت
- کی روک تھام
- پچھلا
- قیمت
- پرنٹ
- پرنٹس
- شاید
- مسائل
- عمل
- پروگرام
- پروگرامر
- پروگرامر
- پروگرامنگ
- پروگرام
- تلفظ
- ڈال
- ازگر
- سوال و جواب
- سوال
- اٹھاتا ہے
- RAM
- بے ترتیب
- رینج
- بلکہ
- خام
- خام ڈیٹا
- RE
- پہنچ گئی
- پڑھیں
- پڑھنا
- تیار
- اصلی
- حقیقی زندگی
- اصل وقت
- واقعی
- تسلیم کریں
- بازیافت
- بحالی
- متعلقہ
- باقی
- یاد
- ریموٹ
- ہٹا
- دوبارہ
- بار بار
- بار بار
- رپورٹ
- نمائندگی
- احترام
- بالترتیب
- باقی
- نتائج کی نمائش
- واپسی
- واپس لوٹنے
- ظاہر
- چھٹکارا
- ٹھیک ہے
- رسک
- خطرات
- کمرہ
- رن
- چل رہا ہے
- رن ٹائم نگرانی
- s
- محفوظ
- محفوظ
- اسی
- مطمئن
- محفوظ کریں
- یہ کہہ
- اسکین
- بکھرے ہوئے
- مناظر
- تلاش کریں
- تلاش
- دوسری
- سیکنڈ
- خفیہ
- سیکشن
- محفوظ بنانے
- سیکورٹی
- دیکھنا
- بیج
- دیکھ کر
- لگتا ہے
- دیکھا
- دیکھتا
- سیریز
- سنگین
- مقرر
- قائم کرنے
- مختصر
- جلد ہی
- ہونا چاہئے
- دکھائیں
- دکھایا گیا
- سائن ان کریں
- نشانیاں
- اسی طرح
- اسی طرح
- سادہ
- آسان
- آسان بنانے
- صرف
- ایک
- سائز
- سو
- چھوٹے
- ڈرپوک
- snooping
- So
- سافٹ ویئر کی
- ٹھوس
- کچھ
- کچھ
- اسی طرح
- ماخذ
- ماخذ کوڈ
- خلا
- خصوصی
- خاص طور پر
- مخصوص
- تیزی
- ستارے
- شروع کریں
- شروع
- شروع
- شروع ہوتا ہے
- شروع
- ابھی تک
- چرا لیا
- بند کرو
- بند کر دیا
- ذخیرہ
- ذخیرہ
- کہانی
- سلک
- مضبوط
- مطالعہ
- کامیابی کے ساتھ
- اس طرح
- کافی
- سمجھا
- حیرت
- حیران کن
- حیرت انگیز
- زندہ
- SVG
- تبادلہ
- کے نظام
- سسٹمز
- لے لو
- لیا
- لیتا ہے
- لینے
- بات کر
- تکنیکی طور پر
- تکنیک
- عارضی
- ٹیسٹ
- ٹیسٹ
- سے
- کہ
- ۔
- ماخذ
- ان
- ان
- خود
- تو
- نظریہ
- وہاں.
- لہذا
- وہ
- بات
- لگتا ہے کہ
- اس
- ان
- اگرچہ؟
- سوچا
- وقت
- عنوان
- کرنے کے لئے
- مل کر
- لیا
- کے آلے
- سب سے اوپر
- ٹریک
- ٹریکنگ
- منتقلی
- شفاف
- سچ
- کوشش
- تبدیل کر دیا
- دو
- قسم
- عام طور پر
- سمجھ
- یونیکوڈ
- جب تک
- غیر استعمال شدہ
- ناپسندیدہ
- اپ ڈیٹ کریں
- اپ ڈیٹ
- URL
- us
- امریکی حکومت
- استعمال
- USB
- استعمال کی شرائط
- استعمال کے بعد مفت
- استعمال کیا جاتا ہے
- رکن کا
- استعمال
- کا استعمال کرتے ہوئے
- کی افادیت
- قیمت
- اقدار
- مختلف اقسام کے
- اس بات کی تصدیق
- ورژن
- بہت
- کی طرف سے
- خطرے کا سامنا
- W
- انتظار
- انتظار کر رہا ہے
- چاہتے ہیں
- چاہتے تھے
- تھا
- دیکھیئے
- راستہ..
- طریقوں
- we
- مہینے
- اچھا ہے
- تھے
- کیا
- جب
- چاہے
- جس
- جبکہ
- ڈبلیو
- جو بھی
- پوری
- کیوں
- گے
- جیت
- کھڑکیاں
- مسح
- ساتھ
- بغیر
- سوچ
- الفاظ
- کام
- کام کیا
- کام کر
- کام کرتا ہے
- فکر
- گا
- دوں گا
- لکھنا
- تحریری طور پر
- لکھا
- ابھی
- آپ
- اور
- اپنے آپ کو
- زیفیرنیٹ
- صفر