এক্সএক্সডি আউটপুটকে শেলকোডে রূপান্তর করুন


15

এক্সএক্সডি থেকে কিছু আউটপুট নেওয়া এবং এটিকে হাতের দ্বারা ব্যবহারযোগ্য শেলকোডে রূপান্তর করা কোনও মজাদার নয়, সুতরাং আপনার কাজটি প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে চালিত করা।

বিধি

আপনার জমাটি কোনও ফাংশন, ল্যাম্বদা, স্ক্রিপ্ট বা এগুলির কোনও যুক্তিসঙ্গত সমতুল্য হতে পারে। আপনি ফলাফল মুদ্রণ করতে পারেন, বা যদি আপনার জমাটি কোনও ফাংশন / ল্যাম্বদা হয় তবে আপনি এটিও ফিরিয়ে দিতে পারেন।

আপনি প্রোগ্রাম তিন আর্গুমেন্ট নিতে হবে, প্রথমে একটি ফাইলের নাম ছাড়া অন্য কোন যুক্তি, ভালো সঙ্গে xxd যাও আউটপুট দৌড়ে ধারণকারী একটি স্ট্রিং হচ্ছে: xxd some_file। প্রথম যুক্তিটি কেমন হবে তার উদাহরণ এখানে:

00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088  1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c  C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58  ......./bin/shNX
00000030: 5858 5859 5959 59                        XXXYYYY

আপনার বাইটস (সেই পরে প্রথম 8 টি কলাম :) সমেত মধ্যবর্তী বিভাগটি গ্রহণ করা উচিত এবং যে কোনও সাদা জায়গা সরিয়ে শেলকোডে পরিণত করতে হবে, তারপরে \xপ্রতিটি বাইটের আগে একটি রেখে putting

উপরের ইনপুটটির জন্য আউটপুটটি কী হওয়া উচিত তা এখানে (অন্য কোনও যুক্তি উপেক্ষা করে):

\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58\x59\x59\x59\x59

আপনি ধরে নিতে পারেন প্রথম আর্গুমেন্টটি সর্বদা একটি বৈধ xxd আউটপুট হবে, ফাইল নাম ছাড়া অন্য কোনও যুক্তি ছাড়াই চলে।

আপনার আউটপুটটিও একটি স্ট্রিং হওয়া উচিত যেখানে ব্যাকস্ল্যাশগুলি আক্ষরিক ব্যাকস্ল্যাশ হয়, এস্কেপ অক্ষর হিসাবে ব্যবহৃত হয় না। সুতরাং যখন আমি "\ x65" বলি, তখন আমি বাইট 0x65 বা এমনকি "এ" অক্ষরের কথা বলছি না। কোডে এটি "\ x65" স্ট্রিংটি হবে।

দ্বিতীয় আর্গুমেন্টটি xxd আউটপুটে শেলকোড শুরু হওয়া উচিত এবং তৃতীয়টি কোথায় শেষ হওয়া উচিত তা নির্দিষ্ট করে। যদি তৃতীয় যুক্তিটি হয় তবে -1এটি এক্সএক্সডি আউটপুট শেষে শেষ হবে। দ্বিতীয় এবং তৃতীয় যুক্তিটি সর্বদা অ-নেতিবাচক থাকবে, তৃতীয়টি বাদ দিলে-1

এখানে কিছু পরীক্ষার মামলা রয়েছে:

তর্ক 1:

00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088  1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c  C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58  ......./bin/shNX
00000030: 5858 5859 5959 59                        XXXYYYY

আর্গুমেন্ট 2 7:, তর্ক 3: e(এটি উভয় স্ট্রিং হেক্সাডেসিমাল সংখ্যার প্রতিনিধিত্ব করে)

আউটপুট: \xc9\xcd\x80\xeb\x16\x5b\x31\xc0

তর্ক 1:

00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088  1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c  C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58  ......./bin/shNX
00000030: 5858 5859 5959 59                        XXXYYYY

যুক্তি 2 0:, তর্ক 3:2e

আউটপুট: \x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e

তর্ক 1:

00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088  1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c  C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58  ......./bin/shNX
00000030: 5858 5859 5959 59                        XXXYYYY

যুক্তি 2 a:, তর্ক 3:-1

আউটপুট: \xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58\x59\x59\x59\x59

সর্বনিম্ন বাইটস সহ কোডটি জয়ী হয়। বিজয়ী ১৫ ই আগস্ট, ২০১ 2016 এ সাত দিনের মধ্যে ঘোষণা করা হবে (তবে তারপরে জমা দেওয়া এখনও প্রশংসাযোগ্য)।

হালনাগাদ

চ্যানেলটি জিততে @ আদনানকে অভিনন্দন !


কেবল পরিষ্কার করার জন্য, এন্ট্রিগুলি কোনও স্ট্রিং ফিরিয়ে দিতে পারে বা তারা কি এটি মুদ্রণ করতে পারে?
জর্দান

কোনও ফাংশন, ল্যাম্বডা বা এরকম কোনও কিছু না হওয়া পর্যন্ত কোনও স্ট্রিং ফিরিয়ে দেওয়া ঠিক আছে (আপনার জিজ্ঞাসার পরে আমি এটি নির্দিষ্ট করার জন্য বিধিগুলি আপডেট করেছি)।
অ্যাডিসন

1
কোডটি মুদ্রণযোগ্য হলে আমরা কি নিয়মিত ASCII কোডগুলি ফেরত দিতে পারি? যেমন ~পরিবর্তে \x7e। এবং আমরা কি \tপরিবর্তে ফিরে আসতে পারি \x09?
orlp

@orlp দুঃখিত না, এটি একটি ধারাবাহিক বিন্যাসে থাকা দরকার।
অ্যাডিসন

যুক্তিগুলি কি হেক্সে থাকা দরকার? এছাড়াও, আপনি দ্বিতীয় উদাহরণটি যেভাবে দিয়েছেন তা 7শূন্য-ভিত্তিক সূচকের মতো দেখায় এবং eএটি একটি ভিত্তিক সূচক ( e-7=7তবে আপনার আউটপুটে 8 টি হেক্স কোড রয়েছে), বা আমি কি কিছু উপেক্ষা করছি?
নীল

উত্তর:


5

05AB1E , 39 38 বাইট

ফর্ম ইনপুট:

arg2
arg3
arg1

কোড:

²\|vy9F¦}40£ðK}J2ô„\xì²H>²®Qi²}£¹HF¦}J

ব্যাখ্যা:

²\                                       # Get the first two inputs and discard them.
  |                                      # Take the rest of the input as an array.
   vy         }                          # For each line...
     9F¦}                                #   Ten times, remove the first character.
         40£                             #   Only remain the substring [0:40].
            ðK                           #   Remove spaces.
               J                         # Join the string.
                2ô                       # Split into pieces of 2.
                  „\xì                   # Prepend a "\x" at each string.
                      ²H                 # Convert the second line from hex to int.
                        >                # Increment by one.
                         ²               # Push the second input again.
                          ®Qi }          # If equal to -1...
                             ²           #   Push the second input again.
                               £         # Take the substring [0:(² + 1)].
                                ¹H       # Convert the first input from hex to int.
                                  F¦}    # Remove that many characters at the beginning.
                                     J   # Join the array and implicitly output.

সিপি -1222 এনকোডিং ব্যবহার করে । এটি অনলাইন চেষ্টা করুন!


12

বাশ + কোর্টিলস + এক্সএক্সডি, 73 71 69 বাইট

printf \\x%s `xxd -r|xxd -p -s0x$1 -l$[(e=1+0x$2)?e-0x$1:-1]|fold -2`

STDIN এ হেক্সডাম্প প্রত্যাশা করে এবং কমান্ড-লাইন আর্গুমেন্ট হিসাবে শুরু / শেষ হয়।

এটি STDERR- তে কিছু সতর্কতা মুদ্রণ করে, যা ডিফল্টরূপে অনুমোদিত।


1
আমি আশা করছিলাম যে কেউ xxdতাদের সমাধানটিতে আসলে ব্যবহার করবে !
অ্যাডিসন

@ অ্যাডিসন আমি চেষ্টা করেছি, তবে আমার ল্যাং কমান্ডলাইন ইনপুটটিতে নতুন লাইনগুলি সমর্থন করে না। : সি
অ্যাডিসন ক্রম্প

আমি প্রতিস্থাপন করতে সক্ষম 16#সঙ্গে 0x?
ডিজিটাল ট্রমা

@ ডিজিটাল ট্রুমা আমি ভেবেছিলাম এটি একটি xxdজিনিস তবে এটি সর্বত্র কাজ করে বলে মনে হচ্ছে।
ডেনিস

1
হ্যাঁ, ব্যাশ parses 0xnহেক্স শৈলী এবং 0mঅকট্যাল শৈলী সংখ্যার বাক্সের বাইরে: gnu.org/software/bash/manual/bash.html#Shell-Arithmeticecho $[0x2a] $[052]
ডিজিটাল ট্রমা

