چالش جرم‌شناسی اول - با من بخوان!

توضیحات

با من بخوان تا به تو بگویم چقدر علم فارنزیک ظریف است! پرونده‌ی مربوط به این سوال را از اینجا بارگیری کنید.

حل چالش

گام اول

پس از بارگیری فایل در اولین گام باید نوع آن را تشخیص داد. به همین دلیل در ترمنیال دستور زیر را وارد می‌کنیم:

$ file bamanbekhan
bamanbekhan: data

خروجی این دستور نوع خاصی از پرونده را نشان نمی‌دهد و هم‌چنین دستور strings نیز داده قابل توجهی ندارد!

گام دوم

بررسی سرآیند (Header) پرونده‌ها گام بعدی حل این سوال است. از برنامه‌ی binwalk استفاده می‌کنیم.
خروجی این دستور همان‌طور که در ادامه مشخص شده است، نشان می‌دهد که که یک فایل سیستم از نوع Squash در این پرونده وجود دارد که آدرس شروع آن از بایت ۴۰ است.
برای آشنایی با فایل سیستم SquashFS به صفحه‌ی ویکی‌پدیا آن مراجعه کنید.
‍‍‍

$ binwalk bamanbekhan

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
40            0x28            Squashfs filesystem, little endian, version 4.0, compression:gzip, size: 15633389 bytes, 2 inodes, blocksize: 131072 bytes, created: 2020-09-07 12:10:27

گام سوم

در گام سوم فایل سیستم را از پرونده‌ی فایل استخراج می‌کنیم. برای این کار از دستور زیر استفاده می‌کنیم که تمام فایل را می‌خواند و فقط ۴۰ بایت اول را حذف می‌کند. روش دیگر برای چنین کاری این است که فایل را در یک ویرایش‌گر hex مانند ghex باز کنید و سپس ۴۰ بایت را انتخاب و حذف کنید.

$ dd if=bamanbekhan of=file.squashfs skip=40 bs=1
15634432+0 records in
15634432+0 records out
15634432 bytes transferred in 54.580951 secs (286445 bytes/sec)

پس از این کار با بررسی مجدد دستور فایل مطمئن می‌شویم که فایل درستی داریم:

$ file file.squashfs
file.squashfs: Squashfs filesystem, little endian, version 4.0, 15633389 bytes, 2 inodes, blocksize: 131072 bytes, created: Mon Sep  7 12:10:27 2020

در نهایت این فایل سیستم را با دستور mount در سیستم باز می‌کنیم.

$ sudo mkdir /mnt/task1
$ sudo mount file.squashfs /mnt/task1/
$ cd /mnt/task1/
$ ls -a
./  ../  zero.img

گام چهارم

پس از اینکه پرونده‌ی zero.img را مشاهده می‌کنیم باز هم دستورات file و binwalk را اجرا می‌کنیم.

$ file zero.img
zero.img: data
$ binwalk zero.img 
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
90969         0x16359         Copyright string: "copyright/trademark/acute/dieresis/.notdef/AE/Oslash"
126311        0x1ED67         Copyright string: "copyright/trademark/acute/dieresis/.notdef/AE/Oslash"
156981        0x26535         Copyright string: "copyright 16#00a9"
157000        0x26548         Copyright string: "copyrightsans 16#f8e9"
157023        0x2655F         Copyright string: "copyrightserif 16#f6d9"

خروجی این دستورات مطلوب ما نیست. پس از دستور strings هم استفاده می کنیم و خروجی آن را بررسی می‌کنیم.

گام پنجم

راه حل واقعا درست!

راه حل واقعا درست این چالش این بود که با دیدن نام این پرونده zero.img بررسی می‌کردید که آیا واقعا قابل mount شدن است یا خیر!

$ cp /mnt/task1/zero.img ~/tmp/
$ sudo mkdir /mnt/task1.1/
$ sudo mount ~/tmp/zero.img /mnt/task1.1/
$ cd /mnt/task1.1/
$ ls -a
  ./      ../     'rand_'$'\001''.img'  'rand_'$'\003''.img' '.    '   rand_  'rand_'$'\002''.img'

سپس با بررسی این فایل‌ها به فایل rand_ برسیم که دستور file برای آن به شکل زیر است:

$ file rand_
rand_: PostScript document text conforming DSC level 3.0, Level 2

و با باز کردن این فایل به عبارت

parcham{I_l0v3_fOr3n5ics_to0}

برسید.

راه حل کمی درست!

اگر نام این پرونده شما را به درستی راهنمایی نکرد، احتمالا با دستورstrings ادامه بدهیم و با دیدن عبارت‌هایی شامل رشته‌های PS-Adobe-3.0 ببینیم و به دنبال یک فایل ps باشیم.
برای این روش، فایل را در یک ویرایشگر hex باز کنید.
سپس سرآیند مربوط به PostScript را جست‌و‌جو کنید. می‌توانید از این پیوند استفاده کنید. به تصاویر زیر دقت کنید، در تصویر اول سرآیند را جست‌و‌جو کرده‌ایم و در قسمت پایین ویرایشگر مشاهده می‌کنیم آدرسی که سرآیند در آن قرار دارد، آدرس ‍‍0xd200 است. کمی در فایل اسکرول می‌کنیم تا به انتهای این پرونده‌ی PostScript برسیم و عبارت EOF را ببینیم. همان‌طور که در تصویر دوم مشاهده می‌کنید انتهای این پرونده در آدرس 0x3843a است.

پیدا کردن آدرس سرآیند پرونده ps
پیدا کردن آدرس سرآیند پرونده ps

پیدا کردن آدرس انتهای پرونده ps
پیدا کردن آدرس انتهای پرونده ps

در نهایت با دستور زیر یا هر روش دیگری فایل را استخراج کنید و به پرچم برسید!

$ dd if=zero.img of=file.ps bs=1 skip=53760 count=`echo 'ibase=16;3843A-D200' | bc`
راه حل کمی اشتباه!

اگر در گام اول به جای اینکه فایل اصلی را mount کنید، با تغییر پسوند به zip پرونده را از حالت فشرده خارج کنید تقریبا اشتباه است!
یعنی در اصل سوال را شانسی حل کرده‌اید.