Python is a versatile programming language.

পাইথন একটি বহুমুখী প্রোগ্রামিং ভাষা।


Hackers often use Python for its powerful libraries.

হ্যাকাররা প্রায়শই পাইথন ব্যবহার করে এর শক্তিশালী লাইব্রেরির জন্য।


The book explains how to build your own debugger.

বইটি ব্যাখ্যা করে কিভাবে আপনার নিজস্ব ডিবাগার তৈরি করবেন।


You will learn about fuzzing Windows drivers.

আপনি উইন্ডোজ ড্রাইভারগুলিকে ফাজিং সম্পর্কে শিখবেন।


আপনার সিস্টেমে পাইথন ২.৫ ইনস্টল করুন।


This chapter covers setting up the development environment.

এই অধ্যায়টি উন্নয়ন পরিবেশ সেট আপ করার বিষয়ে আলোচনা করে।


কোডের উদাহরণগুলো অনুসরণ করা সহজ।


Debugging is a crucial skill for hackers.

ডিবাগিং হ্যাকারদের জন্য একটি গুরুত্বপূর্ণ দক্ষতা।


বইটিতে ব্যবহারিক উদাহরণ দেওয়া হয়েছে।


You can automate many security tasks with Python.

আপনি পাইথন দিয়ে অনেক নিরাপত্তা কাজ স্বয়ংক্রিয় করতে পারেন।


লেখক একজন নিরাপত্তা গবেষক।


The book is for hackers and reverse engineers.

বইটি হ্যাকার এবং রিভার্স ইঞ্জিনিয়ারদের জন্য।


Python has become the language of choice for many.

পাইথন অনেকের জন্য পছন্দের ভাষা হয়ে উঠেছে।


The book covers various hacking techniques.

বইটিতে বিভিন্ন হ্যাকিং কৌশল নিয়ে আলোচনা করা হয়েছে।


কিভাবে সুরক্ষিত ট্র্যাফিক সনাক্ত করতে হয় তা শিখুন।


The book explains code and library injection.

বইটিতে কোড এবং লাইব্রেরি ইনজেকশন ব্যাখ্যা করা হয়েছে।


বিশ্বের সেরা হ্যাকাররা পাইথন ব্যবহার করে।


এই বইটি একটি মূল্যবান সম্পদ।


The author provides detailed explanations.

লেখক বিস্তারিত ব্যাখ্যা প্রদান করেন।


The book is well-structured and easy to read.

বইটি সুগঠিত এবং পড়তে সহজ।


The Python interactive shell provides full access to the Python interpreter.

পাইথন ইন্টারেক্টিভ শেল পাইথন ইন্টারপ্রেটারের সম্পূর্ণ অ্যাক্সেস সরবরাহ করে।


To ensure your user environment knows where to find the Python interpreter, you must edit the .bashrc file.

আপনার ব্যবহারকারীর পরিবেশটি পাইথন ইন্টারপ্রেটারটি কোথায় খুঁজে পাবে তা নিশ্চিত করতে, আপনাকে .bashrc ফাইলটি সম্পাদনা করতে হবে।


I personally use nano to do all of my text editing.

আমি ব্যক্তিগতভাবে আমার সমস্ত টেক্সট সম্পাদনার জন্য ন্যানো ব্যবহার করি।


Open the /root/.bashrc file, and at the bottom of the file add the following line: export PATH=/usr/local/Python25/:$PATH

/root/.bashrc ফাইলটি খুলুন, এবং ফাইলের নীচে নিম্নলিখিত লাইনটি যোগ করুন: export PATH=/usr/local/Python25/:$PATH


If you log out and log back in as root, when you type python at any point in your command shell you will be prompted by the Python interpreter.

আপনি যদি লগ আউট করেন এবং রুট হিসাবে আবার লগ ইন করেন, তবে আপনার কমান্ড শেলে যেকোনো সময়ে পাইথন টাইপ করলে আপনাকে পাইথন ইন্টারপ্রেটার দ্বারা অনুরোধ করা হবে।


Now that you have a fully operational Python interpreter on both Windows and Linux, it’s time to set up your integrated development environment (IDE).

আপনার কাছে উইন্ডোজ এবং লিনাক্স উভয় ক্ষেত্রেই একটি সম্পূর্ণ কার্যকরী পাইথন ইন্টারপ্রেটার রয়েছে, এখন আপনার ইন্টিগ্রেটেড ডেভেলপমেন্ট এনভায়রনমেন্ট (IDE) সেট আপ করার সময় এসেছে।


In order to rapidly develop and debug Python applications, it is absolutely necessary to utilize a solid IDE.

পাইথন অ্যাপ্লিকেশনগুলি দ্রুত বিকাশ এবং ডিবাগ করার জন্য, একটি নির্ভরযোগ্য IDE ব্যবহার করা একেবারে প্রয়োজনীয়।


The coupling of the popular Eclipse development environment and a module called PyDev gives you a tremendous number of powerful features.

জনপ্রিয় Eclipse উন্নয়ন পরিবেশ এবং PyDev নামক একটি মডিউলের সংযোগ আপনাকে প্রচুর সংখ্যক শক্তিশালী বৈশিষ্ট্য সরবরাহ করে।


In addition, Eclipse runs on Windows, Linux, and Mac and has excellent community support.

এছাড়াও, Eclipse উইন্ডোজ, লিনাক্স এবং ম্যাক-এ চলে এবং চমৎকার কমিউনিটি সমর্থন রয়েছে।


Let’s quickly run through how to set up and configure Eclipse and PyDev.

আসুন দ্রুত দেখে নেওয়া যাক কীভাবে Eclipse এবং PyDev সেট আপ ও কনফিগার করতে হয়।


Download the Eclipse Classic package from http://www.eclipse.org/downloads/.

http://www.eclipse.org/downloads/ থেকে Eclipse ক্লাসিক প্যাকেজটি ডাউনলোড করুন।


এটি C:\Eclipse-এ আনজিপ করুন।


The first time it starts, it will ask where to store your workspace; you can accept the default.

প্রথমবার শুরু হলে, এটি আপনার ওয়ার্কস্পেস কোথায় সংরক্ষণ করতে হবে তা জিজ্ঞাসা করবে; আপনি ডিফল্ট গ্রহণ করতে পারেন।


Once Eclipse has fired up, choose Help -> Software Updates -> Find and Install.

একবার Eclipse চালু হয়ে গেলে, Help -> Software Updates -> Find and Install নির্বাচন করুন।


Select the radio button labeled Search for new features to install and click Next.

ইনস্টল করার জন্য নতুন বৈশিষ্ট্যগুলির জন্য অনুসন্ধান করুন লেবেলযুক্ত রেডিও বোতামটি নির্বাচন করুন এবং Next-এ ক্লিক করুন।


In the Name field enter a descriptive string like PyDev Update.

Name ফিল্ডে PyDev Update-এর মতো একটি বর্ণনামূলক স্ট্রিং লিখুন।


Make sure the URL field contains http://pydev.sourceforge.net/updates/ and click OK.

নিশ্চিত করুন যে URL ফিল্ডে http://pydev.sourceforge.net/updates/ রয়েছে এবং OK-তে ক্লিক করুন।


Then click Finish, which will kick in the Eclipse updater.

তারপরে Finish-এ ক্লিক করুন, যা Eclipse আপডেটারকে সক্রিয় করবে।


The updates dialog will appear after a few moments.

কয়েক মুহূর্ত পরে আপডেটের ডায়ালগ প্রদর্শিত হবে।


The ESP register is used to track the very top of the stack frame.

ইএসপি রেজিস্টারটি স্ট্যাক ফ্রেমের একেবারে উপরের অংশটি ট্র্যাক করতে ব্যবহৃত হয়।


The EBP register is used to track the bottom of the stack frame.

ইবিপি রেজিস্টারটি স্ট্যাক ফ্রেমের নীচে ট্র্যাক করতে ব্যবহৃত হয়।


The stack grows from high memory addresses to low memory addresses.

স্ট্যাক উচ্চ মেমরি ঠিকানা থেকে নিম্ন মেমরি ঠিকানায় বৃদ্ধি পায়।


Let’s use our previously covered function my_socks() as a simplified example of how the stack works.

আসুন স্ট্যাক কীভাবে কাজ করে তার একটি সরলীকৃত উদাহরণ হিসাবে আমাদের পূর্বে আচ্ছাদিত my_socks() ফাংশনটি ব্যবহার করি।


When the my_socks() function returns, it pops off all the values on the stack.

যখন my_socks() ফাংশনটি ফিরে আসে, তখন এটি স্ট্যাকের সমস্ত মান সরিয়ে দেয়।


Local variables are slices of memory that are valid only for the function that is executing.

স্থানীয় ভেরিয়েবলগুলি মেমরির অংশ যা শুধুমাত্র সেই ফাংশনের জন্য বৈধ যা কার্যকর হচ্ছে।


The variable stinky_sock_color_one would be allocated on the stack.

stinky_sock_color_one ভেরিয়েবলটি স্ট্যাকে বরাদ্দ করা হবে।


The ability to capture the stack frame inside a debugger is very useful.

একটি ডিবাগারের ভিতরে স্ট্যাক ফ্রেম ক্যাপচার করার ক্ষমতা খুবই উপযোগী।


Debuggers run as an endless loop that waits for a debugging event to occur.

ডিগাররা একটি অবিরাম লুপ হিসাবে চলে যা একটি ডিবাগিং ইভেন্ট ঘটার জন্য অপেক্ষা করে।


Some of the common events that a debugger must trap are these: Breakpoint hits, Memory violations, Exceptions generated by the debugged program.

কিছু সাধারণ ঘটনা যা একটি ডিগারকে অবশ্যই আটকাতে হবে তা হল: ব্রেকপয়েন্ট হিট, মেমরি লঙ্ঘন, ডিবাগ করা প্রোগ্রাম দ্বারা উত্পন্ন ব্যতিক্রম।


The ability to create these customized handlers not only saves time, but it also enables a far wider degree of control over the debugged process.

এই কাস্টমাইজড হ্যান্ডলার তৈরি করার ক্ষমতা শুধুমাত্র সময় বাঁচায় না, তবে এটি ডিবাগ করা প্রক্রিয়ার উপর আরও বিস্তৃত নিয়ন্ত্রণও সক্ষম করে।


By halting the process, you are able to inspect variables, stack arguments, and memory locations.

প্রক্রিয়াটি বন্ধ করার মাধ্যমে, আপনি ভেরিয়েবল, স্ট্যাক আর্গুমেন্ট এবং মেমরি লোকেশনগুলি পরিদর্শন করতে সক্ষম হন।


There are three primary breakpoint types: soft breakpoints, hardware breakpoints, and memory breakpoints.

এখানে তিনটি প্রধান ব্রেকপয়েন্ট প্রকার রয়েছে: সফট ব্রেকপয়েন্ট, হার্ডওয়্যার ব্রেকপয়েন্ট এবং মেমরি ব্রেকপয়েন্ট।


A soft breakpoint is a single-byte instruction that stops execution.

একটি সফট ব্রেকপয়েন্ট হল একটি একক-বাইট নির্দেশ যা কার্যকর করা বন্ধ করে দেয়।


An assembly instruction is a high-level representation of a command for the CPU to execute.

একটি অ্যাসেম্বলি নির্দেশ হল সিপিইউকে কার্যকর করার জন্য একটি কমান্ডের উচ্চ-স্তরের উপস্থাপনা।


An operation code, or opcode, is a machine language command that the CPU executes.

একটি অপারেশন কোড, বা অপকোড, একটি মেশিন ভাষার কমান্ড যা CPU কার্যকর করে।


If the instruction we covered previously was at address 0x44332211, a common representation would look like this: 0x44332211: 8BC3 MOV EAX, EBX

যদি আমরা পূর্বে যে নির্দেশটি কভার করেছি তা 0x44332211-এ ছিল, তবে একটি সাধারণ উপস্থাপনা এইরকম দেখাবে: 0x44332211: 8BC3 MOV EAX, EBX


When the CPU comes skipping along and hits that byte, it halts, firing an INT3 event.

যখন CPU ছুটে আসে এবং সেই বাইটটি হিট করে, তখন এটি থেমে যায়, একটি INT3 ইভেন্ট ফায়ার করে।


Debuggers have the built-in ability to handle this event.

ডিগারদের এই ইভেন্টটি পরিচালনা করার অন্তর্নির্মিত ক্ষমতা রয়েছে।


A CRC will take a range of values—in this case the running process’s memory—and hash the contents.

একটি CRC মানগুলির একটি পরিসর নেবে—এই ক্ষেত্রে চলমান প্রক্রিয়ার মেমরি—এবং বিষয়বস্তুগুলিকে হ্যাশ করবে।


The debugger attaches to the process using the DebugActiveProcess() function.

ডিবাগার DebugActiveProcess() ফাংশন ব্যবহার করে প্রক্রিয়াটির সাথে সংযুক্ত হয়।


We simply pass it the PID of the process we wish to attach to.

আমরা কেবল সেই প্রক্রিয়ার পিআইডি (PID) দিই যার সাথে আমরা সংযোগ করতে চাই।


Once the system determines that we have appropriate rights to access the process, the target process assumes that the attaching process (the debugger) is ready to handle debug events.

সিস্টেমটি একবার নিশ্চিত করে যে আমাদের প্রক্রিয়াটি অ্যাক্সেস করার উপযুক্ত অধিকার রয়েছে, তখন লক্ষ্য প্রক্রিয়াটি ধরে নেয় যে সংযোগকারী প্রক্রিয়া (ডিবাগার) ডিবাগ ইভেন্টগুলি পরিচালনা করতে প্রস্তুত।


The debugger traps these debugging events by calling WaitForDebugEvent() in a loop.

ডিবাগার একটি লুপে WaitForDebugEvent() কল করে এই ডিবাগিং ইভেন্টগুলিকে আটকে দেয়।


The first parameter is a pointer to the DEBUG_EVENT struct; this structure describes a debugging event.

প্রথম প্যারামিটারটি DEBUG_EVENT কাঠামোর একটি পয়েন্টার; এই কাঠামোটি একটি ডিবাগিং ইভেন্ট বর্ণনা করে।


For each event that the debugger catches, there are associated event handlers that perform some type of action before letting the process continue.

ডিবাগার ধরা প্রতিটি ইভেন্টের জন্য, সংশ্লিষ্ট ইভেন্ট হ্যান্ডলার রয়েছে যা প্রক্রিয়াটি চালিয়ে যাওয়ার আগে কিছু ধরণের ক্রিয়া সম্পাদন করে।


This is achieved using the ContinueDebugEvent() function.

এটি ContinueDebugEvent() ফাংশন ব্যবহার করে সম্পন্ন করা হয়।


The dwProcessId and dwThreadId parameters are fields in the DEBUG_EVENT struct, which gets initialized when the debugger catches a debugging event.

dwProcessId এবং dwThreadId প্যারামিটারগুলি DEBUG_EVENT কাঠামোর ক্ষেত্র, যা ডিবাগার একটি ডিবাগিং ইভেন্ট ধরলে আরম্ভ করা হয়।


The only thing left to do is to detach from the process.

কেবল প্রক্রিয়া থেকে সংযোগ বিচ্ছিন্ন করাই এখন বাকি।


Do this by calling DebugActiveProcessStop(), which takes the PID that you wish to detach from as its only parameter.

DebugActiveProcessStop() কল করে এটি করুন, যা একমাত্র প্যারামিটার হিসাবে আপনি যে PID থেকে সংযোগ বিচ্ছিন্ন করতে চান সেটি গ্রহণ করে।


Let’s put all of this together and extend our my_debugger class by providing it the ability to attach to and detach from a process.

আসুন এই সব একসাথে রাখি এবং একটি প্রক্রিয়ার সাথে সংযুক্ত এবং সংযোগ বিচ্ছিন্ন করার ক্ষমতা প্রদান করে আমাদের my_debugger ক্লাসটি প্রসারিত করি।


We will also add the ability to open and obtain a process handle.

আমরা একটি প্রক্রিয়া হ্যান্ডেল খুলতে এবং পেতে সক্ষমতাও যুক্ত করব।


The final implementation detail will be to create our primary debug loop to handle debugging events.

চূড়ান্ত বাস্তবায়ন বিবরণ হবে ডিবাগিং ইভেন্টগুলি পরিচালনা করার জন্য আমাদের প্রাথমিক ডিবাগ লুপ তৈরি করা।


Download this file now and overwrite your current copy.

এখনই এই ফাইলটি ডাউনলোড করুন এবং আপনার বর্তমান কপিটি ওভাররাইট করুন।


We won’t cover the creation of structs, unions, and constants any further, as you should feel intimately familiar with them by now.

আমরা কাঠামো, ইউনিয়ন এবং ধ্রুবক তৈরি করা নিয়ে আর আলোচনা করব না, কারণ এখন আপনার এগুলির সাথে ভালোভাবে পরিচিত হওয়া উচিত।


Now that we have explained the basics of obtaining a process handle, creating a debugged process, and attaching to a running process, we are ready to dive into more advanced features that our debugger will support.

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


A debugger must be able to capture the state of the CPU registers at any given point and time.

একটি ডিবাগারকে অবশ্যই যে কোনও নির্দিষ্ট সময়ে সিপিইউ রেজিস্টারগুলির অবস্থা ক্যাপচার করতে সক্ষম হতে হবে।


This allows us to determine the state of the stack when an exception occurs, where the instruction pointer is currently executing, and other useful tidbits of information.

এটি আমাদের ব্যতিক্রম ঘটলে স্ট্যাকের অবস্থা, বর্তমানে নির্দেশ পয়েন্টার কোথায় কার্যকর হচ্ছে এবং অন্যান্য দরকারী তথ্য নির্ধারণ করতে সহায়তা করে।


We first must obtain a handle to the currently executing thread in the debuggee, which is achieved by using the OpenThread() function.

প্রথমে আমাদের ডিবাগীতে বর্তমানে কার্যকর হওয়া থ্রেডের একটি হ্যান্ডেল পেতে হবে, যা OpenThread() ফাংশন ব্যবহার করে অর্জন করা হয়।


In order to obtain register state from a process, we have to be able to enumerate through all of the running threads inside the process.

একটি প্রক্রিয়া থেকে রেজিস্টার অবস্থা পেতে, আমাদের প্রক্রিয়ার ভিতরে চলমান সমস্ত থ্রেড গণনা করতে সক্ষম হতে হবে।


থ্রেড আইডি: ৩১৪৮ ইভেন্ট কোড: ৬


প্রথম ব্রেকপয়েন্ট আঘাত করা হয়েছে।


We can first see that printf() resolves to 0x77c4186a, and so we set our breakpoint on that address.

আমরা প্রথমে দেখতে পাচ্ছি যে printf() 0x77c4186a তে সমাধান করে, এবং তাই আমরা সেই ঠিকানায় আমাদের ব্রেকপয়েন্ট সেট করি।


After the break- point is handled, the process should resume its loop.

ব্রেকপয়েন্টটি পরিচালনা করার পরে, প্রক্রিয়াটি তার লুপটি পুনরায় শুরু করা উচিত।


Our debugger now supports soft breakpoints, so let’s move on to hardware breakpoints.

আমাদের ডিবাগিং এখন সফট ব্রেকপয়েন্ট সমর্থন করে, তাই আসুন হার্ডওয়্যার ব্রেকপয়েন্টগুলিতে যাই।


The second type of breakpoint is the hardware breakpoint, which involves setting certain bits in the CPU’s debug registers.

দ্বিতীয় প্রকারের ব্রেকপয়েন্ট হল হার্ডওয়্যার ব্রেকপয়েন্ট, যার মধ্যে CPU-এর ডিবাগ রেজিস্টারে নির্দিষ্ট বিট সেট করা জড়িত।


The important thing to remember when managing hardware breakpoints is tracking which of the four available debug registers are free for use and which are already being used.

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


Let’s start by enumerating all of the threads in the process and obtain a CPU context record for each of them.

আসুন প্রক্রিয়াটিতে সমস্ত থ্রেড গণনা করে শুরু করি এবং তাদের প্রত্যেকের জন্য একটি CPU প্রসঙ্গ রেকর্ড সংগ্রহ করি।


Using the retrieved context record, we then modify one of the registers between DR0 and DR3 (depending on which are free) to contain the desired breakpoint address.

সংগৃহীত প্রসঙ্গ রেকর্ড ব্যবহার করে, আমরা DR0 এবং DR3 এর মধ্যে একটি রেজিস্টার পরিবর্তন করি (যেটি বিনামূল্যে তার উপর নির্ভর করে) পছন্দসই ব্রেকপয়েন্ট ঠিকানা ধারণ করার জন্য।


We then flip the appro- priate bits in the DR7 register to enable the breakpoint and set its type and length.

তারপরে আমরা ব্রেকপয়েন্ট সক্ষম করতে এবং এর প্রকার ও দৈর্ঘ্য সেট করতে DR7 রেজিস্টারে উপযুক্ত বিটগুলি উল্টাই।


Once we have created the routine to set the breakpoint, we need to modify our main debug event loop so that it can appropriately handle the exception that is thrown by a hardware breakpoint.

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


