در بخش کامنت های مطلب نقدی بر برنامه بی بی سی در مورد جریان انتشار سه میلیون کارت اعتباری ، همایون گفته بود که:
درود. کارهای آماری جالبی میشه با دادهها انجام داد. به عنوان مثال احتمال این که آدمها تاریخ تولدشون رو به عنوان رمز انتخاب کنن بالاست. به دنبال ۱۳۶ بگردبن در فهرست رمزها و مقایسهاش کنین با هر عدد ۳ رقمی دیگهای. (۱۳۷ و ۱۳۵ و ۱۳۴ هم تعدادشون بالاست). من اگه دنبال دزدی بودم از اینجا شروع میکردم.
خب ایده بسیار جالبیه و من هم امروز یک ساعتی وقت اضافی دارم برای دستگرمی لینوکس و برنامه نویسی و نوشتن یک مطلب در مورد چرا لینوکس رو دوست دارم و همینطور دادن فرصت به کسانی که می خوان مهارت های عملی خودشون توی خط فرمان رو بالا ببرن و مثل یک هکر، به ابزارشون مسط باشن.
اگر شما علاقه ای به خط فرمان یا حوصله اش رو ندارین و فقط نتیجه کار رو می خواین… سریع اسکرول کنین پایین تا برسین به نمودارهای آخر (:
اگر هنوز با من هستین بگم که اینکارها دقیقا به همین ترتیب انجام شدن و مطمئنا روش های بهتری دارن…. در اصل شما دارین چرک نویس رو می خونین تا ببینین قدم ها چطوری برداشته شدن.
در قدم اول همه صفحات بانک تجارت رو باز می کنم، با ctrl+A متنشون رو کپی می کنم و توی یک ادیتور متنی paste می کنم. من توی لینوکس برای اینکار از gedit استفاده کردم که ادیتور ساده و دم دستی گنوم است… مشخصه که اگر توی ویندوز بودم خود این یک ماجرا بود که کدوم ادیتور ممکنه بتونه این پیست رو قبول کنه و آخ نگه.
به خاطر کپی پیست من فقط متن های توی صفحه ها رو دارم… چیزهایی مثل این:
با یک دستور تمام خط هایی که توشون + هست رو جدا می کنیم. اینها خط های حاوی پسورد هستن:
grep "+" all_tejarat.txt > only_hesab_and_pass
اوه اوه! شد این:
و ادیتور توی باز کردنش یک آخ ملایمی گفت (سی ثانیه ای طول کشید تا باز بشه) چون دوستمون حتی یک انتر هم نزده و در نتیجه با خطوطی طرف هستیم که یک میلیون کاراکتر در هر خط نوشته شده (: قاعده طبق گفته خودش اینه:
رمز مخفي , شماره کارت + رمز مخفي , شماره کارت + رمز مخفي , شماره
پس من برای راحت کردن کارم، همه + ها رو تبدیل می کنم به سر خط:
jadi@jubung:~/Desktop$ sed -e "s/\s+[+]*\s*/\n/g" only_hesab_and_pass > har_password_yek_khat jadi@jubung:~/Desktop$ head har_password_yek_khat رمز مخفي , شماره کارت رمز مخفي , شماره کارت رمز مخفي , شماره کارت 6273531000000002,73251531609013 6273531000000087,42984601252954 6273531000000105,90683196772477 6273531000000145,14810051866743 6273531000000146,61558146155078 6273531000000150,14869351127492 6273531000000151,87078051710776 6273531000000201,17221491685028 6273531000000222,32833487680537 6273531000000232,06865382135692 6273531000000232,69595659033276
راستش درست نفهمیدم چی شد! درست کار نکرد ولی بد هم نبود… حالا یک قدم دیگه باید تیکه تیکه کنم این فایل رو. فاصله ها رو به سر خط تبدیل می کنم (:
jadi@jubung:~/Desktop$ sed -e "s/ /\n/g" har_password_yek_khat > har_password_yek_khat_2 jadi@jubung:~/Desktop$ head -20 har_password_yek_khat_2 رمز مخفي , شماره کارت رمز مخفي , شماره کارت رمز مخفي , شماره کارت 6273531000000002,73251531609013 6273531000000087,42984601252954 6273531000000105,90683196772477 6273531000000145,14810051866743 6273531000000146,61558146155078
و حالا همه چیز مرتبه. فقط باید پسوردها رو جدا کنم. خط هایی که توشون , هست رو جدا می کنم و می دم به یک دستور دیگه که در هر خط، اعداد اول خط تا رسیدن به کاما رو حذف می کنه. پس می مونه فقط پسوردها. می تونین نگاه کنین که چطوری با | خروجی یک دستور رو دادم هب ورودی دستور بعدی:
jadi@jubung:~/Desktop$ grep ".," har_password_yek_khat_2 | sed "s/^.*,//" > all_passwords jadi@jubung:~/Desktop$ head all_passwords 73251531609013 42984601252954 90683196772477 14810051866743 61558146155078 14869351127492 87078051710776 17221491685028 32833487680537 06865382135692
حله (: ببینیم چند تا پسورد داریم:
jadi@jubung:~/Desktop$ wc -l all_passwords 118499 all_passwords
صد و هجده هزار عدد چهارده رقمی داریم که پسوردها توشونه. حالا می ریم سراغ بررسی نظریه اصلی:
مردم احتمالا سال تولدشون رو به عنوان پسورد می ذارن.
پس ما کافیه در این اعداد که داریم پراکندگی های مختلف عددهای چهاررقمی رو پیدا کنیم و ازشون یک نمودار بکشیم. برای اینکار یک برنامه کوچیک می نویسم. البته اصطلاحی هست که می گه برنامه بزرگی که کار می کنه روزگاری برنامه کوچیکی بوده که کار می کرده. با همین ایده اول یک برنامه کوچیک می نویسم و چکش می کنم:
#!/usr/bin/perl while ($userinput =) { chomp ($userinput); for($i = 0; $i <= 10 ; $i++) { print substr $userinput, $i, 4; print "\n"; } }
این برنامه ورودی رو می خونه و قسمت های چهار رقمی رو ازش جدا می کنه:
jadi@jubung:~/Desktop$ echo "73251531609013" | ./find_numbers.pl 7325 3251 2515 5153 1531 5316 3160 1609 6090 0901 9013
درست کار می کنه پس برنامه رو کامل می کنم:
#!/usr/bin/perl @passes = (); for($i = 0; $i <= 9999 ; $i++) { $passes[$i] = 0; } while ($userinput =) { chomp ($userinput); for($i = 0; $i <= 10 ; $i++) { $thispass = substr $userinput, $i, 4; $passes[$thispass] += 1; } } for($i = 0; $i <= 9999 ; $i++) { print $i, ",",$passes[$i],"\n"; }
این برنامه همه ورودی رو می خونه و از هر خط همه پسوردهای محتمل رو خارج می کنه و می شمره و می ره سراغ خط بعدی و در نهایت می گه هر عدد چند بار ممکن بوده به عنوان پسورد انتخاب شده باشه. بعد از اجرا خروجی اش چیزی شبیه اینه:
jadi@jubung:~/Desktop$ cat all_passwords | ./find_numbers.pl > all_passwords_charts jadi@jubung:~/Desktop$ head all_passwords_charts 0,163 1,150 2,135 3,122 4,137 5,141 6,123 7,138 8,122 9,133
حالا که اینها رو داریم کافیه بریم سراغ برنامه LibreOffice برای کشیدن نمودارها. مثلا این نمودار اول است:
دیده می شه که یک جاهایی پیک داریم. بذارین یک سورت هم بکنم به ترتیب فراوانی و یک نمودار دیگه از صد تا از پرکاربردترین ها بکشیم ببینیم چی در می یاد.
اوه! نظریه دوستمون تقویت شد: مردم از سال تولد برای پسوردها استفاده می کنن (: واضح بود ولی خب از این بازی لذت بردیم و تازه یک نظریه رو هم هرچند کم، تقویت کردیم. همینطوره ترکیب های «خوش دست» روی کیبورد (:
نظرتون چیه برای اختتامیه یک آمار هم بگیریم از تعداد ارقام؟ مشخصه که یک تغییر کوچیک در برنامه است فقط:
#!/usr/bin/perl @passes = (); for($i = 0; $i <= 9 ; $i++) { $passes[$i] = 0; } while ($userinput =) { chomp ($userinput); for($i = 0; $i <= 13 ; $i++) { $thispass = substr $userinput, $i, 1; $passes[$thispass] += 1; } } for($i = 0; $i <= 9 ; $i++) { print $i, ",",$passes[$i],"\n"; }
و نتیجه:
jadi@jubung:~/Desktop$ cat all_passwords | ./find_numbers.pl > all_digits jadi@jubung:~/Desktop$ cat all_digits 0,157054 1,180318 2,169604 3,175258 4,166898 5,169252 6,162562 7,158727 8,160099 9,159214
هاه.. می بینین که احتمال استفاده از ۷ و ۹ پایینه (این رو قبلا هم شنیده بودم) و احتمالا استفاده از یک و سه بالا (: توجه داریم که در صورت درست بودن الگوریتم اعداد رندم استفاده شده برای «مخفی کردن» پسوردها، یک نویز سفید اون پایین داریم که احتمالا مساوی پخش شده.