Added: 2021-01-BambooFox/better-than-asm
This commit is contained in:
parent
a71f94f1d3
commit
497e40c6e0
|
@ -0,0 +1,197 @@
|
|||
@format = global [64 x i8] c"\0A\F0\9F\98\82\F0\9F\91\8C\F0\9F\98\82\F0\9F\91\8C\F0\9F\98\82\F0\9F\91\8C flag{%s} \F0\9F\91\8C\F0\9F\98\82\F0\9F\91\8C\F0\9F\98\82\F0\9F\91\8C\F0\9F\98\82\0A\0A\00\00\00", align 16
|
||||
@flag = global [64 x i8] c"\1DU#hJ7.8\06\16\03rUO=[bg9JmtGt`7U\0BnNjD\01\03\120\19;OVIaM\00\08,qu<g\1D;K\00}Y\00\00\00\00\00\00\00\00", align 16
|
||||
@what = global [64 x i8] c"\17/'\17\1DJy\03,\11\1E&\0AexjONacA-&\01LANH'.&\12>#'Z\0FO\0B%:(&HI\0CJylL'\1EmtdC\00\00\00\00\00\00\00\00", align 16
|
||||
@secret = global [64 x i8] c"B\0A|_\22\06\1Bg7#\5CF\0A)\090Q8_{Y\13\18\0DP\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", align 16
|
||||
@.str = private unnamed_addr constant [49 x i8] c"Only the chosen one will know what the flag is!\0A\00", align 1
|
||||
@.str.1 = private unnamed_addr constant [25 x i8] c"Are you the chosen one?\0A\00", align 1
|
||||
@.str.2 = private unnamed_addr constant [7 x i8] c"flag: \00", align 1
|
||||
@.str.3 = private unnamed_addr constant [5 x i8] c"%64s\00", align 1
|
||||
@.str.4 = private unnamed_addr constant [81 x i8] c"\0A\F0\9F\98\A0\F0\9F\98\A1\F0\9F\98\A0\F0\9F\98\A1\F0\9F\98\A0\F0\9F\98\A1 You are not the chosen one! \F0\9F\98\A1\F0\9F\98\A0\F0\9F\98\A1\F0\9F\98\A0\F0\9F\98\A1\F0\9F\98\A0\0A\0A\00", align 1
|
||||
|
||||
define i32 @check(i8*) #0 {
|
||||
%2 = alloca i8*, align 8
|
||||
%3 = alloca i32, align 4
|
||||
%4 = alloca i32, align 4
|
||||
store i8* %0, i8** %2, align 8
|
||||
store i32 1, i32* %3, align 4
|
||||
store i32 0, i32* %4, align 4
|
||||
br label %5
|
||||
|
||||
; <label>:5: ; preds = %36, %1
|
||||
%6 = load i32, i32* %4, align 4
|
||||
%7 = sext i32 %6 to i64
|
||||
%8 = call i64 @strlen(i8* getelementptr inbounds ([64 x i8], [64 x i8]* @what, i32 0, i32 0)) #3
|
||||
%9 = icmp ult i64 %7, %8
|
||||
br i1 %9, label %10, label %39
|
||||
|
||||
; <label>:10: ; preds = %5
|
||||
%11 = load i8*, i8** %2, align 8
|
||||
%12 = load i32, i32* %4, align 4
|
||||
%13 = sext i32 %12 to i64
|
||||
%14 = getelementptr inbounds i8, i8* %11, i64 %13
|
||||
%15 = load i8, i8* %14, align 1
|
||||
%16 = sext i8 %15 to i32
|
||||
%17 = load i8*, i8** %2, align 8
|
||||
%18 = load i32, i32* %4, align 4
|
||||
%19 = add nsw i32 %18, 1
|
||||
%20 = sext i32 %19 to i64
|
||||
%21 = call i64 @strlen(i8* getelementptr inbounds ([64 x i8], [64 x i8]* @what, i32 0, i32 0)) #3
|
||||
%22 = urem i64 %20, %21
|
||||
%23 = getelementptr inbounds i8, i8* %17, i64 %22
|
||||
%24 = load i8, i8* %23, align 1
|
||||
%25 = sext i8 %24 to i32
|
||||
%26 = xor i32 %16, %25
|
||||
%27 = load i32, i32* %4, align 4
|
||||
%28 = sext i32 %27 to i64
|
||||
%29 = getelementptr inbounds [64 x i8], [64 x i8]* @what, i64 0, i64 %28
|
||||
%30 = load i8, i8* %29, align 1
|
||||
%31 = sext i8 %30 to i32
|
||||
%32 = icmp eq i32 %26, %31
|
||||
%33 = zext i1 %32 to i32
|
||||
%34 = load i32, i32* %3, align 4
|
||||
%35 = and i32 %34, %33
|
||||
store i32 %35, i32* %3, align 4
|
||||
br label %36
|
||||
|
||||
; <label>:36: ; preds = %10
|
||||
%37 = load i32, i32* %4, align 4
|
||||
%38 = add nsw i32 %37, 1
|
||||
store i32 %38, i32* %4, align 4
|
||||
br label %5
|
||||
|
||||
; <label>:39: ; preds = %5
|
||||
%40 = load i32, i32* %3, align 4
|
||||
ret i32 %40
|
||||
}
|
||||
|
||||
declare i64 @strlen(i8*) #1
|
||||
|
||||
define i32 @main() #0 {
|
||||
%1 = alloca i32, align 4
|
||||
%2 = alloca [64 x i8], align 16
|
||||
%3 = alloca i32, align 4
|
||||
%4 = alloca i32, align 4
|
||||
store i32 0, i32* %1, align 4
|
||||
%5 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([49 x i8], [49 x i8]* @.str, i32 0, i32 0))
|
||||
%6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.1, i32 0, i32 0))
|
||||
%7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.2, i32 0, i32 0))
|
||||
%8 = getelementptr inbounds [64 x i8], [64 x i8]* %2, i32 0, i32 0
|
||||
%9 = call i32 (i8*, ...) @__isoc99_scanf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.3, i32 0, i32 0), i8* %8)
|
||||
%10 = getelementptr inbounds [64 x i8], [64 x i8]* %2, i32 0, i32 0
|
||||
%11 = call i64 @strlen(i8* %10) #3
|
||||
%12 = call i64 @strlen(i8* getelementptr inbounds ([64 x i8], [64 x i8]* @what, i32 0, i32 0)) #3
|
||||
%13 = icmp ne i64 %11, %12
|
||||
br i1 %13, label %14, label %16
|
||||
|
||||
; <label>:14: ; preds = %0
|
||||
%15 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([81 x i8], [81 x i8]* @.str.4, i32 0, i32 0))
|
||||
store i32 1, i32* %1, align 4
|
||||
br label %83
|
||||
|
||||
; <label>:16: ; preds = %0
|
||||
%17 = getelementptr inbounds [64 x i8], [64 x i8]* %2, i32 0, i32 0
|
||||
%18 = call i32 @check(i8* %17)
|
||||
%19 = icmp ne i32 %18, 0
|
||||
br i1 %19, label %20, label %51
|
||||
|
||||
; <label>:20: ; preds = %16
|
||||
store i32 0, i32* %3, align 4
|
||||
br label %21
|
||||
|
||||
; <label>:21: ; preds = %45, %20
|
||||
%22 = load i32, i32* %3, align 4
|
||||
%23 = sext i32 %22 to i64
|
||||
%24 = getelementptr inbounds [64 x i8], [64 x i8]* %2, i32 0, i32 0
|
||||
%25 = call i64 @strlen(i8* %24) #3
|
||||
%26 = icmp ult i64 %23, %25
|
||||
br i1 %26, label %27, label %48
|
||||
|
||||
; <label>:27: ; preds = %21
|
||||
%28 = load i32, i32* %3, align 4
|
||||
%29 = sext i32 %28 to i64
|
||||
%30 = getelementptr inbounds [64 x i8], [64 x i8]* %2, i64 0, i64 %29
|
||||
%31 = load i8, i8* %30, align 1
|
||||
%32 = sext i8 %31 to i32
|
||||
%33 = load i32, i32* %3, align 4
|
||||
%34 = sext i32 %33 to i64
|
||||
%35 = call i64 @strlen(i8* getelementptr inbounds ([64 x i8], [64 x i8]* @secret, i32 0, i32 0)) #3
|
||||
%36 = urem i64 %34, %35
|
||||
%37 = getelementptr inbounds [64 x i8], [64 x i8]* @secret, i64 0, i64 %36
|
||||
%38 = load i8, i8* %37, align 1
|
||||
%39 = sext i8 %38 to i32
|
||||
%40 = xor i32 %32, %39
|
||||
%41 = trunc i32 %40 to i8
|
||||
%42 = load i32, i32* %3, align 4
|
||||
%43 = sext i32 %42 to i64
|
||||
%44 = getelementptr inbounds [64 x i8], [64 x i8]* %2, i64 0, i64 %43
|
||||
store i8 %41, i8* %44, align 1
|
||||
br label %45
|
||||
|
||||
; <label>:45: ; preds = %27
|
||||
%46 = load i32, i32* %3, align 4
|
||||
%47 = add nsw i32 %46, 1
|
||||
store i32 %47, i32* %3, align 4
|
||||
br label %21
|
||||
|
||||
; <label>:48: ; preds = %21
|
||||
%49 = getelementptr inbounds [64 x i8], [64 x i8]* %2, i32 0, i32 0
|
||||
%50 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([64 x i8], [64 x i8]* @format, i32 0, i32 0), i8* %49)
|
||||
br label %82
|
||||
|
||||
; <label>:51: ; preds = %16
|
||||
store i32 0, i32* %4, align 4
|
||||
br label %52
|
||||
|
||||
; <label>:52: ; preds = %76, %51
|
||||
%53 = load i32, i32* %4, align 4
|
||||
%54 = sext i32 %53 to i64
|
||||
%55 = getelementptr inbounds [64 x i8], [64 x i8]* %2, i32 0, i32 0
|
||||
%56 = call i64 @strlen(i8* %55) #3
|
||||
%57 = icmp ult i64 %54, %56
|
||||
br i1 %57, label %58, label %79
|
||||
|
||||
; <label>:58: ; preds = %52
|
||||
%59 = load i32, i32* %4, align 4
|
||||
%60 = sext i32 %59 to i64
|
||||
%61 = getelementptr inbounds [64 x i8], [64 x i8]* @flag, i64 0, i64 %60
|
||||
%62 = load i8, i8* %61, align 1
|
||||
%63 = sext i8 %62 to i32
|
||||
%64 = load i32, i32* %4, align 4
|
||||
%65 = sext i32 %64 to i64
|
||||
%66 = call i64 @strlen(i8* getelementptr inbounds ([64 x i8], [64 x i8]* @secret, i32 0, i32 0)) #3
|
||||
%67 = urem i64 %65, %66
|
||||
%68 = getelementptr inbounds [64 x i8], [64 x i8]* @secret, i64 0, i64 %67
|
||||
%69 = load i8, i8* %68, align 1
|
||||
%70 = sext i8 %69 to i32
|
||||
%71 = xor i32 %63, %70
|
||||
%72 = trunc i32 %71 to i8
|
||||
%73 = load i32, i32* %4, align 4
|
||||
%74 = sext i32 %73 to i64
|
||||
%75 = getelementptr inbounds [64 x i8], [64 x i8]* %2, i64 0, i64 %74
|
||||
store i8 %72, i8* %75, align 1
|
||||
br label %76
|
||||
|
||||
; <label>:76: ; preds = %58
|
||||
%77 = load i32, i32* %4, align 4
|
||||
%78 = add nsw i32 %77, 1
|
||||
store i32 %78, i32* %4, align 4
|
||||
br label %52
|
||||
|
||||
; <label>:79: ; preds = %52
|
||||
%80 = getelementptr inbounds [64 x i8], [64 x i8]* %2, i32 0, i32 0
|
||||
%81 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([64 x i8], [64 x i8]* @format, i32 0, i32 0), i8* %80)
|
||||
br label %82
|
||||
|
||||
; <label>:82: ; preds = %79, %48
|
||||
store i32 0, i32* %1, align 4
|
||||
br label %83
|
||||
|
||||
; <label>:83: ; preds = %82, %14
|
||||
%84 = load i32, i32* %1, align 4
|
||||
ret i32 %84
|
||||
}
|
||||
|
||||
declare i32 @printf(i8*, ...) #2
|
||||
|
||||
declare i32 @__isoc99_scanf(i8*, ...) #2
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
# دربارهی چالشهای CTF
|
||||
**تعریف کلی:** CTF (Capture The Flag) (به فارسی: **پرچم را تصاحب کن**) یک نوع مسابقه امنیت سایبری است که در آن شرکتکنندگان (تیمها یا افراد) مهارتهای خود را در یافتن و بهرهبرداری از آسیبپذیریها، تحلیل سیستمها، رمزگشایی و حل مسائل پیچیده امنیت اطلاعات به چالش میکشند. 💻🕵️♀️
|
||||
|
||||
---
|
||||
## هدف اصلی:
|
||||
هدف اصلی در CTF پیدا کردن "**فلگ**" (Flag) است. فلگ معمولاً یک رشته متنی خاص (مانند `flag{this_is_your_flag}`) است که در یک مکان پنهان (مثلاً در یک فایل، دیتابیس، یا خروجی یک برنامه آسیبپذیر) قرار دارد. با یافتن و وارد کردن این فلگ در سیستم مسابقه، تیم امتیاز کسب میکند.
|
||||
|
||||
---
|
||||
## دو نوع رایج CTF:
|
||||
* **رایجترین نوع: Jeopardy (ژئوپاردی)**
|
||||
* چالشها به صورت مستقل و در دستهبندیهای مختلف (مانند مهندسی معکوس، رمزنگاری، وب، فارنزیک) با امتیازات متفاوت ارائه میشوند.
|
||||
* شرکتکنندگان هر چالشی را که میخواهند انتخاب کرده و فلگ آن را پیدا میکنند.
|
||||
* **پیچیدهتر و دینامیکتر: Attack-Defense (حمله-دفاع)**
|
||||
* هر تیم یک سرور (یا مجموعهای از سرویسها) را در اختیار دارد که باید از آن در برابر حملات تیمهای دیگر دفاع کند و همزمان به سرورهای حریف حمله کرده و فلگهای آنها را به دست آورد.
|
||||
* این نوع CTF مهارتهای دفاعی و تهاجمی را همزمان میسنجد.
|
||||
---
|
||||
## چرا CTF؟
|
||||
* یادگیری و تمرین مهارتهای **امنیت سایبری** در محیطی عملی و کنترلشده.
|
||||
* شناسایی و جذب استعدادها در حوزه امنیت.
|
||||
* افزایش آگاهی نسبت به آسیبپذیریهای رایج و تکنیکهای نفوذ.
|
||||
به طور خلاصه، CTF یک ورزش ذهنی هیجانانگیز در دنیای سایبری است که به شما کمک میکند مهارتهای عملی خود را در امنیت اطلاعات بهبود ببخشید. 🧠🛡️
|
||||
---
|
||||
## دستهبندیهای رایج چالشها در CTF (سبک Jeopardy):
|
||||
در مسابقات CTF با فرمت Jeopardy، چالشها معمولاً به دستهبندیهای مختلفی تقسیم میشوند تا تیمها بتوانند بر اساس تخصص خود، چالشها را انتخاب کنند. این دستهبندیها میتوانند کمی متفاوت باشند، اما رایجترین آنها عبارتند از:
|
||||
|
||||
* **مهندسی معکوس (Reversing):**
|
||||
* بررسی و تحلیل کدهای کامپایلشده (مانند فایلهای اجرایی EXE، ELF) برای درک عملکرد آنها، کشف آسیبپذیریها یا استخراج اطلاعات پنهان (مثل رمزها یا فلگها).
|
||||
* ابزارهای مورد استفاده: دیاسامبلرها (مثل IDA Pro، Ghidra، Radare2)، دیباگرها (مثل GDB, x64dbg).
|
||||
|
||||
* **رمزنگاری (Cryptography):**
|
||||
* شکستن الگوریتمهای رمزنگاری، تحلیل پروتکلهای رمزنگاری، یا پیدا کردن ضعفها در پیادهسازی آنها برای رمزگشایی دادهها و یافتن فلگ.
|
||||
* شامل تحلیل الگوهای رمز، کلیدهای ضعیف، یا اشکالات منطقی در سیستمهای رمزنگاری.
|
||||
|
||||
* **وب (Web Exploitation):**
|
||||
* پیدا کردن و بهرهبرداری از آسیبپذیریهای موجود در برنامههای تحت وب (مانند SQL Injection, Cross-Site Scripting (XSS), File Inclusion, Authentication Bypass) برای دسترسی به اطلاعات یا اجرای کد.
|
||||
|
||||
* **فارنزیک (Forensics):**
|
||||
* تحلیل شواهد دیجیتال (مثل تصاویر دیسک، فایلهای حافظه، ترافیک شبکه، فایلهای سیستمی) برای بازسازی وقایع، شناسایی فعالیتهای مخرب یا استخراج اطلاعات پنهان.
|
||||
|
||||
* **باینری اکسپلویت یا PWN (Binary Exploitation / Pwning):**
|
||||
* پیدا کردن و بهرهبرداری از آسیبپذیریها در برنامههای بومی (native binaries) مانند سرریز بافر (Buffer Overflow)، فرمت استرینگ (Format String) یا use-after-free برای کنترل جریان اجرای برنامه و دستیابی به Shell یا اجرای کد دلخواه.
|
||||
|
||||
* **استگانوگرافی (Steganography):**
|
||||
* پیدا کردن اطلاعات پنهانشده در فایلهای رسانهای (تصاویر، صدا، ویدئو) یا سایر فرمتهای فایل، جایی که دادهها به گونهای مخفی شدهاند که حضور آنها آشکار نباشد.
|
||||
|
||||
* **عمومی یا متفرقه (General Skills / Misc):**
|
||||
* شامل طیف گستردهای از چالشهاست که در دستهبندیهای دیگر قرار نمیگیرند، مانند چالشهای مربوط به لینوکس، اسکریپتنویسی، اوزینت (OSINT)، یا حل معماهای منطقی.
|
||||
|
||||
* **شبکه (Networking):**
|
||||
* تحلیل ترافیک شبکه (بستههای کپچر شده با Wireshark)، پروتکلهای شبکه، و پیدا کردن آسیبپذیریها یا اطلاعات پنهان در ارتباطات شبکه.
|
||||
|
||||
* **سیستم عاملها/کانفینگ (OS/Config):**
|
||||
* چالشهای مربوط به پیکربندیهای سیستم عامل، دسترسی به فایلها، مجوزها، یا بهرهبرداری از تنظیمات نادرست در سیستمها.
|
||||
|
||||
---
|
||||
|
||||
## توضیحات چالش: Bamboo Fox: Better Than Assembly
|
||||
این چالش 500 امتیاز داشت و در دستهبندی **مهندسی معکوس (Reversing)** در سبک CTF از نوع Jeopardy قرار میگرفت.
|
||||
**نکته:** منظور از Jeopardy در مسابقات CTF (Capture The Flag)، یک قالب (format) خاص برای ارائه و حل چالشهاست. یا به طور خلاصه، وقتی میگوییم یک چالش در سبک CTF از نوع Jeopardy است، یعنی شما با یک سوال یا مسئله مستقل روبرو هستید که باید آن را حل کنید تا فلگ مربوطه را پیدا کرده و امتیاز کسب کنید.
|
||||
|
||||
# مسیر حل چالش
|
||||
|
||||
## قدم اول: اسکن کردن فایل
|
||||
ابزار ClamAV (Clam AntiVirus) یک موتور آنتیویروس متنباز و رایگان است که به طور گسترده برای شناسایی تروجانها، ویروسها، بدافزارها و سایر تهدیدات مخرب استفاده میشود. این نرمافزار به ویژه در سرورهای ایمیل برای اسکن فایلهای ضمیمه و جلوگیری از ورود بدافزارها از طریق ایمیل محبوبیت دارد، اما میتوان از آن برای اسکن فایلها و دایرکتوریها در سیستمهای لینوکس، یونیکس و ویندوز نیز بهره برد. ابزار خط فرمان اصلی برای اسکن فایلها با ClamAV، دستور `clamscan` است که به کاربران اجازه میدهد مسیرهای مشخصی را برای یافتن امضاهای بدافزار (که از پایگاه داده ویروس ClamAV بهروزرسانی میشوند) اسکن کنند. این ابزار به دلیل ماهیت متنباز بودن و قابلیت سفارشیسازی بالا، گزینهای قدرتمند و انعطافپذیر برای افزودن قابلیتهای اسکن آنتیویروس به اسکریپتها و سیستمهای خودکار است.
|
||||
[مستندات ClamAV](https://docs.clamav.net/manual/Usage/Scanning.html)
|
||||
sudo clamscan --infected --recursive
|
||||
sudo apt install clamav clamav-daemon clamav-freshclam
|
||||
sudo freshclam
|
||||
|
||||
## قدم دوم: شناسایی نوع و ماهیت فایلها
|
||||
### دستور ExifTool
|
||||
دستور ExifTool یک ابزار خط فرمان رایگان و متنباز و یک کتابخانه پِرل (Perl library) قدرتمند است که برای خواندن، نوشتن و ویرایش فراداده (metadata) در طیف وسیعی از فرمتهای فایل، از جمله تصاویر (EXIF, IPTC, XMP)، ویدئوها، فایلهای صوتی و اسناد PDF، استفاده میشود. این ابزار قادر است تقریباً تمام تگهای فراداده استاندارد و سفارشی را استخراج و دستکاری کند، که آن را برای عکاسان، محققان پزشکی قانونی دیجیتال، توسعهدهندگان و هر کسی که نیاز به مدیریت دقیق اطلاعات جاسازی شده در فایلها دارد، بیاندازه ارزشمند میسازد. ExifTool به دلیل پشتیبانی گستردهاش از انواع تگها و فرمتها، قابلیتهای ویرایش دستهای، و توانایی حفظ یکپارچگی دادهها حتی پس از تغییر فراداده، به عنوان یک استاندارد صنعتی شناخته میشود.
|
||||
[وبسایت ExifTool](https://exiftool.org)
|
||||
|
||||
sudo apt install libimage-exiftool-perl
|
||||
|
||||
### دستور File
|
||||
دستور `file` یک ابزار استاندارد و قدرتمند در سیستمعاملهای شبهیونیکس (مانند لینوکس و macOS) است که برای شناسایی نوع محتوای یک فایل به کار میرود. برخلاف بسیاری از دستورات که نوع فایل را صرفاً بر اساس پسوند آن حدس میزنند، `file` با بررسی جادویی (magic numbers) موجود در ابتدای فایلها، ساختار داخلی و محتوای واقعی آنها را تحلیل میکند. این قابلیت به آن اجازه میدهد تا حتی فایلهایی را که پسوند اشتباه دارند یا اصلاً پسوندی ندارند، به درستی تشخیص دهد؛ مثلاً میتواند یک فایل متنی ساده، یک فایل اجرایی باینری (مانند ELF، Mach-O یا PE)، یک تصویر (JPEG، PNG)، یک آرشیو فشرده (ZIP، GZ)، یا حتی یک سند Word را شناسایی کند. این دستور برای مهندسی معکوس، بررسی امنیتی فایلها، یا صرفاً برای درک اینکه یک فایل ناشناخته واقعاً چیست، بسیار مفید است.
|
||||
file task.ll
|
||||
sudo apt install file
|
||||
|
||||
### وبسایت FileInfo.com
|
||||
وبسایت FileInfo.com یک دایرکتوری آنلاین بزرگ از پسوندهای فایل است که به شما امکان میدهد با وارد کردن پسوند یک فایل، اطلاعات جامعی درباره آن کسب کنید. این وبسایت توضیحات مربوط به نوع فایل، دستهبندی آن (مانند فایل ویدئویی یا سند)، برنامههای نرمافزاری مرتبط که میتوانند آن را باز کنند و اطلاعاتی درباره توسعهدهنده فرمت را ارائه میدهد، که آن را به ابزاری مفید برای شناسایی فایلهای ناشناخته تبدیل میکند.
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue