وصف تحدي CTF:

أهلاً،

شكرًا لاختبارك تطبيق الملاحظات الجديد. أعلم أن الأمر لم ينته بعد، لكن التشفير من الدرجة العسكرية تم تنفيذه، لذلك دعونا نرى ما إذا كان يمكنك قراءة ملاحظتي.

حل

إذا قمت بتثبيت التطبيق على هاتفك، فستبدو شاشة تسجيل الدخول كما هو موضح أدناه

ملاحظات دراسة الأمن السيبراني

ملاحظات دراسة OSCP

نظرًا لأن هذا يمثل تحديًا للهندسة العكسية لنظام Android، فإننا نستخدم برنامج فك التشفير JEB لعكس وتحليل التطبيق. فيما يلي كود المصدر الكامل:

package com.example.firstjavaapplication; /* ... */ public class MainActivity Extends AppCompatActivity { Private Button ButtonLogin; تحرير النص الخاص وتحرير النص وكلمة المرور؛ تحرير النص الخاص، تحرير النص، اسم المستخدم؛ @Override // androidx.fragment.app.FragmentActivity protected void onCreate(Bundle Bundle0) { super.onCreate(bundle0); this.setContentView(layout.activity_main); this.editTextUsername = (EditText)this.findViewById(id.editTextUsername); this.editTextPassword = (EditText)this.findViewById(id.editTextPassword); Button Button0 = (Button)this.findViewById(id.buttonLogin); this.buttonLogin = Button0; Button0.setOnClickListener(new View.OnClickListener() { public boolean isValidCredentials(String s, String s1) { return (s.equals("admin")) && (s1.equals("fbG6pXd0wm1cz")); } @Override // android.view.View$OnClickListener public void onClick(View view0) { String s = MainActivity.this.editTextUsername.getText().toString().trim(); String s1 = MainActivity.this.editTextPassword.getText().toString(); .trim(); if(!s.isEmpty() && !s1.isEmpty()) { if(this.isValidCredentials(s, s1)) { Intent tiny0 = new Intent(MainActivity.this, Part1.class); .putExtra("password", s1); MainActivity.this.startActivity(intent0); (MainActivity.this، "الرجاء إدخال اسم المستخدم وكلمة المرور"، 0).show(); } }

يحتوي القسم الأول من الحاوية الخشبية على لوحة مفاتيح وباب خشبي مغلق. يوضح الكود المقدم أدناه آلية المصادقة التي تستخدمها لوحة المفاتيح للتحقق من صحة مدخلات المستخدم من خلال مقارنتها بالنتيجة المتوقعة.

6d47dd806bdf0677abfdca674206650aaa58fcb3669e76d1b60fb1fb91d50a54f4483f6a721cc3e8acc87f536f9419d782dcc8e7b443574530

uint64_t validate_code()

      int64_t var_38
      __builtin_strcpy(dest: &var_38, src: ":1N50QU357")
      int64_t var_8 = 0x19
      void var_140
      void* var_10 = &var_140
      strcpy(var_10, &code, 0x33555130354e313a)
      strcat(var_10, &var_38)
      size_t var_18 = 0x10
      int64_t var_20 = 0xf
      md5String(var_10, &var_140 - 0x10)
      int128_t var_a0
      __builtin_strncpy(dest: &var_a0, src: "33c12ea236cc81d7deb97e432aedc9d4", n: 0x21)
      void* x0_6
      int64_t x1_2
      x0_6, x1_2 = hexstr_to_char(&var_a0)
      void var_78
      fastpbkdf2_hmac_sha512(&var_140 - 0x10, var_18, x0_6, x1_2, 0x64, &var_78, 0x40)
      void* x0_9
      int64_t x1_5
      x0_9, x1_5 = hexstr_to_char("6d47dd806bdf0677abfdca674206650a…")
      if (x1_5 == 0x40)
          int32_t x0_12 = memcmp(&var_78, x0_9, 0x40)
          free(x0_9)
          int64_t var_c0_1 = 0
          free(x0_6)
          int64_t var_b0_1 = 0
          return zx.q(x0_12)
      __assert_fail(assertion: "expected.length == PKBDF2_OUT_SI…", file: "firmware.c", line: 0x8d, function: "validate_code")
      noreturn

إذا لاحظت com.example.firstjavaapplication.MainActivity سوف تجد أن أوراق الاعتماد الصحيحة كما مسؤل و fbG6pXd0wm1cz والتي يمكن استخدامها لتسجيل الدخول كمسؤول.

في الكود،  النشاط الرئيسي يرسل كلمة المرور fbG6pXd0wm1cz لا يتم استخدامه أبدًا إلى جانب طرق مثل createFlag و MD5 والتي لا تستخدم أيضًا على الإطلاق.

إذا قمنا بعرض محتوى Storage.json نجد ما يلي:


└──> محتويات القط/الأصول/storage.json { "AES-Type": "256"، "note": "uS0D11dq3RM9QimRWfXcewwQdoxYwrZRNUGT205pDfQ=" }

وهذا يجعلنا نعيد فحص هذا الجزء من الكود أدناه:

@Override // android.view.View$OnClickListener public void onClick(View view0) { String s = Part1.this.editTextPassphrase.getText().toString().trim(); if(!s.isEmpty()) { حاول { ((TextView)Part1.this.findViewById(id.textViewFLAG2)).setText(this.decrypt(s1, s)); } Catch(Exception Exception0) { Exception0.printStackTrace(); textView0.setText(s1); Toast.makeText(Part1.this، "عبارة مرور خاطئة"، 0).show(); } يعود؛ } Toast.makeText(Part1.this، "الرجاء إدخال كلمة المرور"، 0).show(); }

أنا يدعو فك التشفير باستخدام المذكرة uS0D11dq3RM9QimRWfXcewwQdoxYwrZRNUGT205pDfQ= وعبارة المرور التي ندخلها. إذا منعنا ظهور الاستثناءات في الكود، فيمكننا أن نفترض أنه تم فك تشفير الملاحظة بنجاح

يتم فك تشفير الملاحظة باستخدام Base64 ثم يتم فك تشفيرها 313370+1 مرات باستخدام ايه اي اس-256. لا الحشو يتم استخدام الخيار أيضًا لتجنب طرح الاستثناءات أثناء عمليات فك التشفير المتعددة.

وفي النهاية نستخدم PKCS7الحشو للتأكد من صحة فك التشفير.

للعثور على عبارة المرور الصحيحة، نقوم بإجراء هجوم على قاموس كلمة المرور باستخدام rockyou.txt.

يجب أن تكون عبارة المرور التي نحاول أن تكون بالحجم الصحيح لتجنب أي خطأ مثل  حجم المفتاح غير المدعوم: 4 بايت استثناء.

بما أننا نعلم أن خوارزمية التشفير هي ايه اي اس-256 يمكننا أن نستنتج بأمان أن الحجم الصحيح هو 32 الحروف طويلة.

الخطوة التالية هي تصفية جميع كلمات المرور من قائمة الكلمات rockyou.txt التي ليست كذلك 32 بايت طويلة.

لذلك نواصل هذا النهج ونحصل على عبارة المرور الصحيحة (والعلم):

يتيح لك تحديث ملاحظاتك الممتعة والمزيد

قائمة التشغيل الخاصة بـ CTF

عن المؤلف

أقوم بإنشاء ملاحظات حول الأمن السيبراني وملاحظات التسويق الرقمي والدورات التدريبية عبر الإنترنت. أقدم أيضًا استشارات التسويق الرقمي بما في ذلك، على سبيل المثال لا الحصر، تحسين محركات البحث وإعلانات Google وMeta وإدارة CRM.

عرض المقالات