We know that a hardware breakpoint triggers an INT1 (or single-step event), so we simply add another exception handler to our debug loop.

আমরা জানি যে একটি হার্ডওয়্যার ব্রেকপয়েন্ট একটি INT1 (বা একক-পদক্ষেপ ইভেন্ট) ট্রিগার করে, তাই আমরা কেবল আমাদের ডিবাগ লুপে আরেকটি ব্যতিক্রম হ্যান্ডলার যোগ করি।


Let’s start with setting the breakpoint.

আসুন ব্রেকপয়েন্ট সেট করা দিয়ে শুরু করি।


You can see that we select an open slot to store the breakpoint by checking the global hardware_breakpoints dictionary.

আপনি দেখতে পাচ্ছেন যে আমরা গ্লোবাল hardware_breakpoints ডিকশনারি পরীক্ষা করে ব্রেকপয়েন্ট সংরক্ষণ করার জন্য একটি খোলা স্লট নির্বাচন করি।


Now that we have the mechanism to support setting the breakpoints, let’s update our event loop and add an exception handler to support the INT1 interrupt.

এখন যেহেতু আমাদের ব্রেকপয়েন্ট সেট করার জন্য সমর্থন করার প্রক্রিয়া রয়েছে, আসুন আমাদের ইভেন্ট লুপ আপডেট করি এবং INT1 ইন্টারাপ্ট সমর্থন করার জন্য একটি ব্যতিক্রম হ্যান্ডলার যোগ করি।


If the debugger detects that there is a hardware breakpoint at the exception address, it zeros out the flags in DR7 and resets the debug register that contains the breakpoint address.

যদি ডিবাগার সনাক্ত করে যে ব্যতিক্রমের ঠিকানায় একটি হার্ডওয়্যার ব্রেকপয়েন্ট রয়েছে, তবে এটি DR7-এর পতাকাগুলিকে শূন্য করে এবং ডিবাগ রেজিস্টারটিকে পুনরায় সেট করে যাতে ব্রেকপয়েন্ট ঠিকানা থাকে।


Let’s see this process in action by modifying our my_test.py script to use hardware breakpoints on our printf() call.

আসুন আমাদের my_test.py স্ক্রিপ্টটি সংশোধন করে এই প্রক্রিয়াটি কাজে লাগাই যাতে আমাদের printf() কলে হার্ডওয়্যার ব্রেকপয়েন্ট ব্যবহার করা যায়।


This harness simply sets a breakpoint on the printf() call whenever it gets executed.

এই হারনেসটি কেবল printf() কলে একটি ব্রেকপয়েন্ট সেট করে যখনই এটি কার্যকর করা হয়।


You will notice that in this harness we imported the my_debugger_defines.py file; this is so we can access the HW_EXECUTE constant, which provides a little code clarity.

আপনি লক্ষ্য করবেন যে এই হারনেসে আমরা my_debugger_defines.py ফাইলটি আমদানি করেছি; এটি করার কারণ হল আমরা HW_EXECUTE ধ্রুবক অ্যাক্সেস করতে পারি, যা সামান্য কোড স্পষ্টতা প্রদান করে।


You can see from the order of events that an exception gets thrown, and our handler removes the breakpoint.

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


At any later point you can revert the process to the point where the snapshot was taken.

যে কোনও সময়ে, আপনি প্রক্রিয়াটিকে সেই বিন্দুতে ফিরিয়ে আনতে পারেন যেখানে স্ন্যাপশট নেওয়া হয়েছিল।


This can be quite handy when reverse engineering a binary or analyzing a crash.

একটি বাইনারি বিপরীত প্রকৌশল বা ক্র্যাশ বিশ্লেষণ করার সময় এটি বেশ কার্যকর হতে পারে।


Our first step is to get an accurate picture of what the target process was up to at a precise moment.

আমাদের প্রথম পদক্ষেপ হল একটি নির্দিষ্ট মুহূর্তে লক্ষ্য প্রক্রিয়াটি কী করছিল তার একটি সঠিক চিত্র পাওয়া।


As well, we need to obtain all of the process’s memory pages and their contents.

এছাড়াও, আমাদের প্রক্রিয়ার সমস্ত মেমরি পৃষ্ঠা এবং তাদের বিষয়বস্তু পেতে হবে।


Once we have this information, it’s just a matter of storing it for when we want to restore a snapshot.

একবার আমাদের কাছে এই তথ্য থাকলে, এটি কেবল তখনই সংরক্ষণ করার বিষয় যখন আমরা একটি স্ন্যাপশট পুনরুদ্ধার করতে চাই।


Before we can take the process snapshots, we have to suspend all threads of execution so that they don’t change data or state while the snapshot is being taken.

প্রসেস স্ন্যাপশট নেওয়ার আগে, আমাদের সমস্ত থ্রেড স্থগিত করতে হবে যাতে স্ন্যাপশট নেওয়ার সময় তারা ডেটা বা অবস্থা পরিবর্তন না করে।


To suspend all threads in PyDbg, we use suspend_all_threads(), and to resume all the threads, we use the aptly named resume_all_threads().

PyDbg-তে সমস্ত থ্রেড স্থগিত করতে, আমরা suspend_all_threads() ব্যবহার করি এবং সমস্ত থ্রেড পুনরায় শুরু করতে, আমরা উপযুক্তভাবে resume_all_threads() ব্যবহার করি।


Once we have suspended the threads, we simply make a call to process_snapshot().

থ্রেডগুলি স্থগিত করার পরে, আমরা কেবল process_snapshot() কল করি।


This automatically fetches all of the contextual information about each thread and all memory at that precise moment.

এটি স্বয়ংক্রিয়ভাবে প্রতিটি থ্রেড এবং সেই মুহূর্তের সমস্ত মেমরির প্রাসঙ্গিক তথ্য সংগ্রহ করে।


Once the snapshot is finished, we resume all of the threads.

স্ন্যাপশট শেষ হওয়ার পরে, আমরা সমস্ত থ্রেড পুনরায় শুরু করি।


When we want to restore the process to the snapshot point, we suspend all of the threads, call process_restore(), and resume all of the threads.

যখন আমরা প্রক্রিয়াটিকে স্ন্যাপশট পয়েন্টে পুনরুদ্ধার করতে চাই, তখন আমরা সমস্ত থ্রেড স্থগিত করি, process_restore() কল করি এবং সমস্ত থ্রেড পুনরায় শুরু করি।


Once we resume the process, we should be back at our original snapshot point.

একবার আমরা প্রক্রিয়াটি পুনরায় শুরু করলে, আমরা আমাদের আসল স্ন্যাপশট পয়েন্টে ফিরে আসব।


বেশ সুন্দর, তাই না?


To try this out, let’s use a simple example where we allow a user to hit a key to take a snapshot and hit a key again to restore the snapshot.

এটি চেষ্টা করার জন্য, আসুন একটি সাধারণ উদাহরণ ব্যবহার করি যেখানে আমরা ব্যবহারকারীকে একটি স্ন্যাপশট নিতে এবং স্ন্যাপশট পুনরুদ্ধার করতে আবার একটি কী চাপতে অনুমতি দিই।


Open a new Python file, call it snapshot.py, and enter the following code.

একটি নতুন পাইথন ফাইল খুলুন, এটিকে snapshot.py বলুন এবং নিম্নলিখিত কোডটি লিখুন।


So the first step is to start the target application under a debugger thread.

সুতরাং প্রথম পদক্ষেপ হল একটি ডিবাগিং থ্রেডের অধীনে লক্ষ্য অ্যাপ্লিকেশনটি শুরু করা।


By using separate threads, we can enter snapshotting commands without forcing the target application to pause while it waits for our input.

আলাদা থ্রেড ব্যবহার করে, আমরা আমাদের ইনপুটের জন্য অপেক্ষা করার সময় লক্ষ্য অ্যাপ্লিকেশনটিকে বিরতি দিতে বাধ্য না করে স্ন্যাপশটিং কমান্ড প্রবেশ করতে পারি।


Once the debugger thread has returned a valid PID, we start up a new thread that will take our input.

ডিবাগার থ্রেড একটি বৈধ PID ফেরত দেওয়ার পরে, আমরা একটি নতুন থ্রেড শুরু করি যা আমাদের ইনপুট নেবে।


Then when we send it a command, it will evaluate whether we are taking a snapshot, restoring a snapshot, or quitting.

তারপরে যখন আমরা এটিকে একটি কমান্ড পাঠাই, তখন এটি মূল্যায়ন করবে যে আমরা একটি স্ন্যাপশট নিচ্ছি, একটি স্ন্যাপশট পুনরুদ্ধার করছি, নাকি প্রস্থান করছি।


The reason I picked Calculator as an example application is that we can actually see this snapshotting process in action.

আমি ক্যালকুলেটরকে একটি উদাহরণ অ্যাপ্লিকেশন হিসাবে বেছে নেওয়ার কারণ হল আমরা আসলে এই স্ন্যাপশটিং প্রক্রিয়াটি কর্মে দেখতে পারি।


The file fuzzer selects a file randomly from a directory.

ফাইল ফাজার একটি ডিরেক্টরি থেকে এলোমেলোভাবে একটি ফাইল নির্বাচন করে।


It then copies the selected file to a test location.

তারপরে এটি নির্বাচিত ফাইলটিকে একটি পরীক্ষার স্থানে অনুলিপি করে।


The fuzzer applies mutations to the test file.

ফাজার পরীক্ষার ফাইলে পরিবর্তনগুলি প্রয়োগ করে।


A debugger thread is started to load the target application.

লক্ষ্য অ্যাপ্লিকেশন লোড করার জন্য একটি ডিবাগার থ্রেড শুরু করা হয়।


The monitoring thread ensures the application terminates after a set time.

মনিটরিং থ্রেড নিশ্চিত করে যে একটি নির্দিষ্ট সময়ের পরে অ্যাপ্লিকেশনটি বন্ধ হয়ে যায়।


The fuzzer increments the iteration count.

ফাজার পুনরাবৃত্তির সংখ্যা বৃদ্ধি করে।


The mutate_file function is responsible for modifying the file.

mutate_file ফাংশনটি ফাইলের পরিবর্তনের জন্য দায়ী।


A random test case is selected from a list.

একটি তালিকা থেকে একটি এলোমেলো পরীক্ষার কেস নির্বাচন করা হয়।


The test case is applied to a random position in the file.

পরীক্ষার কেসটি ফাইলের একটি এলোমেলো অবস্থানে প্রয়োগ করা হয়।


The fuzzer writes the mutated file to the test location.

ফাজার পরিবর্তিত ফাইলটিকে পরীক্ষার স্থানে লিখে দেয়।


