mov $0x58, %al # 2 bytes: b0 58
mov $0xfee1dead, %ebx # 5 bytes: bb ad de e1 fe
mov $0x28121969, %ecx # 5 bytes: b9 69 19 12 28
mov $0x4321fedc, %edx # 5 bytes: ba dc fe 21 43
int $0x80 # 2 bytes: cd 80
রুট হিসাবে চালানো আবশ্যক।
এটি পাওয়ার বোতাম টিপানোর সমতুল্য এবং আপনার পিসি বন্ধ করার কোনও নিরাপদ উপায় নয়। নিশ্চিত হয়ে নিন যে আপনি সমস্ত উন্মুক্ত অ্যাপ্লিকেশন বন্ধ করেছেন এবং sync
ফাইল প্রোগ্রামের দুর্নীতির ঝুঁকি হ্রাস করার জন্য, এই প্রোগ্রামটি কার্যকর করার আগে সমস্ত ফাইল সিস্টেম বাফারগুলি ফ্লাশ করার জন্য কার্যকর করেছেন ute
টেস্ট রান
$ as -o poweroff.o poweroff.s
$ ld -o poweroff poweroff.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000000400078
$ sudo sh -c 'sync && ./poweroff'
root's password:
অন্ধকার দ্বারা অনুসরণ করা।
কিভাবে এটা কাজ করে
int $0x80
একটি সফ্টওয়্যার বিঘ্নিত অনুরোধ। এটি x86 এবং x64 উভয় ক্ষেত্রেই কাজ করে তবে এক দশকেরও বেশি সময় ধরে তাকে অবহেলা করা হয়েছে এবং এটি উত্পাদন কোডে ব্যবহার করা উচিত নয়। syscall
পরিবর্তে x64 কোড ব্যবহার করা উচিত । x86 ব্যবহার করা উচিত sysenter
, তবে কোড গল্ফের জন্য এটি খুব জটিল।
সিস্কল থেকে প্রাপ্ত ক্রিয়াকলাপ EAX - EDX, ESI, এবং EDI রেজিস্টারে নির্ভর করে। লিনাক্স প্রাপ্ত syscall রেফারেন্স সব syscalls যে মাধ্যমে উপলব্ধ দেখায় int $0x80
।
যখন EAX 0x58 (88) ধারণ করে , পুনরায় বুট বলা হয়, যা কম্পিউটারটি বিদ্যুত বন্ধ, ঘুমানো, বা হাইবারনেট করতে, পাশাপাশি কার্নেলগুলি স্যুইচ করতে এবং Ctrl - Alt - Del কী কম্বোকে অক্ষম বা সক্ষম করতে ব্যবহার করতে পারে ।
প্রোগ্রামের শুরুতে - এবং as
বা এর সাথে সংকলন করে gcc -nostdlib
আমরা নিশ্চিত করতে পারি যে আমরা আসলে প্রোগ্রামের শুরুতে এসেছি - বেশিরভাগ নিবন্ধগুলি 0 তে সেট করা থাকে । এই EAX অন্তর্ভুক্ত, তাই আমরা ব্যবহার করতে পারেন mov $0x58, %al
থেকে EAX নিচের 8 বিট সেট করতে 0x58 এইভাবে EAX নিজেই সেটিং করতে, 0x58 । এটি ম্যানুয়ালি রেজিস্ট্রারের সাথে শূন্য করতে দুটি বাইট xor %eax, %eax
এবং স্ট্রাইটফোর্ডের উপরে আরও একটি বাইট সংরক্ষণ করে mov $0x58, %eax
যা 32 বিটগুলিতে 0x58 এনকোড করে।
পুনরায় বুট করার প্রথম দুটি যুক্তি হ'ল যাদু নম্বরগুলি, সম্ভবত দুর্ঘটনাজনিত রিবুটগুলি প্রতিরোধ করতে এবং ইবিএক্স এবং ইসিএক্স রেজিস্ট্রারগুলি থেকে পড়া হয়। এই সংখ্যাগুলি নির্দিষ্ট ধ্রুবকের সমান না হলে, পুনরায় বুট কোনও ক্রিয়া সম্পাদন করতে অস্বীকার করে।
প্রথম ম্যাজিক সংখ্যার অবশ্যই 0xfi1dead ( মৃত বোধ করা ) সমান হতে হবে , সম্ভবত পিসির পাওয়ার অফ / ডেথ উল্লেখ করে।
দ্বিতীয় ম্যাজিক সংখ্যাটি চারটি ভিন্ন ধাপের সমান হতে পারে, যদিও পরবর্তী তিনটি লিনাক্সের প্রাচীন সংস্করণগুলিতে কাজ করেনি। এগুলির সমস্তই পিসির জন্ম / জন্মের পরবর্তী ক্ষমতাটিকে বোঝায়।
0x28121969 লিনাস টরভাল্ডসের জন্মদিন (28 ডিসেম্বর, 1969) উপস্থাপন করে।
0x05121996 প্যাট্রিসিয়া টরভাল্ডসের জন্মদিন (5 ডিসেম্বর, 1996) উপস্থাপন করে।
0x16041998 ড্যানিয়েলা টরভাল্ডসের জন্মদিন (16 এপ্রিল, 1998) উপস্থাপন করে।
0x20112000 সেলস্টে টরভাল্ডসের জন্মদিন (20 নভেম্বর, 2000) উপস্থাপন করে।
প্যাট্রিসিয়া, ড্যানিয়েলা এবং সেলেস্তে টরভাল্ডস হলেন লিনাস টোরভাল্ডসের তিন মেয়ে।
ইডিএক্স রেজিস্টার আমাদের "রিবুট" প্রকারটি নির্বাচন করে। 0x4321fedc হ'ল RB_POWER_OFF , পিসিটি বন্ধ করে এবং এটিকে বন্ধ করে দেয়।
অবশেষে, ইএসআই নিবন্ধকের মানটি RB_POWER_OFF- এর জন্য উপেক্ষা করা হবে ; ইডিআই নিবন্ধকের মান পুনরায় বুট করার মাধ্যমে সম্পূর্ণ উপেক্ষা করা হবে ।
বিকল্প সংস্করণ, x64- কেবল, 19 বাইট
X64-তে, আমরা একই বাইট গণনার জন্য একটি উপযুক্ত সিস্কেল ব্যবহার করতে পারি।
mov $0xa9, %al # 2 bytes: b0 a9
mov $0xfee1dead, %edi # 5 bytes: bf ad de e1 fe
mov $0x28121969, %esi # 5 bytes: be 69 19 12 28
mov $0x4321fedc, %edx # 5 bytes: ba dc fe 21 43
syscall # 2 bytes: 0f 05
নির্দেশাবলী ( syscall
বনাম int $0x80
), __NR_REBOOT ( 0xa9 বনাম 0x58 ) এর মান এবং জড়িত নিবন্ধগুলির মধ্যে কেবলমাত্র পার্থক্য রয়েছে ।