HackCert
Intermediate 11 min read May 25, 2026

Shellcode Generation: এক্সপ্লয়েট ডেভেলপমেন্টের জন্য মেমোরিতে রান করার উপযোগী কাস্টম পেলোড তৈরি!

Shellcode কী, কীভাবে এটি তৈরি করা হয় এবং আধুনিক EDR বাইপাসের জন্য কাস্টম পেলোড নির্মাণের কৌশল।

Mohammad Saiful Islam
Exploit Developer
share
Shellcode Generation: এক্সপ্লয়েট ডেভেলপমেন্টের জন্য মেমোরিতে রান করার উপযোগী কাস্টম পেলোড তৈরি!
Overview

এক্সপ্লয়েট ডেভেলপমেন্টের জগতে Shellcode-কে বলা হয় আক্রমণের সবচেয়ে শক্তিশালী এবং সবচেয়ে সূক্ষ্ম অস্ত্র। যখন একজন আক্রমণকারী একটি বাফার ওভারফ্লো, format string বা use-after-free দুর্বলতা শোষণ করে এক্সিকিউশন কন্ট্রোল নিয়ে নেন, তখন তাদের পরবর্তী চ্যালেঞ্জ হলো লক্ষ্য সিস্টেমে কোন কোড চালানো হবে তা নির্ধারণ করা। সেই কোড—অর্থাৎ মেমোরিতে সরাসরি এক্সিকিউট হওয়ার মতো বাইনারি নির্দেশনার একটি ছোট সেট—কেই বলা হয় Shellcode। ঐতিহাসিকভাবে এটি একটি কমান্ড শেল চালু করার জন্য লেখা হতো বলেই এর নাম "Shellcode"; তবে আধুনিক যুগে এটি আরও বহুমুখী এবং জটিল উদ্দেশ্যে ব্যবহৃত হয়।

পেনিট্রেশন টেস্টার, Red Team অপারেটর এবং নিরাপত্তা গবেষকদের জন্য Shellcode-এর কাজ বোঝা এবং কাস্টম পেলোড তৈরি করা অত্যন্ত গুরুত্বপূর্ণ একটি দক্ষতা। আধুনিক EDR এবং AV সলিউশনগুলো Metasploit-এর ডিফল্ট পেলোড সহজেই শনাক্ত করে; ফলে নিজস্ব, পরিমার্জিত শেলকোড তৈরি করা পেশাদার অপারেটরের অপরিহার্য কাজ। এই আর্টিকেলে আমরা শেলকোড তৈরির মৌলিক ধারণা, কৌশল এবং সর্বশেষ EDR বাইপাস পদ্ধতি নিয়ে বিস্তারিত আলোচনা করব।

Shellcode কী এবং এটি কীভাবে কাজ করে

Shellcode হলো প্রসেসর-নির্দিষ্ট মেশিন কোডের একটি ক্রম যা সরাসরি মেমোরিতে এক্সিকিউট করার জন্য ডিজাইন করা হয়। ঐতিহ্যবাহী এক্সিকিউটেবল ফাইল (যেমন .exe বা ELF) লোডার দ্বারা লোড হয়ে নির্দিষ্ট ইনিশিয়ালাইজেশন প্রক্রিয়ার পর চালু হয়; কিন্তু shellcode-এর কোনো হেডার, ইম্পোর্ট টেবিল বা মেটাডেটা থাকে না—শুধু নির্ভেজাল বাইটের ক্রম যা সিপিইউ সরাসরি এক্সিকিউট করতে পারে।

একটি ভালো shellcode-এর কিছু বৈশিষ্ট্য থাকে:

  • Position-independent (PIC): কোডটি যেখানেই মেমোরিতে লোড হোক না কেন, কাজ করতে পারবে। কোনো হার্ডকোডেড ঠিকানা থাকবে না।
  • Self-contained: প্রয়োজনীয় সমস্ত ফাংশন এবং স্ট্রিং নিজেই লোড করতে পারবে, বাইরের লাইব্রেরির উপর নির্ভর করবে না।
  • Null-byte free (প্রায়শই): যদি ইনজেকশন vector স্ট্রিং-ভিত্তিক হয়, তবে \x00 বাইট থাকা যাবে না, কারণ এটি স্ট্রিং সমাপ্তি হিসেবে গণ্য হবে।
  • Compact: যত ছোট, তত ভালো—কারণ বাফারের আকার সীমিত হতে পারে।
  • Stealthy: সিগনেচার-ভিত্তিক শনাক্তকরণ এড়াতে অনন্য হতে হবে।