The fuzzer uses command-line options for configuration.

ফাজার কনফিগারেশনের জন্য কমান্ড-লাইন বিকল্পগুলি ব্যবহার করে।


The -e flag specifies the executable path.

-e ফ্ল্যাগটি এক্সিকিউটেবল পাথ নির্দিষ্ট করে।


The -x option defines the file extension.

-x বিকল্পটি ফাইলের এক্সটেনশন সংজ্ঞায়িত করে।


-n প্যারামিটার বিজ্ঞপ্তিগুলি সক্ষম করে।


Code coverage is a metric for measuring code execution.

কোড কভারেজ হল কোড কার্যকর করার পরিমাপের একটি মেট্রিক।


Automated static analysis can find vulnerabilities.

স্বয়ংক্রিয় স্ট্যাটিক বিশ্লেষণ দুর্বলতা খুঁজে বের করতে পারে।


Sulley is a Python-based fuzzing framework.

সুলি একটি পাইথন-ভিত্তিক ফাজিং ফ্রেমওয়ার্ক।


সুলি ব্লক-ভিত্তিক ফাজিং ব্যবহার করে।


Primitives are the building blocks of protocol descriptions in Sulley.

সুলি-তে প্রোটোকল বর্ণনাগুলির বিল্ডিং ব্লক হল আদিম উপাদান।


Strings, delimiters, and integers are examples of primitives.

স্ট্রিং, ডিলিমিটার এবং পূর্ণসংখ্যা আদিম উপাদানের উদাহরণ।


The FastLogHook object stores the captured information in an allocated region of memory.

ফাস্টলগহুক অবজেক্টটি ধারণ করা তথ্য মেমরির একটি নির্দিষ্ট অঞ্চলে সংরক্ষণ করে।


You must query this page using the wrapper function getAllLog().

আপনাকে getAllLog() র‍্যাপার ফাংশন ব্যবহার করে এই পৃষ্ঠাটি জিজ্ঞাসা করতে হবে।


Each time a hooked function gets hit, its address is stored in hook_address.

প্রতিবার একটি হুক করা ফাংশন আঘাত করলে, তার ঠিকানা হুক_অ্যাড্রেসে সংরক্ষিত হয়।


The final important note is that there is an additional flavor of FastLogHook, STDCALLFastLogHook.

সর্বশেষ গুরুত্বপূর্ণ বিষয় হল ফাস্টলগহুকের একটি অতিরিক্ত প্রকার রয়েছে, সেটি হল STDCALLFastLogHook।


For the cdecl convention use the normal FastLogHook.

cdecl কনভেনশনের জন্য সাধারণ FastLogHook ব্যবহার করুন।


An excellent example of harnessing the power of the hard hook is the hippie PyCommand.

হার্ড হুকের ক্ষমতা কাজে লাগানোর একটি চমৎকার উদাহরণ হল হিপ্পি পাইকমান্ড।


Hippie came out as a response for the need of a high-performance logging hook.

একটি উচ্চ-কার্যকারিতা সম্পন্ন লগিং হুকের প্রয়োজনে হিপ্পি তৈরি করা হয়েছিল।


If you open a file dialog on it, it requires around 4,500 calls to either RtlAllocateHeap or RtlFreeHeap.

আপনি যদি এটির উপর একটি ফাইল ডায়ালগ খোলেন, তাহলে এটি হয় RtlAllocateHeap অথবা RtlFreeHeap-এর প্রায় ৪,৫০০টি কল প্রয়োজন।


If you’re targeting Internet Explorer, you’ll see an increase in the number of heap-related function calls of 10 times or more.

আপনি যদি ইন্টারনেট এক্সপ্লোরারের লক্ষ্য রাখেন, তাহলে আপনি হিপ-সম্পর্কিত ফাংশন কলের সংখ্যা ১০ গুণ বা তার বেশি বৃদ্ধি দেখতে পাবেন।


We can use hippie as an example of how to instrument heap routines.

আমরা হিপ রুটিনগুলি কীভাবে ইন্সট্রুমেন্ট করতে হয় তার উদাহরণ হিসেবে হিপ্পি ব্যবহার করতে পারি।


For brevity’s sake, we’ll walk through only the core hooking portions of hippie.

সংক্ষিপ্ততার জন্য, আমরা শুধুমাত্র হিপ্পির মূল হুকিং অংশগুলির মধ্য দিয়ে যাব।


Before we begin, it’s important to understand the RtlAllocateHeap and RtlFreeHeap function prototypes.

শুরু করার আগে, RtlAllocateHeap এবং RtlFreeHeap ফাংশন প্রোটোটাইপগুলি বোঝা গুরুত্বপূর্ণ।


So for RtlFreeHeap we are going to trap all three arguments.

সুতরাং RtlFreeHeap-এর জন্য আমরা তিনটি আর্গুমেন্টই ধরব।


Now that we have an understanding of the hook points, open up a new Python file.

এখন যেহেতু আমাদের হুক পয়েন্টগুলির ধারণা আছে, একটি নতুন পাইথন ফাইল খুলুন।


This is Nico's function that looks for the correct basic block.

এটি নিকোর ফাংশন যা সঠিক বেসিক ব্লকের সন্ধান করে।


A simple wrapper to just print out the hook results in a friendly manner.

একটি সাধারণ র‍্যাপার যা কেবল বন্ধুত্বপূর্ণ উপায়ে হুকের ফলাফলগুলি প্রিন্ট করে।


We have previously set hooks, so we must want to print the results.

আমরা আগে হুক সেট করেছি, তাই আমরা ফলাফলগুলি প্রিন্ট করতে চাই।


We want to stop the debugger before monkeying around.

আমরা ঘোরাঘুরি করার আগে ডিবাগগার বন্ধ করতে চাই।


We are trapping RtlAllocateHeap at the end of the function.

আমরা ফাংশনের শেষে RtlAllocateHeap ধরছি।


We are trapping RtlFreeHeap at the head of the function.

আমরা ফাংশনের শুরুতে RtlFreeHeap ধরছি।


Without specialized tools, a computer user can’t see the contents of ADSs.

বিশেষ সরঞ্জাম ছাড়া, একজন কম্পিউটার ব্যবহারকারী ADS-এর বিষয়বস্তু দেখতে পারে না।


In addition, a number of security products don’t properly scan alternate data streams.

এছাড়াও, বেশ কয়েকটি সুরক্ষা পণ্য বিকল্প ডেটা স্ট্রিমগুলি সঠিকভাবে স্ক্যান করে না।


To use an alternate data stream on a file, we’ll need to do nothing more than append a colon and a filename to an existing file.

একটি ফাইলে বিকল্প ডেটা স্ট্রিম ব্যবহার করতে, আমাদের বিদ্যমান ফাইলে একটি কোলন এবং একটি ফাইলের নাম যোগ করা ছাড়া আর কিছু করতে হবে না।


In this case we are accessing vncdll.dll, which is stored in an alternate data stream attached to reverser.exe.

এই ক্ষেত্রে আমরা vncdll.dll অ্যাক্সেস করছি, যা reverser.exe-এর সাথে সংযুক্ত একটি বিকল্প ডেটা স্ট্রিমে সংরক্ষিত আছে।


Let’s write a quick utility script that simply reads in a file and writes it out to an ADS attached to a file of our choosing.

আসুন একটি দ্রুত ইউটিলিটি স্ক্রিপ্ট লিখি যা কেবল একটি ফাইল পড়ে এবং আমাদের পছন্দের একটি ফাইলের সাথে সংযুক্ত একটি ADS-এ লিখে দেয়।


The first command-line argument is the DLL we wish to read in, and the second argument is the target file whose ADS we will be storing the DLL in.

প্রথম কমান্ড-লাইন আর্গুমেন্টটি হল DLL যা আমরা পড়তে চাই, এবং দ্বিতীয় আর্গুমেন্টটি হল সেই টার্গেট ফাইলটিতে যার ADS-এ আমরা DLL সংরক্ষণ করব।


We can use this little utility to store any kind of files we would like alongside the executable, and we can inject DLLs directly out of the ADS as well.

আমরা এই ছোট ইউটিলিটিটি ব্যবহার করে নির্বাহযোগ্য ফাইলের পাশাপাশি যেকোনো ধরনের ফাইল সংরক্ষণ করতে পারি এবং আমরা ADS থেকে সরাসরি DLL ইনজেক্ট করতে পারি।


Although we won’t be utilizing DLL injection for our back- door, it will still support it, so read on.

যদিও আমরা আমাদের ব্যাক-ডোরের জন্য DLL ইনজেকশন ব্যবহার করব না, এটি এখনও এটিকে সমর্থন করবে, তাই পড়তে থাকুন।


Let’s start by building our execution redirection code, which very simply starts up an application of our choosing.

আসুন আমাদের এক্সিকিউশন রিডাইরেকশন কোড তৈরি করা শুরু করি, যা খুব সহজে আমাদের পছন্দের একটি অ্যাপ্লিকেশন চালু করে।


When the user attempts to use the calculator, she will be inadvertently running our backdoor, which in turn will start the proper calculator and thus not alert the user that anything is amiss.

যখন ব্যবহারকারী ক্যালকুলেটর ব্যবহার করার চেষ্টা করবে, তখন সে অসাবধানতাবশত আমাদের ব্যাকডোর চালাবে, যা পরিবর্তে সঠিক ক্যালকুলেটর শুরু করবে এবং এইভাবে ব্যবহারকারীকে সতর্ক করবে না যে কিছু ভুল আছে।


Note that we are including the my_debugger_defines.py file from Chapter 3, which contains all of the necessary constants and structs in order to do the process creation.

লক্ষ্য করুন যে আমরা তৃতীয় অধ্যায় থেকে my_debugger_defines.py ফাইলটি অন্তর্ভুক্ত করছি, যাতে প্রক্রিয়া তৈরির জন্য প্রয়োজনীয় সমস্ত ধ্রুবক এবং কাঠামো রয়েছে।


Before we move into the DLL injection code, we are going to explore how we can hide the DLL itself before using it for the injection.

আমরা DLL ইনজেকশন কোডে যাওয়ার আগে, আমরা এটি ইনজেকশনের জন্য ব্যবহার করার আগে কীভাবে DLL নিজেই লুকানো যায় তা অন্বেষণ করতে যাচ্ছি।


Let’s add our injection code to the backdoor; just tack it on right after the process-creation section.

আসুন ব্যাকডোরে আমাদের ইনজেকশন কোড যোগ করি; প্রক্রিয়া-সৃষ্টি বিভাগের ঠিক পরেই এটি যুক্ত করুন।