5

জাভাস্ক্রিপ্ট, 84 বাইট

(s,f,t,u)=>s.replace(/.*:|  .*\n?| /g,'').replace(/../g,'\\x$&').slice(f*4,++t*4||u)

ব্যাখ্যা: ডাম্পের সমস্ত অযাচিত অংশগুলি সরিয়ে দেয়, \xপ্রতিটি হেক্স জোড়ায় প্রিপেন্ড করে, তারপরে ফলাফলের পছন্দসই অংশটি বের করে। প্যারামিটার ||uবৃদ্ধি করে প্রাপ্ত শূন্যকে রূপান্তর করতে ব্যবহার করা -1হয় undefinedযা ম্যাজিক মান যা sliceস্ট্রিংয়ের শেষে টুকরো টুকরো করে। 101 বাইট যদি হেক্স ডিজিটের স্ট্রিং হয় fএবং t:

(s,f,t,u)=>s.replace(/.*:|  .*\n?| /g,``).replace(/../g,`\\x$&`).slice(`0x${f}`*4,t<0?u:`0x${t}`*4+4)

পরিবর্তে (s,f,t,u)=>, আপনি s=>f=>t=>u=>কিছু বাইট সংরক্ষণ করতে পারেন ।
ইসমাইল মিগুয়েল

@ ইসমাইল মিগুয়েল দুঃখিত, এটি ঠিক দুটি আসল পরামিতি সহ কোনও ফাংশনের জন্য কাজ করে। আমার নির্দিষ্ট ক্ষেত্রে uঅবশ্যই একটি অতিরিক্ত প্যারামিটার হতে হবে এবং তা কিরিক করা যাবে না।
নীল

@ ইসমাইল মিগুয়েল এছাড়াও এটি আসলে দীর্ঘ ...
জাকব

5

রুবি: 90 89 87 79 63 বাইট

-২ বাইটস @ অ্যাডিসন
-8 বাইটসকে @ পাইয়ার্স মাইনওয়ারিংকে ধন্যবাদ জানায়

->s,x,y{'\x'+s.scan(/(?<=.{9})\w\w(?=.* )/)[x.hex..y.hex]*'\x'}

Repl.it এ পরীক্ষাগুলি দেখুন: https://repl.it/Cknc/5


আপনি প্রতিস্থাপন করতে পারেন .joinসঙ্গে *""2 সংরক্ষণ করুন বাইট।
অ্যাডিসন

আপনি প্রতিস্থাপন করতে পারেন .map{|h|h.to_i(16)}সঙ্গে .map(&:hex)আরো 8 বাইট সংরক্ষণ করুন!
পিয়ার্স্যাড্রিয়ান

ধন্যবাদ @ পাইর্সমাইনওয়ারিং! আমাকে ভুলতে ভুলবেন না। এটি প্রকৃতপক্ষে আমাকে 16 টি বাঁচিয়েছিল কারণ এটি .hexস্বতন্ত্রভাবে যুক্তিগুলি কল করতে সংক্ষিপ্ত আকারে পরিণত হয়েছিল !
জর্দান

4

জেলি , 48 44 বাইট

ØhiЀɠ’ḅ¥®L’¤Ạ?⁴‘
ṣ⁷ṫ€⁵ḣ€40Fḟ⁶s©2ḣ¢ṫ¢[“\x”]p

এটি হেক্সডাম্পকে একক কমান্ড-লাইন আর্গুমেন্ট হিসাবে প্রত্যাশা করে এবং STDIN- এ শেষ এবং প্রারম্ভ পয়েন্টগুলি, সেই ক্রমে একটি লাইনফিড দ্বারা পৃথক করে।

এটি অনলাইন চেষ্টা করুন!


আমি এর জন্য একটি ব্যাখ্যা দেখতে চাই;)
কনর ও'ব্রায়ান

আমি পরে যুক্ত করব, তবে আমি এটি প্রথমে কিছুটা গল্ফ দেওয়ার চেষ্টা করব। জেলি বনাম বাশের 69 বাইটের 51 বাইট সঠিক হতে পারে না ...
ডেনিস

3

পাওয়ারশেল ভি 2 +, 175 157 142 133 129 বাইট

param($a,$b,$c)'\x'+(($z=$a-split"`n"|%{$_[10..48]-ne32-join''-split'(..)'-ne''})["0x$b"..(("0x$c",$z.count)[$c-eq-1])]-join'\x')