প্রসেসর আর্কিটেকচার এবং Calling Conventions

Shellcode লেখার আগে লক্ষ্য আর্কিটেকচার সম্পর্কে স্পষ্ট ধারণা থাকতে হবে। x86, x86-64, ARM, ARM64, MIPS—প্রতিটির নিজস্ব ইনস্ট্রাকশন সেট এবং calling convention রয়েছে।

Windows x64-এ Microsoft x64 calling convention অনুসরণ করতে হয়—প্রথম চারটি আর্গুমেন্ট RCX, RDX, R8, R9 রেজিস্টারে যায় এবং কলারকে শ্যাডো স্পেস সংরক্ষণ করতে হয়। Linux x64-এ System V AMD64 ABI অনুসরণ করা হয়—আর্গুমেন্ট RDI, RSI, RDX, RCX, R8, R9-এ যায় এবং syscall ইনস্ট্রাকশন দিয়ে কার্নেল কল করা হয়।

Windows Shellcode-এ Function Resolution

Windows-এ shellcode-এর সবচেয়ে চ্যালেঞ্জিং অংশ হলো Win32 API ফাংশনের ঠিকানা খুঁজে বের করা—কারণ ASLR-এর কারণে DLL-গুলোর বেস অ্যাড্রেস পরিবর্তনশীল। এর জন্য PEB (Process Environment Block) এবং TEB (Thread Environment Block) ব্যবহার করা হয়।

পদ্ধতিটি সংক্ষেপে:

  1. GS:[60h] (x64) থেকে PEB-এর ঠিকানা সংগ্রহ
  2. PEB-এর Ldr সদস্য থেকে InMemoryOrderModuleList অ্যাক্সেস
  3. প্রতিটি LDR_DATA_TABLE_ENTRY পরিভ্রমণ করে kernel32.dll-এর বেস অ্যাড্রেস খুঁজে বের করা
  4. kernel32.dll-এর Export Directory পার্স করে LoadLibraryA এবং GetProcAddress-এর ঠিকানা পাওয়া
  5. এই দুটি ফাংশন ব্যবহার করে অন্যান্য প্রয়োজনীয় API লোড করা

ফাংশন নাম সরাসরি সঞ্চিত না রেখে হ্যাশ (যেমন ROR-13 hash) ব্যবহার করা হয়, যাতে স্ট্যাটিক অ্যানালাইসিসে সহজে শনাক্ত না হয়।

Linux Shellcode-এর সরলতা

Linux-এ shellcode অনেক সহজ। কার্নেল সার্ভিস সরাসরি syscall ইনস্ট্রাকশন দিয়ে কল করা যায়, ফলে DLL বা library resolution-এর জটিলতা নেই।

একটি ক্লাসিক Linux x64 execve shellcode যা /bin/sh চালু করে:

xor rsi, rsi
push rsi
mov rdi, 0x68732f6e69622f2f
push rdi
push rsp
pop rdi
push 0x3b
pop rax
cdq
syscall

এই কোড syscall নম্বর 59 (execve) লোড করে, RDI-তে /bin/sh-এর ঠিকানা রাখে, এবং RSI, RDX-এ NULL দিয়ে কার্নেল কল করে।

Shellcode Generation Techniques

১. Hand-written Assembly

সবচেয়ে নিয়ন্ত্রিত এবং দক্ষ পদ্ধতি হলো সরাসরি অ্যাসেম্বলিতে লেখা। NASM, MASM বা GAS দিয়ে কম্পাইল করে অবজেক্ট ফাইল থেকে বাইট এক্সট্র্যাক্ট করা যায়।

২. C-to-shellcode Conversion

C ভাষায় position-independent code লিখে কম্পাইল করা সহজ। -fno-stack-protector -nostdlib -fno-asynchronous-unwind-tables ফ্ল্যাগ ব্যবহার করে কম্পাইল করে objcopy দিয়ে .text সেকশন বের করে আনা যায়। মাইক্রোসফট-এর Donut, এবং sRDI (Shellcode Reflective DLL Injection)-এর মতো প্রকল্প এই দৃষ্টিভঙ্গি ব্যবহার করে যেকোনো PE ফাইলকে shellcode-এ রূপান্তর করে।

৩. Metasploit msfvenom

দ্রুত এবং সহজ পদ্ধতি হলো msfvenom। তবে এই পেলোডগুলোর সিগনেচার সব AV/EDR-এ পরিচিত, তাই উৎপাদন পরিবেশে কাজ করে না।