Our injection function will also be able to handle code or DLL injection; simply set the parameter flag to 1, and the data variable will then contain the path to the DLL.

আমাদের ইনজেকশন ফাংশন কোড বা DLL ইনজেকশন পরিচালনা করতে সক্ষম হবে; কেবল প্যারামিটার ফ্ল্যাগটিকে 1 এ সেট করুন এবং ডেটা ভেরিয়েবলটিতে DLL-এর পথ থাকবে।


We now have a supported injection function that can handle both code and DLL injection.

আমাদের এখন একটি সমর্থিত ইনজেকশন ফাংশন আছে যা কোড এবং DLL উভয় ইনজেকশন পরিচালনা করতে পারে।


Now it’s time to inject two separate pieces of shellcode into the real calc.exe process, one to give us the reverse shell and one to kill our deviant process.

এখন সময় এসেছে আসল calc.exe প্রক্রিয়ায় শেলকোডের দুটি আলাদা অংশ ইনজেক্ট করার, একটি আমাদের বিপরীত শেল দেবে এবং অন্যটি আমাদের বিচ্যুত প্রক্রিয়াটিকে মেরে ফেলবে।


All right! We pass in the process ID of our backdoor process and inject the shellcode into the process we spawned (the second calc.exe, the one with buttons and numbers on it), which then kills our backdoor.

ঠিক আছে! আমরা আমাদের ব্যাকডোর প্রক্রিয়ার প্রক্রিয়া আইডি পাস করি এবং আমরা যে প্রক্রিয়াটি তৈরি করেছি তাতে শেলকোড ইনজেক্ট করি (দ্বিতীয় calc.exe, যেটিতে বোতাম এবং সংখ্যা রয়েছে), যা পরে আমাদের ব্যাকডোরকে মেরে ফেলে।


We now have a fairly comprehensive backdoor that utilizes some stealth, and better yet, we get access to the target machine every time someone runs the application we are interested in.

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


An approach you can use in the field is if you have compromised a user’s system and the user has access to propriety or password- protected software, you can swap out the binaries.

আপনি ক্ষেত্রে ব্যবহার করতে পারেন এমন একটি পদ্ধতি হল যদি আপনি ব্যবহারকারীর সিস্টেমে আপস করেন এবং ব্যবহারকারীর মালিকানা বা পাসওয়ার্ড-সুরক্ষিত সফ্টওয়্যার অ্যাক্সেস থাকে, তাহলে আপনি বাইনারিগুলি অদলবদল করতে পারেন।


We have one small thing to take care of: How are we going to guarantee that the remote user has Python installed so we can run our backdoor?

আমাদের একটি ছোট জিনিস দেখাশোনা করতে হবে: আমরা কীভাবে গ্যারান্টি দেব যে দূরবর্তী ব্যবহারকারীর পাইথন ইনস্টল করা আছে যাতে আমরা আমাদের ব্যাকডোর চালাতে পারি?


The problem with simply setting up your shellcode to make this call is that it takes some NULL parameters as well, which is problematic for most shellcode.

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


So the trick involves landing our shellcode in the middle of a function that will call NtSetInformationProcess() with the necessary parameters already on the stack.

সুতরাং কৌশলটিতে আমাদের শেলকোডকে একটি ফাংশনের মাঝখানে স্থাপন করা জড়িত যা ইতিমধ্যে স্ট্যাকের প্রয়োজনীয় প্যারামিটারগুলির সাথে NtSetInformationProcess() কল করবে।


There is a known spot in ntdll.dll that will accomplish this for us.

ntdll.dll-এ একটি পরিচিত স্থান রয়েছে যা আমাদের জন্য এটি সম্পন্ন করবে।


Take a peek at the disassembly output from ntdll.dll on Windows XP SP2 captured using Immunity Debugger.

ইমিউনিটি ডিবাগার ব্যবহার করে ধরা পড়া উইন্ডোজ এক্সপি এসপি2-এ ntdll.dll থেকে ডিসঅ্যাসেম্বলি আউটপুট-এর দিকে একবার তাকান।


The NtSetInformationProcess() function definition can be found at http://undocumented.ntinternals .net/UserMode/Undocumented%20Functions/NT%20Objects/Process/NtSetInformationProcess.html.

NtSetInformationProcess() ফাংশন সংজ্ঞাটি http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Process/NtSetInformationProcess.html-এ পাওয়া যেতে পারে।


Following this code flow, we see a comparison against AL for the value of 1, and then ESI is filled with the value 2.

এই কোড প্রবাহ অনুসরণ করে, আমরা 1-এর মানের জন্য AL-এর সাথে একটি তুলনা দেখি এবং তারপরে ESI 2 মান দিয়ে পূর্ণ হয়।


If AL evaluates to 1, then there is a conditional jump to 0x7C93FEBA.

যদি AL 1-এর সমান হয়, তাহলে 0x7C93FEBA-তে একটি শর্তসাপেক্ষ জাম্প হবে।


From there ESI gets moved into a stack variable at EBP-4 (remember that ESI is still set to 2).

সেখান থেকে ESI-কে EBP-4-এ একটি স্ট্যাক ভেরিয়েবলে সরিয়ে নেওয়া হয় (মনে রাখবেন যে ESI এখনও 2-এ সেট করা আছে)।


Then there is an unconditional jump to 0x7C91D403, which checks our stack variable (still set to 2) to make sure it’s non-zero, and then a conditional jump to 0x7C935D6D.

তারপরে 0x7C91D403-এ একটি শর্তহীন জাম্প হয়, যা আমাদের স্ট্যাক ভেরিয়েবল পরীক্ষা করে (এখনও 2-এ সেট করা আছে) এটি শূন্য নয় তা নিশ্চিত করতে, এবং তারপরে 0x7C935D6D-এ একটি শর্তসাপেক্ষ জাম্প হয়।


Here is where it gets interesting; we see the value 4 being pushed to the stack, our EBP-4 variable (still set to 2!) being loaded into the EAX register, then that value being pushed onto the stack, followed by the value 0x22 being pushed and the value of -1 (-1 as a process handle tells the function call that it’s the current process to be DEP-disabled) being pushed, and then a call to ZwSetInformationProcess (an alias for NtSetInformationProcess).

এখানেই এটি আকর্ষণীয় হয়ে ওঠে; আমরা 4 মানটি স্ট্যাক-এ ঠেলে দেওয়া দেখছি, আমাদের EBP-4 ভেরিয়েবল (এখনও 2-এ সেট করা আছে!) EAX রেজিস্টারে লোড করা হচ্ছে, তারপর সেই মানটি স্ট্যাক-এ ঠেলে দেওয়া হচ্ছে, তারপরে 0x22 মানটি ঠেলে দেওয়া হচ্ছে এবং -1-এর মান (-1 একটি প্রক্রিয়া হ্যান্ডেল হিসাবে ফাংশন কলকে বলে যে এটি বর্তমান প্রক্রিয়া যা DEP-অক্ষম করা হবে) ঠেলে দেওয়া হচ্ছে, এবং তারপরে ZwSetInformationProcess-এর একটি কল (NtSetInformationProcess-এর একটি উপনাম)।


So really what’s happened in this code flow is a function call being set up for NtSetInformationProcess(), like so: NtSetInformationProcess( -1, 0x22, 0x2, 0x4 ) Perfect!

সুতরাং, এই কোড প্রবাহে যা ঘটেছে তা হল NtSetInformationProcess() এর জন্য একটি ফাংশন কল সেট আপ করা হচ্ছে, যেমন: NtSetInformationProcess( -1, 0x22, 0x2, 0x4 ) পারফেক্ট!


This will disable DEP for the current process, but we first have to get our exploit code to land us at 0x7C91D3F8 in order to have this code executed.

এটি বর্তমান প্রক্রিয়ার জন্য DEP অক্ষম করবে, তবে এই কোডটি কার্যকর করার জন্য আমাদের প্রথমে আমাদের এক্সপ্লয়েট কোডটিকে 0x7C91D3F8-এ অবতরণ করতে হবে।


Before we hit that spot we also need to make sure that we have AL (the low byte in the EAX register) set to 1.

আমরা সেই স্থানে আঘাত করার আগে আমাদের এটাও নিশ্চিত করতে হবে যে আমাদের AL (EAX রেজিস্টারের নিম্ন বাইট) 1-এ সেট করা আছে।


Once we have met these two pre- requisites, we will then be able to transfer control back to our shellcode like any other overflow, via a JMP ESP instruction, for example.

একবার আমরা এই দুটি পূর্বশর্ত পূরণ করলে, আমরা অন্য কোনো ওভারফ্লোর মতো আমাদের শেলকোডে নিয়ন্ত্রণ স্থানান্তর করতে সক্ষম হব, উদাহরণস্বরূপ, একটি JMP ESP নির্দেশের মাধ্যমে।


So to review our three prerequisite addresses we need: An address that sets AL to 1 and then returns.

সুতরাং আমাদের তিনটি প্রয়োজনীয় ঠিকানা পর্যালোচনা করতে হবে: এমন একটি ঠিকানা যা AL কে 1-এ সেট করে এবং তারপর ফিরে আসে।


Normally you would have to hunt around manually for these addresses, but the exploit developers at Immunity have created a little Python called findantidep.py, which has a wizard that guides you through the process of finding these addresses.

সাধারণত, আপনাকে এই ঠিকানাগুলির জন্য ম্যানুয়ালি চারপাশে অনুসন্ধান করতে হবে, তবে ইমিউনিটির এক্সপ্লয়েট ডেভেলপাররা findantidep.py নামে একটি ছোট পাইথন তৈরি করেছে, যার একটি উইজার্ড রয়েছে যা আপনাকে এই ঠিকানাগুলি খুঁজে পাওয়ার প্রক্রিয়ার মাধ্যমে গাইড করে।


It even creates the exploit string that you can copy and paste into your exploit to use these offsets with no effort.

এটি এমনকি এক্সপ্লয়েট স্ট্রিং তৈরি করে যা আপনি এই অফসেটগুলি ব্যবহার করার জন্য কোনো প্রচেষ্টা ছাড়াই আপনার এক্সপ্লয়েটে কপি এবং পেস্ট করতে পারেন।


Let’s take a look at the findantidep.py script and then take it for a test drive.

আসুন findantidep.py স্ক্রিপ্টটি একবার দেখে নেওয়া যাক এবং তারপর এটি পরীক্ষা করার জন্য ব্যবহার করি।


So we first search for commands that will set AL to 1 and then give the user the option of selecting from a list of addresses to use.

সুতরাং আমরা প্রথমে এমন কমান্ডগুলির জন্য অনুসন্ধান করি যা AL কে 1-এ সেট করবে এবং তারপরে ব্যবহারকারীকে ব্যবহারের জন্য ঠিকানাগুলির একটি তালিকা থেকে নির্বাচন করার বিকল্প দেবে।