লাগে ইনপুট $a, $b, $c, সঙ্গে $aযেমন হয় একটি আক্ষরিক সম্পর্কে newline বিভাজিত স্ট্রিং, বা PowerShell সঙ্গে `nচরিত্র লাইন পৃথক। নিম্নলিখিত হিসাবে $zভারী প্রক্রিয়াজাতকরণ $aহিসাবে আমরা সহায়ক স্ট্রিং সেট করেছি -

প্রথমে আমরা -splitনিউলাইনগুলিতে, তারপরে, প্রতিটি লাইনের জন্য |%{...}, আমরা মাঝের বিভাগটি টুকরো টুকরো করি [10..48], -ne32ফাঁকা স্থানগুলি সরিয়ে ফেলার জন্য এটি ব্যবহার -joinকরি, -splitএটি প্রতিটি দীর্ঘ অক্ষরে (দুটি অক্ষর রেখে), এবং -ne''খালি উপাদানগুলি সরিয়ে ফেলার জন্য এটি এক দীর্ঘ স্ট্রিংয়ে আবার ফিরে পাওয়া যায় । এটি দ্বি-এলিমেন্ট স্ট্রিংগুলির মতো অ্যারেতে ফল দেয় ('31','c0','b0'...)

এরপরে আমরা $bহেক্সাডেসিমাল অপারেটরের সাথে মান পর্যন্ত কাস্টের উপর ভিত্তি করে সেই অ্যারেগুলিতে টুকরো করি $c। আমাদের এখানে একটি সিউডো-টের্নারি ব্যবহার করতে হবে যা কিনা আছে কিনা $cতার জন্য দায়ী -1। যদি তা হয় তবে আমরা এর .count(অর্থাত্ শেষ উপাদানটি) বেছে নিই $z। অন্যথায়, আমরা কেবল একটি স্ট্রিং 0xসহ হেক্সাডেসিমাল অপারেটরকে প্রেন্ডেন্ড করি $c। মনে রাখবেন এটি শূন্য-সূচকযুক্ত।

এই অ্যারে স্লাইসে এর উপাদানগুলি -joinএড করে আক্ষরিকের সাথে \xএক স্ট্রিং তৈরি করে। এটি অন্য আক্ষরিকের সাথে চাপযুক্ত \xএবং ফলাফলটি পাইপলাইনে রেখে যায়। মুদ্রণ জড়িত।

উদাহরণ

PS C:\Tools\Scripts\golfing> .\xxd-output.ps1 "00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088  1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c  C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58  ......./bin/shNX
00000030: 5858 5859 5959 59                        XXXYYYY" a -1
\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58\x59\x59\x59\x59

আপনি এই ভাষা দিয়ে শেল অ্যাক্সেস করতে পারেন?
অ্যাডিসন ক্রম্প

@ ভিটিসিএএকএভিএসমোএসি তত্ত্ব অনুসারে, লিনাক্সের জন্য নতুন উইন্ডোজ সাবসিস্টেমটি দেওয়া হয়েছে , একসাথে জিনিসগুলি পাইপ করা এবং / অথবা কমান্ড লাইনের মাধ্যমে পরামিতিগুলি পাস করা উচিত should বাস্তবায়ন পাঠকের জন্য অনুশীলন হিসাবে রেখে গেছে। ;-)
অ্যাডমবর্কবার্ক

2

জেলি , 39 38 37 বাইট

ØhiⱮɠ’ḅ¥ȷ9Ṃ?⁴‘
Ỵṫ€⁵ḣ€40Fḟ⁶s2ṭ€⁾\xḣ¢ṫ¢

এটি অনলাইন চেষ্টা করুন!

এখন 05AB1E মার! ("হেক্সাডেসিমাল থেকে রূপান্তর" অন্তর্নির্মিত অভাব সত্ত্বেও)

ডেনিসের সমাধান হিসাবে একই ইনপুট ফর্ম্যাট ।

ব্যবহার করুন , যা একটি নতুন বৈশিষ্ট্য (এর জন্য সংক্ষিপ্ত Ѐ)। এটি ছাড়াই, এটি 38 বাইট লাগবে।


কেবল 1e9 পর্যন্ত লেনের সাথে ইনপুটটির জন্য কাজ করে।
ব্যবহারকারী 202729

তবে এটি যদি FAT32 এ থাকে (যেখানে ইনপুট আকারটি সর্বাধিক 2 গিগাবাইট হয়) এটি যথেষ্ট।
ব্যবহারকারী 202729

1

পার্ল, 114 বাইট

($_,$a,$b)=@ARGV;s/^.*:|\S*$|\s//gm;@_=(m/../g);for(@_){s/^/\\x/}$"='';say substr"@_",4*$a,$b!=-1?4*($a+$b):2<<20;

উদ্ধৃতিযুক্ত স্ট্রিং হিসাবে কমান্ড লাইনে প্রদত্ত যুক্তি এবং তারপরে দুটি সংখ্যা। সংখ্যাটি দশমিক হিসাবে নেওয়া হয় (আমি জানি হেক্স্স উদাহরণগুলিতে ব্যবহৃত হয়েছিল তবে এটি পোস্টে নির্দিষ্ট করা হয়নি)

টেকনিক্যালি কেবল 2 ^ 21 বাইট পর্যন্ত ইনপুটগুলিতে কাজ করে যেহেতু পারেলের সাবস্ট্রিং পদ্ধতিটি নির্বোধ


দৃশ্যত পরিসীমা, সমেত উদাহরণস্বরূপ তাই 7করতে eদৈর্ঘ্য 32 একটি স্ট্রিং ফলে উচিত
নিল

1

পাইথন, 140 বাইট

lambda O,a,b:''.join(sum([['\\x'+x[:2],('','\\x')[len(x)>2]+x[2:]]for x in O.split()if len(x)<5],[])[int(a,16):(int(b,16)+1,None)[b=='-1']])

https://repl.it/ClB3

মূল স্ট্রিং বিভক্ত করে এবং উপাদানগুলি \xদ্বিতীয় এবং তৃতীয় আর্গুমেন্টের দ্বারা পাঁচটি অক্ষরের চেয়ে কম, প্রেনডেন্ড করে এবং টুকরো টুকরো করা হয়।

162 বাইট সংস্করণ যদি আমাদের প্রশ্নের দ্বারা নির্দিষ্ট না করে আউটপুট অন্য ধরণের পরিচালনা করতে হয়:

import re
J=''.join
def f(x,a,b):r=J(J(re.findall(':(.*?)  ',x)).split());print J(['\\x'+i+j for i,j in zip(r,r[1:])][::2][int(a,16):(int(b,16)+1,None)[b=='-1']])

এটি কাজ করবে না, উদাহরণস্বরূপ, শেষ লাইনটি এমন কিছু 00000030: 5858 58 XXXকারণ এটি শেষ অংশটি টানবে এবং আপনি এর মতো কিছু পাবেন \x58\x58\x58\xXX\xX
অ্যাডমবর্কবার্ক

@ টিমিডি আমি চ্যালেঞ্জের চশমা বাদ দিয়ে মামলাটি পরিচালনা করার দরকার মনে করি নি।
অ্যাটলোলজিস্ট

আমি চ্যালেঞ্জটি পড়েছি কারণ প্রদত্ত প্রথম যুক্তিটি কেবল একটি উদাহরণ, সুতরাং এর xxdপরিবর্তে অন্য আউটপুটও যুক্তি হিসাবে ব্যবহৃত হতে পারে । "প্রথম যুক্তিটি কেমন হবে তার উদাহরণ এখানে:"
অ্যাডমবর্কবার্ক

0

পাইথন 2 এবং 3 - 164 162 150 146 134 150 বাইট

এখন দ্বিতীয় এবং তৃতীয় আর্গুমেন্টের জন্য হেক্স স্ট্রিং গ্রহণ করে।

j=''.join
def f(a,b,c):s=j(x[10:49].replace(' ','')for x in a.split('\n'));print(j('\\x'+s[i:i+2]for i in range(int(b,16)*2,1+2*int(c,16)%len(s),2))

0

পাইথন 3.5, 125 বাইট

import re
lambda s,b,e:re.sub(r'(\w\w)',r'\\x\1',re.sub(r'^.*?:|  .*$|\s','',s,0,8)[2*int(b,16):[2*int(e,16)+2,None][e<'0']])

Ungolfed:

def f(s,b,e):
    b = 2*int(b,16)
    e = [2*int(e,16)+2,None][e<'0']
    x = re.sub(r'''(?v)   # verbose (not in golfed version)
            ^.*?:     # match begining of line to the ':'
           |  .*$     # or match '  ' to end of line
           |\s        # or match whitespace
           ''',
           '',        # replacement
           s,
           0,         # replace all matches 
           re.M       # multiline mode
           )
    y = re.sub(r'(\w\w)', # match pairs of 'word' characters
           r'\\x\1',  # insert \x
            x[b:e])
    return y
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.