৪. Mythic, Sliver, Cobalt Strike

আধুনিক C2 ফ্রেমওয়ার্কগুলো নিজস্ব shellcode জেনারেশন ইঞ্জিন সরবরাহ করে যা পেলোডকে এনক্রিপ্ট, পলিমর্ফিক এবং কনফিগারযোগ্য করে।

৫. Donut Framework

Donut একটি ওপেন-সোর্স টুল যা .NET অ্যাসেম্বলি, EXE, DLL এবং VBS-কে position-independent shellcode-এ রূপান্তর করে। এটি Red Team অপারেশনে অত্যন্ত জনপ্রিয়।

Encoding এবং Obfuscation

কাঁচা shellcode সিগনেচার-ভিত্তিক ডিটেকশনে সহজে ধরা পড়ে। এজন্য বিভিন্ন এনকোডিং কৌশল ব্যবহার করা হয়:

  • XOR Encoding: প্রতিটি বাইট একটি কী দিয়ে XOR করে এনকোড। ডিকোডার stub রানটাইমে ডিকোড করে।
  • Shikata Ga Nai: Metasploit-এর জনপ্রিয় পলিমর্ফিক এনকোডার যা প্রতিবার ভিন্ন আউটপুট তৈরি করে।
  • AES Encryption: পেলোডকে এনক্রিপ্ট করে রানটাইমে কী রিট্রিভ করে ডিক্রিপ্ট।
  • Alphanumeric Encoding: শুধুমাত্র প্রিন্টেবল ASCII অক্ষর ব্যবহার করে এনকোডিং।
  • Custom Compression: aPLib বা LZNT1 ব্যবহার করে পেলোডের আকার কমানো।

EDR Bypass কৌশল

আধুনিক EDR সলিউশন—CrowdStrike Falcon, SentinelOne, Microsoft Defender for Endpoint, Carbon Black—শুধু সিগনেচার নয়, behavioral analysis এবং inline hooking ব্যবহার করে। এই প্রতিরক্ষা এড়াতে শেলকোড ডেভেলপাররা নানা কৌশল ব্যবহার করেন।

Direct Syscalls

EDR সাধারণত ntdll.dll-এ user-mode hook স্থাপন করে সিস্টেম কল ইন্টারসেপ্ট করে। Direct syscall কৌশলে hook-করা ntdll এড়িয়ে সরাসরি কার্নেলে syscall ইনস্ট্রাকশন কল করা হয়। SysWhispers এবং Hell's Gate এই কৌশলের জনপ্রিয় বাস্তবায়ন।

Indirect Syscalls

Direct syscall-এ stack-এ shellcode থেকে কার্নেলে কলিং রিটার্ন অ্যাড্রেস আসে, যা সন্দেহজনক। Indirect syscall-এ ntdll-এর বৈধ syscall; ret গ্যাজেট ব্যবহার করে কল করা হয়, যা স্বাভাবিক কলস্ট্যাক বজায় রাখে।

API Unhooking

প্রক্রিয়ার মেমোরিতে ntdll-এর একটি ফ্রেশ কপি ডিস্ক থেকে পড়ে এনে hook-করা সংস্করণকে প্রতিস্থাপন করা।

Module Stomping

বৈধ DLL-এর মেমোরি স্পেসে shellcode কপি করে চালানো, যাতে এক্সিকিউশন বৈধ মডিউল থেকে এসেছে বলে মনে হয়।

Thread Hijacking

নতুন থ্রেড তৈরির পরিবর্তে existing থ্রেডের রেজিস্টার কনটেক্সট পরিবর্তন করে shellcode-এ রিডাইরেক্ট করা।

Process Injection Variations

ক্লাসিক CreateRemoteThread-এর বাইরে APC injection (NtQueueApcThread), Early Bird APC, Process Hollowing, এবং Process Doppelganging-এর মতো অগ্রসর কৌশল ব্যবহার করা।

Reflective DLL Injection

Reflective DLL Injection হলো একটি বিশেষ কৌশল যেখানে shellcode-এর প্রথম অংশ একটি মিনি-লোডার হিসেবে কাজ করে—এটি DLL-কে মেমোরিতে রিলোকেট করে, ইম্পোর্ট রিজলভ করে এবং DllMain কল করে। Stephen Fewer-এর মূল গবেষণার পর এটি Red Team-এর একটি মানদণ্ডে পরিণত হয়েছে।

বাস্তব উদাহরণ