The third step is to let the user enter the instruction or instructions that will land the user back in the shellcode, and we let the user pick from a list of addresses where those specific instructions can be found.

তৃতীয় ধাপ হল ব্যবহারকারীকে সেই নির্দেশ বা নির্দেশাবলী প্রবেশ করতে দেওয়া যা ব্যবহারকারীকে শেলকোডে ফিরিয়ে আনবে এবং আমরা ব্যবহারকারীকে সেই নির্দিষ্ট নির্দেশাবলী খুঁজে পাওয়া যেতে পারে এমন ঠিকানাগুলির একটি তালিকা থেকে বেছে নিতে দিই।


Since the USER and PASS commands are only a small subset of the FTP server’s full capabilities, let’s throw in a couple of commands to test for some more bugs once we are authenticated.

যেহেতু ইউজার এবং পাসওয়ার্ড কমান্ডগুলি FTP সার্ভারের সম্পূর্ণ ক্ষমতার একটি ছোট অংশ, তাই প্রমাণীকরণের পরে আরও কিছু বাগ পরীক্ষা করার জন্য আসুন কয়েকটি কমান্ড যোগ করি।


Take a look at Listing 9-2 for some additional commands we will include in our protocol skeleton.

আমাদের প্রোটোকল কঙ্কালে আমরা যে অতিরিক্ত কিছু কমান্ড অন্তর্ভুক্ত করব তার জন্য তালিকা 9-2 দেখুন।


To gain a full understanding of all commands supported by the FTP protocol, please refer to its RFC.

FTP প্রোটোকল দ্বারা সমর্থিত সমস্ত কমান্ড সম্পর্কে সম্পূর্ণ ধারণা পেতে, অনুগ্রহ করে এর RFC দেখুন।


CWD <DIRECTORY> - change working directory to DIRECTORY

CWD <DIRECTORY> - কাজের ডিরেক্টরি পরিবর্তন করে DIRECTORY করুন


DELE <FILENAME> - delete a remote file FILENAME

DELE <FILENAME> - একটি দূরবর্তী ফাইল FILENAME মুছুন


MDTM <FILENAME> - return last modified time for file FILENAME

MDTM <FILENAME> - ফাইলের শেষ পরিবর্তনের সময় ফেরত দিন FILENAME


MKD <DIRECTORY> - create directory DIRECTORY

MKD <DIRECTORY> - ডিরেক্টরি তৈরি করুন DIRECTORY


It’s a far from an exhaustive list, but it gives us some additional coverage, so let’s take what we know and translate it into a Sulley protocol description.

এটি একটি সম্পূর্ণ তালিকা থেকে অনেক দূরে, তবে এটি আমাদের কিছু অতিরিক্ত কভারেজ দেয়, তাই আসুন আমরা যা জানি তা নিয়ে একটি সুলি প্রোটোকল বর্ণনায় অনুবাদ করি।


We’ll use our knowledge of Sulley data primitives to turn Sulley into a lean, mean FTP server–breaking machine.

আমরা সুলি ডেটা আদিম সম্পর্কে আমাদের জ্ঞান ব্যবহার করে সুলি-কে একটি দুর্বল, গড় FTP সার্ভার–ভাঙা মেশিনে পরিণত করব।


Warm up your code editor, create a new file called ftp.py, and enter the following code.

আপনার কোড সম্পাদক গরম করুন, ftp.py নামে একটি নতুন ফাইল তৈরি করুন এবং নিম্নলিখিত কোডটি লিখুন।


With the protocol skeleton now created, let’s move on to creating a Sulley session that will tie together all of our request information as well as set up the network sniffer and the debugging client.

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


Sulley sessions are the mechanism that ties together requests and takes care of the network packet capture, process debugging, crash reporting, and virtual machine control.

সুলি সেশনগুলি হল সেই প্রক্রিয়া যা অনুরোধগুলিকে একত্রিত করে এবং নেটওয়ার্ক প্যাকেট ক্যাপচার, প্রক্রিয়া ডিবাগিং, ক্র্যাশ রিপোর্টিং এবং ভার্চুয়াল মেশিন নিয়ন্ত্রণের যত্ন নেয়।


To begin, let’s define a sessions file and dissect the various parts.

শুরু করতে, আসুন একটি সেশন ফাইল সংজ্ঞায়িত করি এবং বিভিন্ন অংশ বিশ্লেষণ করি।


Crack open a new Python file, name it ftp_session.py, and enter the following code.

একটি নতুন পাইথন ফাইল খুলুন, এর নাম দিন ftp_session.py, এবং নিম্নলিখিত কোডটি লিখুন।


The receive_ftp_banner() function is necessary because every FTP server has a banner that it displays when a client connects.

receive_ftp_banner() ফাংশনটি প্রয়োজনীয় কারণ প্রতিটি FTP সার্ভারের একটি ব্যানার রয়েছে যা এটি ক্লায়েন্ট সংযোগ করার সময় প্রদর্শন করে।


We tie this to the sess.pre_send property, which tells Sulley to receive the FTP banner before sending any fuzz data.

আমরা এটিকে sess.pre_send বৈশিষ্ট্যের সাথে যুক্ত করি, যা সুলি-কে কোনো ফাজ ডেটা পাঠানোর আগে FTP ব্যানার গ্রহণ করতে বলে।


The pre_send property also passes in a valid Python socket object, so our function takes that as its only parameter.

pre_send বৈশিষ্ট্যটি একটি বৈধ পাইথন সকেট অবজেক্টও পাস করে, তাই আমাদের ফাংশন এটিকে তার একমাত্র প্যারামিটার হিসেবে নেয়।


The first step in creating the session is to define a session file that keeps track of the current state of our fuzzer.

সেশন তৈরি করার প্রথম ধাপ হল একটি সেশন ফাইল সংজ্ঞায়িত করা যা আমাদের ফuzzer-এর বর্তমান অবস্থার উপর নজর রাখে।


This persistent file allows us to start and stop the fuzzer whenever we please.

এই স্থায়ী ফাইলটি আমাদের যখন খুশি তখন ফাজ করা শুরু এবং বন্ধ করার অনুমতি দেয়।


The second step is to define a target to attack, which is an IP address and a port number.

দ্বিতীয় ধাপ হল আক্রমণের জন্য একটি লক্ষ্য নির্ধারণ করা, যা একটি আইপি ঠিকানা এবং একটি পোর্ট নম্বর।


Listing 11-1. Cross References to sprintf

তালিকা ১১-১। sprintf-এর ক্রস রেফারেন্স


All of the addresses that are listed are locations where the sprintf function is being called.

যে ঠিকানাগুলো তালিকাভুক্ত করা হয়েছে, সেগুলো হল সেই স্থান যেখানে sprintf ফাংশনটিকে কল করা হচ্ছে।


We’ll use IDAPython to iterate through all of the functions in a target binary and set breakpoints on the head of each address.

আমরা একটি টার্গেট বাইনারিতে সমস্ত ফাংশনের মাধ্যমে পুনরাবৃত্তি করতে IDAPython ব্যবহার করব এবং প্রতিটি ঠিকানার শুরুতে ব্রেকপয়েন্ট সেট করব।


Open a new Python file, name it func_coverage.py, and enter the following code.

একটি নতুন পাইথন ফাইল খুলুন, এটির নাম দিন func_coverage.py, এবং নিম্নলিখিত কোডটি লিখুন।


First we set up our debugger hook so that it gets called whenever a debugger event is thrown.

প্রথমে আমরা আমাদের ডিবাগিং হুক সেট আপ করি যাতে একটি ডিবাগার ইভেন্ট ঘটলে এটি কল করা হয়।


We then iterate through all of the function addresses and set a breakpoint on each address.

এরপরে আমরা সমস্ত ফাংশন ঠিকানাগুলির মাধ্যমে পুনরাবৃত্তি করি এবং প্রতিটি ঠিকানায় একটি ব্রেকপয়েন্ট সেট করি।


The SetBptAttr call sets a flag to tell the debugger not to stop when each breakpoint is hit.

SetBptAttr কলটি একটি ফ্ল্যাগ সেট করে যা ডিবাগারকে বলে প্রতিটি ব্রেকপয়েন্ট হিট হওয়ার সময় যেন না থামে।


We then print out the total number of breakpoints that are set.

তারপরে আমরা সেট করা ব্রেকপয়েন্টগুলির মোট সংখ্যা প্রিন্ট করি।


Our breakpoint handler prints out the address of each breakpoint that was hit, using the ea variable.

আমাদের ব্রেকপয়েন্ট হ্যান্ডলার ea ভেরিয়েবল ব্যবহার করে প্রতিটি ব্রেকপয়েন্টের ঠিকানা প্রিন্ট করে যা হিট হয়েছিল।


Now run the debugger (hotkey = F9), and you should start seeing output showing the functions that are hit.

এখন ডিবাগার চালান (হটকি = F9), এবং আপনি হিট হওয়া ফাংশনগুলি দেখাচ্ছে এমন আউটপুট দেখতে শুরু করবেন।


At times when assessing a binary for possible vulnerabilities, it’s important to understand the stack size of particular function calls.

সম্ভাব্য দুর্বলতার জন্য একটি বাইনারি মূল্যায়ন করার সময়, নির্দিষ্ট ফাংশন কলগুলির স্ট্যাকের আকার বোঝা গুরুত্বপূর্ণ।


Let’s write some code to iterate through all of the functions in a binary and show us all functions that have stack-allocated buffers that may be of interest.

আসুন কিছু কোড লিখি যা একটি বাইনারিতে সমস্ত ফাংশনের মাধ্যমে পুনরাবৃত্তি করবে এবং আমাদের সেই সমস্ত ফাংশন দেখাবে যেগুলিতে স্ট্যাক-অ্যালোকেটেড বাফার রয়েছে যা আগ্রহের হতে পারে।


Open a new Python file, name it stack_calc.py, and enter the following code.

একটি নতুন পাইথন ফাইল খুলুন, এটির নাম দিন stack_calc.py, এবং নিম্নলিখিত কোডটি লিখুন।


We set a size threshold that determines how large a stack variable should be before we consider it a buffer.

আমরা একটি আকারের থ্রেশহোল্ড সেট করি যা নির্ধারণ করে যে একটি স্ট্যাক ভেরিয়েবলকে বাফার হিসাবে বিবেচনা করার আগে এটি কতটা বড় হওয়া উচিত।


We then begin iterating through all of the functions, obtaining the stack frame object for each function.

এরপরে আমরা সমস্ত ফাংশনের মাধ্যমে পুনরাবৃত্তি শুরু করি, প্রতিটি ফাংশনের জন্য স্ট্যাক ফ্রেম অবজেক্ট অর্জন করি।


Using the stack frame object, we use the GetStrucSize method to determine the size of the stack frame in bytes.

স্ট্যাক ফ্রেম অবজেক্ট ব্যবহার করে, আমরা বাইটে স্ট্যাক ফ্রেমের আকার নির্ধারণ করতে GetStrucSize পদ্ধতিটি ব্যবহার করি।


After running this against a binary, you should see some output (providing there are some stack- allocated buffers).

একটি বাইনারির বিপরীতে এটি চালানোর পরে, আপনি কিছু আউটপুট দেখতে পাবেন (যদি কিছু স্ট্যাক-অ্যালোকেটেড বাফার থাকে)।


You should now have the fundamentals for using IDAPython and have some core utility scripts that you can easily extend, combine, or enhance.

আপনার এখন IDAPython ব্যবহার করার মৌলিক বিষয়গুলি জানা উচিত এবং কিছু মূল ইউটিলিটি স্ক্রিপ্ট থাকা উচিত যা আপনি সহজেই প্রসারিত, একত্রিত বা উন্নত করতে পারেন।


PyEmu was released at BlackHat 2007 by Cody Pierce, one of the talented members of the TippingPoint DVLabs team.

Cody Pierce, TippingPoint DVLabs টিমের একজন প্রতিভাবান সদস্য, ব্ল্যাকহ্যাট ২০০৭-এ PyEmu প্রকাশ করেন।


PyEmu has three methods to enable emulation: IDAPyEmu, PyDbgPyEmu, and PEPyEmu.

PyEmu-এর এমুলেশন সক্ষম করার জন্য তিনটি পদ্ধতি রয়েছে: IDAPyEmu, PyDbgPyEmu, এবং PEPyEmu।


You can see that we discovered a valid device name, \Device\Beep, in three lines of code.

আপনি দেখতে পাচ্ছেন যে আমরা তিনটি লাইনের কোডে একটি বৈধ ডিভাইসের নাম, \Device\Beep, আবিষ্কার করেছি।


Now let’s move on to discovering the primary IOCTL dispatch function and the IOCTL codes that a driver supports.

আসুন এখন প্রধান IOCTL প্রেরণ ফাংশন এবং একটি ড্রাইভার সমর্থন করে এমন IOCTL কোডগুলি আবিষ্কার করতে যাই।


Any driver that implements an IOCTL interface must have an IOCTL dispatch routine that handles the processing of the various IOCTL requests.

যে কোনও ড্রাইভার যা একটি IOCTL ইন্টারফেস প্রয়োগ করে তার একটি IOCTL প্রেরণ রুটিন থাকতে হবে যা বিভিন্ন IOCTL অনুরোধের প্রক্রিয়াকরণ পরিচালনা করে।


When a driver loads, the first function that gets called is the DriverEntry routine.

যখন একটি ড্রাইভার লোড হয়, তখন প্রথম যে ফাংশনটি কল করা হয় তা হল DriverEntry রুটিন।


This line is telling the driver that the IOCTLDispatch function handles all IOCTL requests.

এই লাইনটি ড্রাইভারকে বলছে যে IOCTLDispatch ফাংশন সমস্ত IOCTL অনুরোধ পরিচালনা করে।


Using these instructions, we can then deduce where the IOCTL-handling routine lives ( CONSTANT), and that is where we can begin searching for the various IOCTL codes.

এই নির্দেশাবলী ব্যবহার করে, আমরা তখন অনুমান করতে পারি যে IOCTL-হ্যান্ডলিং রুটিনটি কোথায় থাকে (CONSTANT), এবং সেখানেই আমরা বিভিন্ন IOCTL কোডের জন্য অনুসন্ধান শুরু করতে পারি।


This code utilizes Immunity Debugger’s powerful search API to find all possible matches against our search criteria.

এই কোডটি আমাদের অনুসন্ধানের মানদণ্ডের বিরুদ্ধে সমস্ত সম্ভাব্য মিল খুঁজে বের করার জন্য ইমিউনিটি ডিবাগারের শক্তিশালী অনুসন্ধান API ব্যবহার করে।


Once we have found a match, we send a Function object back that represents the IOCTL dispatch function where our hunt for valid IOCTL codes will begin.

একবার আমরা একটি মিল খুঁজে পেলে, আমরা একটি ফাংশন অবজেক্ট ফেরত পাঠাই যা IOCTL প্রেরণ ফাংশনকে উপস্থাপন করে যেখানে আমাদের বৈধ IOCTL কোডের সন্ধান শুরু হবে।


Next let’s take a look at the IOCTL dispatch function itself and how to apply some simple heuristics to try to find all of the IOCTL codes a device supports.

পরবর্তীকালে আসুন IOCTL প্রেরণ ফাংশনটি নিজেই দেখি এবং একটি ডিভাইস সমর্থন করে এমন সমস্ত IOCTL কোড খুঁজে বের করার জন্য কিছু সাধারণ হিউরিস্টিক কীভাবে প্রয়োগ করতে হয় তা দেখি।


The IOCTL dispatch routine commonly will perform various actions based on the value of the code being passed in to the routine.

IOCTL প্রেরণ রুটিন সাধারণত রুটিংয়ে পাঠানো কোডের মানের উপর ভিত্তি করে বিভিন্ন ক্রিয়া সম্পাদন করবে।


We want to be able to exercise each of the possible paths that are determined by the IOCTL code, which is why we go to all the trouble of finding these values.

আমরা IOCTL কোড দ্বারা নির্ধারিত প্রতিটি সম্ভাব্য পথ অনুশীলন করতে সক্ষম হতে চাই, যে কারণে আমরা এই মানগুলি খুঁজে বের করার জন্য সমস্ত সমস্যায় যাই।


Let’s first examine what the C source code for a skeleton IOCTL dispatch function would look like, and then we’ll see how to decode the assembly to retrieve the IOCTL code values.

আসুন প্রথমে পরীক্ষা করি যে একটি কঙ্কাল IOCTL প্রেরণ ফাংশনের জন্য C সোর্স কোড কেমন দেখাবে এবং তারপরে আমরা দেখব কিভাবে IOCTL কোড মান পুনরুদ্ধার করতে অ্যাসেম্বলি ডিকোড করতে হয়।


Once the function code has been retrieved from the IOCTL request, it is common to see a switch statement in place to determine what action the driver is to perform based on the IOCTL code being sent in.

একবার ফাংশন কোডটি IOCTL অনুরোধ থেকে পুনরুদ্ধার করা হলে, ড্রাইভারকে পাঠানো IOCTL কোডের উপর ভিত্তি করে কী পদক্ষেপ নিতে হবে তা নির্ধারণ করতে একটি সুইচ স্টেটমেন্ট দেখা সাধারণ।


There can be many ways that the switch statement gets translated into assembly, but these are the most common two that I have encountered.

সুইচ স্টেটমেন্ট অ্যাসেম্বলিতে অনুবাদ করার অনেক উপায় থাকতে পারে, তবে আমি সম্মুখীন হয়েছি এমন দুটি সবচেয়ে সাধারণ উপায় হল এইগুলি।


In the first case, where we see a series of CMP instructions, we simply look for the constant that is being compared against the passed-in IOCTL.

প্রথম ক্ষেত্রে, যেখানে আমরা CMP নির্দেশাবলীর একটি সিরিজ দেখি, আমরা কেবল সেই ধ্রুবকটি দেখি যা পাস করা IOCTL-এর সাথে তুলনা করা হচ্ছে।


That constant should be a valid IOCTL code that the driver supports.

সেই ধ্রুবকটি একটি বৈধ IOCTL কোড হওয়া উচিত যা ড্রাইভার সমর্থন করে।


Take a look at the well-commented getIOCTLCodes() function inside the Libs\driverlib.py directory of your Immunity Debugger installation.

আপনার ইমিউনিটি ডিবাগার ইনস্টলেশনের Libs\driverlib.py ডিরেক্টরির ভিতরে ভালোভাবে মন্তব্য করা getIOCTLCodes() ফাংশনটি দেখুন।


Now that we know how driverlib does some of our dirty work for us, let’s take advantage of it!

এখন যেহেতু আমরা জানি কিভাবে ড্রাইভারলিব আমাদের কিছু কঠিন কাজ করে, আসুন এটির সুবিধা নিই!


We will use driverlib to hunt down device names and supported IOCTL codes from a driver and save these results to a Python pickle.

আমরা একটি ড্রাইভার থেকে ডিভাইসের নাম এবং সমর্থিত IOCTL কোডগুলি খুঁজে বের করতে এবং এই ফলাফলগুলি একটি পাইথন পিকলে সংরক্ষণ করতে ড্রাইভারলিব ব্যবহার করব।


Simply load a target driver into Immunity Debugger and run the PyCommand like so: !ioctl_dump.

সহজভাবে একটি টার্গেট ড্রাইভারকে ইমিউনিটি ডিবাগারে লোড করুন এবং PyCommand চালান: !ioctl_dump।


First we instantiate the IDAPyEmu object.

প্রথমত, আমরা IDAPyEmu অবজেক্ট তৈরি করি।


We then load the code and data sections of the binary into PyEmu’s memory.

তারপর আমরা বাইনারির কোড এবং ডেটা সেকশনগুলি PyEmu-এর মেমরিতে লোড করি।


We are using the IDAPython SegByName() function to find the beginning of the sections and the SegEnd() function to determine the end of the sections.

আমরা সেকশনগুলির শুরু খুঁজে বের করার জন্য IDAPython SegByName() ফাংশন এবং সেকশনগুলির শেষ নির্ধারণের জন্য SegEnd() ফাংশন ব্যবহার করছি।


Then we simply iterate over the sections byte by byte to store them in PyEmu’s memory.

তারপর আমরা সেগুলিকে PyEmu-এর মেমরিতে সংরক্ষণ করার জন্য কেবল সেকশনগুলির উপর বাইট বাইট করে পুনরাবৃত্তি করি।


Now that we have the code and data sections loaded into memory, we are going to set up the stack parameters for the function call.

এখন আমাদের মেমরিতে কোড এবং ডেটা সেকশন লোড করা আছে, আমরা ফাংশন কলের জন্য স্ট্যাক প্যারামিটার সেট আপ করতে যাচ্ছি।


We first set EIP to the head of the function, which is located at 0x00401000.

প্রথমে, আমরা EIP-কে ফাংশনের শুরুতে সেট করি, যা 0x00401000-এ অবস্থিত।


Next we set up the mnemonic, or instruction, handler to be called when the function’s retn instruction is executed.