ধরা যাক, একটি penetration test-এ আপনি একটি SQL Injection-এর মাধ্যমে SQL Server-এ xp_cmdshell অ্যাক্সেস পেয়েছেন। আপনি সরাসরি malicious .exe ডাউনলোড করতে পারবেন না, কারণ EDR সেটি ব্লক করবে। তখন আপনি একটি কাস্টম PowerShell ওয়ান-লাইনার তৈরি করতে পারেন যা একটি AES-encrypted shellcode ডাউনলোড করে, ডিক্রিপ্ট করে এবং VirtualAlloc + CreateThread-এর মাধ্যমে এক্সিকিউট করে। এই shellcode-এ Direct syscall দিয়ে কোনো outbound C2 connection স্থাপন করে।

আরেকটি উদাহরণ—একটি IoT ডিভাইসে ARM আর্কিটেকচার-এর jailbreak এক্সপ্লয়েট লেখার সময় গবেষক একটি কাস্টম ARM64 shellcode তৈরি করেন যা mprotect syscall দিয়ে শেলকোড পেজকে এক্সিকিউটেবল করে এবং তারপর সরাসরি root shell চালু করে।

নৈতিকতা এবং বৈধতা

Shellcode তৈরি এবং ব্যবহার নৈতিক ও আইনিভাবে সংবেদনশীল। শুধুমাত্র অনুমোদিত পরিবেশে—যেমন স্বয়ং নিয়ন্ত্রিত ল্যাব, CTF প্রতিযোগিতা, বৈধ penetration testing engagement, অথবা বাগ বাউন্টি প্রোগ্রাম—এই প্রযুক্তি প্রয়োগ করা উচিত। অননুমোদিত সিস্টেমে এর ব্যবহার গুরুতর অপরাধ।

প্রতিরোধমূলক ব্যবস্থা

ডিফেন্ডারদের দৃষ্টিকোণ থেকে shellcode-ভিত্তিক আক্রমণ প্রতিরোধে নিম্নলিখিত ব্যবস্থা কার্যকর:

  • DEP (Data Execution Prevention): ডেটা পেজে এক্সিকিউশন বন্ধ করে।
  • ASLR: মেমোরি লেআউট র্যান্ডমাইজ করে শেলকোডের রিলায়েবল এক্সিকিউশন কঠিন করে।
  • Control Flow Guard / CET: অপ্রত্যাশিত কলব্যাক প্রতিরোধ করে।
  • AMSI (Anti-Malware Scan Interface): রানটাইমে স্ক্রিপ্ট এবং পেলোড স্ক্যান করে।
  • ETW (Event Tracing for Windows): process behavior লগ করে EDR-এ ফিড করে।
  • Memory Scanning: PE-Sieve, Moneta-এর মতো টুল দিয়ে injected মডিউল শনাক্ত।
  • Behavioral EDR Rules: VirtualAlloc + WriteProcessMemory + CreateRemoteThread-এর মতো প্যাটার্ন শনাক্তকরণ।
  • Hypervisor-based Protection: Virtualization-Based Security (VBS) এবং HVCI দিয়ে কার্নেল-লেভেল সুরক্ষা।
Key Takeaways

Shellcode Generation হলো এক্সপ্লয়েট ডেভেলপমেন্টের একটি গভীর এবং বহুমাত্রিক ক্ষেত্র যা প্রসেসর আর্কিটেকচার, অপারেটিং সিস্টেম ইন্টারনাল এবং আধুনিক প্রতিরক্ষা প্রযুক্তির সম্পর্কে গভীর জ্ঞান দাবি করে। প্রতিরক্ষাকারী এবং আক্রমণকারী উভয়ের জন্য এই দক্ষতা সমান গুরুত্বপূর্ণ—আক্রমণকারী যদি না বোঝেন কীভাবে কার্যকর পেলোড তৈরি করতে হয়, তবে তাদের অপারেশন ব্যর্থ হবে; আর প্রতিরক্ষাকারী যদি না বোঝেন আধুনিক shellcode-এর কৌশল, তবে তারা কার্যকর ডিটেকশন তৈরি করতে পারবেন না। এই ক্ষেত্রে সাফল্যের জন্য নিরবচ্ছিন্ন শেখা, প্রতিটি নতুন প্রতিরক্ষা প্রযুক্তির গভীর অধ্যয়ন এবং নৈতিক সীমার প্রতি কঠোর শ্রদ্ধাই হলো একমাত্র পথ।

আপনার জ্ঞান যাচাই করতে প্রস্তুত? আজই HackCert-এ Shellcode Generation MCQ Quiz-টি দিন!

Related articles

back to all articles