পরবর্তীকালে, আমরা স্মৃতিচিহ্ন বা নির্দেশাবলী প্রস্তুত করি, অথবা যখন ফাংশনের retn নির্দেশ কার্যকর করা হয়, তখন হ্যান্ডলারকে কল করা হয়।


The third step is to set the stack parameters for the function call.

তৃতীয় ধাপ হল ফাংশন কলের জন্য স্ট্যাক প্যারামিটার সেট করা।


These are the two numbers to be added together; in our case we are using 0x00000001 and 0x00000002.

এগুলি হল দুটি সংখ্যা যা একসাথে যোগ করতে হবে; আমাদের ক্ষেত্রে, আমরা 0x00000001 এবং 0x00000002 ব্যবহার করছি।


We then tell PyEmu to execute all 10 instructions contained within the function.

তারপর আমরা PyEmu-কে ফাংশনের মধ্যে থাকা সমস্ত 10টি নির্দেশ কার্যকর করতে বলি।


The last step is coding the retn instruction handler, so the final script should look like the following.

শেষ ধাপ হল retn নির্দেশ হ্যান্ডলার কোড করা, তাই চূড়ান্ত স্ক্রিপ্টটি নিম্নলিখিতের মতো হওয়া উচিত।


The ret instruction handler simply retrieves the stack arguments and the value of the EAX register and outputs the result of the function call.

ret নির্দেশ হ্যান্ডলার কেবল স্ট্যাক আর্গুমেন্ট এবং EAX রেজিস্টারের মান পুনরুদ্ধার করে এবং ফাংশন কলের ফলাফল আউটপুট করে।


Practice loading different binaries into IDA, pick a random function, and try to emulate calls to it.

IDA-তে বিভিন্ন বাইনারি লোড করার অনুশীলন করুন, একটি এলোমেলো ফাংশন বেছে নিন এবং এটিতে কলগুলি অনুকরণ করার চেষ্টা করুন।


You’d be amazed at how powerful this technique can be when a function has hundreds or thousands of instructions with many branches, loops, and return points.

যখন একটি ফাংশনে শত শত বা হাজার হাজার নির্দেশাবলী থাকে, অনেক শাখা, লুপ এবং রিটার্ন পয়েন্ট সহ, তখন এই কৌশলটি কতটা শক্তিশালী হতে পারে তা দেখে আপনি অবাক হবেন।


Using this method of reversing a function can save you hours of manual reversing.

একটি ফাংশন বিপরীত করার এই পদ্ধতি ব্যবহার করে আপনি ম্যানুয়াল বিপরীত করার কয়েক ঘন্টা বাঁচাতে পারেন।


Now let’s use the PEPyEmu library to unpack a compressed executable.

আসুন এখন একটি সংকুচিত এক্সিকিউটেবল আনপ্যাক করতে PEPyEmu লাইব্রেরি ব্যবহার করি।


Executable packers or compressors have been around for quite some time.

এক্সিকিউটেবল প্যাকার বা কম্প্রেসার বেশ কিছু সময় ধরে বিদ্যমান।


A typical packer will compress the code and data segments of the target binary and replace the entry point with a decompressor.

একটি সাধারণ প্যাকার টার্গেট বাইনারির কোড এবং ডেটা সেগমেন্টগুলিকে সংকুচিত করবে এবং এন্ট্রি পয়েন্টটিকে একটি ডিকম্প্রেসারের সাথে প্রতিস্থাপন করবে।


When the binary is executed, the decompressor runs, which decompresses the original binary into memory, and then jumps to the original entry point (OEP) of the binary.

যখন বাইনারিটি কার্যকর করা হয়, তখন ডিকম্প্রেসার চলে, যা মূল বাইনারিটিকে মেমরিতে ডিকম্প্রেস করে এবং তারপর বাইনারির মূল এন্ট্রি পয়েন্টে (OEP) ঝাঁপ দেয়।


Once the OEP is reached, the binary begins executing normally.

একবার OEP-তে পৌঁছে গেলে, বাইনারি স্বাভাবিকভাবে কার্যকর হতে শুরু করে।


Python is fast becoming the programming language of choice for hackers, reverse engineers, and software testers because it’s easy to write quickly, and it has the low-level support and libraries that make hackers happy.

হ্যাকার, রিভার্স ইঞ্জিনিয়ার এবং সফ্টওয়্যার পরীক্ষকদের জন্য পাইথন দ্রুত পছন্দের প্রোগ্রামিং ভাষা হয়ে উঠছে কারণ এটি দ্রুত লেখা সহজ, এবং এতে নিম্ন-স্তরের সমর্থন এবং লাইব্রেরি রয়েছে যা হ্যাকারদের খুশি করে।


But until now, there has been no real manual on how to use Python for a variety of hacking tasks.

কিন্তু এত দিন পর্যন্ত, হ্যাকিংয়ের বিভিন্ন কাজের জন্য পাইথন কীভাবে ব্যবহার করবেন তার উপর কোনও বাস্তব ম্যানুয়াল ছিল না।


Gray Hat Python explains the concepts behind hacking tools and techniques like debuggers, trojans, fuzzers, and emulators.

গ্রে হ্যাট পাইথন ডিবাগার, ট্রোজান, ফাজার এবং ইমুলেটরের মতো হ্যাকিং সরঞ্জাম এবং কৌশলগুলির পেছনের ধারণাগুলি ব্যাখ্যা করে।


But author Justin Seitz goes beyond theory, showing you how to harness existing Python-based security tools — and how to build your own when the pre-built ones won’t cut it.

কিন্তু লেখক জাস্টিন সিইজ তত্ত্বের বাইরে গিয়ে দেখিয়েছেন কীভাবে বিদ্যমান পাইথন-ভিত্তিক সুরক্ষা সরঞ্জামগুলি ব্যবহার করতে হয় — এবং কীভাবে আপনার নিজস্ব তৈরি করতে হয় যখন আগে থেকে তৈরি করাগুলি কাজ করে না।


You’ll learn how to: Automate tedious reversing and security tasks.

আপনি শিখবেন কিভাবে: বিরক্তিকর রিভার্সিং এবং নিরাপত্তা কাজ স্বয়ংক্রিয় করতে হয়।


আপনার নিজস্ব ডিবাগার ডিজাইন এবং প্রোগ্রাম করুন।


Learn how to fuzz Windows drivers and create powerful fuzzers from scratch.

শিখুন কিভাবে উইন্ডোজ ড্রাইভারগুলিকে ফাজ করতে হয় এবং স্ক্র্যাচ থেকে শক্তিশালী ফাজার তৈরি করতে হয়।


Have fun with code and library injection, soft and hard hooking techniques, and other software trickery.

কোড এবং লাইব্রেরি ইনজেকশন, সফট এবং হার্ড হুকিং কৌশল, এবং অন্যান্য সফ্টওয়্যার কৌশল নিয়ে মজা করুন।


Sniff secure traffic out of an encrypted web browser session.

একটি এনক্রিপ্টেড ওয়েব ব্রাউজার সেশন থেকে সুরক্ষিত ট্র্যাফিক সনাক্ত করুন।


Use PyDBG, Immunity Debugger, Sulley, IDAPython, PyEMU, and more

PyDBG, Immunity Debugger, Sulley, IDAPython, PyEMU, এবং আরও অনেক কিছু ব্যবহার করুন


The world’s best hackers are using Python to do their handiwork.

বিশ্বের সেরা হ্যাকাররা তাদের কাজ করার জন্য পাইথন ব্যবহার করছে।


আপনারও কি করা উচিত নয়?


Justin seitz is a senior security researcher for immunity, inc., where he spends his time bug hunting, reverse engineering, writing exploits, and coding Python.

জাস্টিন সিইজ হলেন ইমিউনিটি, ইনকর্পোরেটেডের একজন সিনিয়র নিরাপত্তা গবেষক, যেখানে তিনি বাগ খুঁজে বের করা, রিভার্স ইঞ্জিনিয়ারিং, এক্সপ্লয়েট লেখা এবং পাইথন কোডিংয়ে সময় কাটান।


The Electronic Frontier Foundation (EFF)is the leading organization defending civil liberties in the digital world.

ইলেকট্রনিক ফ্রন্টিয়ার ফাউন্ডেশন (ইএফএফ) ডিজিটাল বিশ্বে নাগরিক স্বাধীনতা রক্ষার ক্ষেত্রে শীর্ষস্থানীয় সংস্থা।


We defend free speech on the Internet, fight illegal surveillance, promote the rights of innovators to develop new digital technologies, and work to ensure that the rights and freedoms we enjoy are enhanced — rather than eroded — as our use of technology grows.

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


EFF has sued telecom giant AT&T for giving the NSA unfettered access to the private communications of millions of their customers.

ইএফএফ টেলিযোগাযোগ জায়ান্ট AT&T-এর বিরুদ্ধে মামলা করেছে, কারণ তারা এনএসএকে তাদের লক্ষ লক্ষ গ্রাহকের ব্যক্তিগত যোগাযোগে অবাধ অ্যাক্সেস দিয়েছে।


EFF’s Coders’ Rights Project is defending the rights of programmers and security researchers to publish their findings without fear of legal challenges.

ইএফএফ-এর কোডার্স রাইটস প্রজেক্ট প্রোগ্রামার এবং নিরাপত্তা গবেষকদের তাদের অনুসন্ধানগুলি আইনি চ্যালেঞ্জের ভয় ছাড়াই প্রকাশ করার অধিকার রক্ষা করছে।


EFF's Patent Busting Project challenges overbroad patents that threaten technological innovation.

ইএফএফ-এর পেটেন্ট বাস্টিং প্রজেক্ট অতিরিক্ত বিস্তৃত পেটেন্টগুলির বিরোধিতা করে যা প্রযুক্তিগত উদ্ভাবনের জন্য হুমকি স্বরূপ।


EFF is fighting prohibitive standards that would take away your right to receive and use over-the-air television broadcasts any way you choose.

ইএফএফ এমন সব বিধিনিষেধমূলক মানগুলির বিরুদ্ধে লড়াই করছে যা আপনার পছন্দের যেকোনো উপায়ে ওভার-দ্য-এয়ার টেলিভিশন সম্প্রচার গ্রহণ এবং ব্যবহার করার অধিকার কেড়ে নেবে।


EFF has developed the Switzerland Network Testing Tool to give individuals the tools to test for covert traffic filtering.

ইএফএফ সুইজারল্যান্ড নেটওয়ার্ক টেস্টিং টুল তৈরি করেছে যা ব্যক্তিদের গোপন ট্র্যাফিক ফিল্টারিং পরীক্ষা করার সরঞ্জাম সরবরাহ করে।