linux - যবহ - লিনাক্সের সুবিধা
কেন x86-64 লিনাক্স সিস্টেম কলগুলি আরসিএক্সকে সংশোধন করে এবং মানটির অর্থ কী? (1)
আমি
sys_brk
দিয়ে লিনাক্সে কিছু মেমরি বরাদ্দ করার চেষ্টা করছি।
এখানে আমি চেষ্টা করেছি:
BYTES_TO_ALLOCATE equ 0x08
section .text
global _start
_start:
mov rax, 12
mov rdi, BYTES_TO_ALLOCATE
syscall
mov rax, 60
syscall
জিনিসটি লিনাক্স কলিং কনভেনশন অনুযায়ী আমি প্রত্যাশা করেছি যে রিটার্নের মানটি
rax
রেজিস্টারে (বরাদ্দকৃত স্মৃতিতে নির্দেশক) থাকবে।
আমি এটিকে
sys_brk
এবং
sys_brk
তৈরি করার পরে আমি নীচের
sys_brk
লিখিত বিষয়গুলি লক্ষ্য করেছি
সিস্কেলের আগে
rax 0xc 12
rbx 0x0 0
rcx 0x0 0
rdx 0x0 0
rsi 0x0 0
rdi 0x8 8
সিস্টাল পরে
rax 0x401000 4198400
rbx 0x0 0
rcx 0x40008c 4194444 ; <---- What does this value mean?
rdx 0x0 0
rsi 0x0 0
rdi 0x8 8
এই ক্ষেত্রে
rcx
নিবন্ধের মানটি আমি বেশ বুঝতে পারি না।
sys_brk
দিয়ে বরাদ্দকৃত 8 বাইটের শুরুতে পয়েন্টার হিসাবে কোনটি ব্যবহার
sys_brk
?
সিস্টেম কল রিটার্ন মানটি
rax
মতো
rax
।
ইউএনএক্স এবং লিনাক্স সিস্টেমের জন্য আই386 এবং x86-64 এ কল করার জন্য কী আহ্বান জানানো হয়েছে তা
দেখুন।
নোট করুন যে
sys_brk
এর সাথে
brk
/
sbrk
POSIX ফাংশনগুলির চেয়ে কিছুটা আলাদা ইন্টারফেস রয়েছে;
লিনাক্স
brk(2)
ম্যান পৃষ্ঠার সি লাইব্রেরি / কার্নেল পার্থক্য বিভাগটি দেখুন
।
বিশেষত,
লিনাক্স
sys_brk
প্রোগ্রাম বিরতি
সেট
করে
;
আরগ এবং রিটার্ন মান উভয় পয়েন্টার।
অ্যাসেম্বলি x86 ব্রেক () কল ব্যবহার দেখুন
।
এই উত্তরের জন্য প্রয়োজনীয়তা রয়েছে কারণ এই প্রশ্নের একমাত্র উত্তম।
আপনার প্রশ্নের অন্য আকর্ষণীয় অংশটি হ'ল:
এই ক্ষেত্রে আরসিএক্স নিবন্ধের মানটি আমি বেশ বুঝতে পারি না
sysret
/
sysret
নির্দেশাবলী কীভাবে কার্নেলটিকে ব্যবহারকারী-স্থান নির্বাহ পুনরায় চালু করার অনুমতি দেওয়ার জন্য ডিজাইন করা হয়েছে তবুও দ্রুত হতে পারে তার মেকানিকগুলি আপনি দেখছেন।
syscall
কোনও লোড বা স্টোর করে না, এটি কেবল রেজিস্টারগুলিকে সংশোধন করে।
কোনও ফিরতি ঠিকানা সংরক্ষণ করার জন্য বিশেষ রেজিস্টারগুলি ব্যবহার করার পরিবর্তে এটি নিয়মিত পূর্ণসংখ্যার নিবন্ধগুলি ব্যবহার করে।
কার্নেলটি আপনার ব্যবহারকারীর স্পেস কোডে ফিরে
R11=RFLAGS
পরে
RCX=RIP
এবং
R11=RFLAGS
এটি কোনও কাকতালীয় ঘটনা নয়
।
কেস
না
হওয়ার একমাত্র উপায় হ'ল যদি কোনও
ptrace
সিস্টেম কল প্রক্রিয়াক্রমে সংরক্ষিত
rcx
বা
r11
মানটি কার্নেলের অভ্যন্তরে
r11
হয়।
(
ptrace
হ'ল সিস্টেম কল জিডিবি ব্যবহার করে)।
sysret
লিনাক্স ব্যবহারকারী স্থানে ফিরে আসার জন্য
sysret
পরিবর্তে
sysret
ব্যবহার করবে, কারণ ধীর জেনারেল-ক্ষেত্রে এটি করতে পারে।
(দেখুন
আপনি যদি -৪-বিট কোড 0x80 লিনাক্স এবিআইকে -৪-বিট কোডে ব্যবহার করেন তবে?
লিনাক্সের সিস্টেম-কল এন্ট্রি পয়েন্টগুলির কিছুটা ওয়াক-
থ্রো জন্য -৪
-বিট প্রক্রিয়া থেকে বেশিরভাগ এন্ট্রি পয়েন্ট,
syscall
-এর সিস্টেমে নয়) বিট প্রক্রিয়া, যদিও।)
কার্নেল স্ট্যাকের উপর রিটার্নের ঠিকানাটি চাপ দেওয়ার পরিবর্তে (যেমন
int 0x80
)
syscall
:
- আরসিএক্স = আরআইপি সেট করে, আর 11 = আরএফএলএজিএস (তাই আপনি সিস্কেল চালানোর আগে কার্নেলের পক্ষে reg রেগগুলির মূল মানগুলি দেখতে পারাও অসম্ভব)।
-
একটি কনফিগার রেজিস্টার (
IA32_FMASK
MSR) থেকে প্রাক-কনফিগার করা মুখোশ দিয়েRFLAGS
মাস্ক করুন। এটি কার্নেলটিswapgs
(আইএফ) অক্ষম করতে দেয় যতক্ষণ না এটিrsp
স্ট্যাকের দিকে নির্দেশ করার জন্যswapgs
এবং সেট করেrsp
করে। এমনকিcli
এন্ট্রি পয়েন্টে প্রথম নির্দেশ হিসাবে, দুর্বলতার উইন্ডো থাকবে। আপনিDF
বন্ধ করেও বিনামূল্যেstos
পাবেন যাতে ব্যবহারকারী-স্থানstd
ব্যবহার করে এমনকিstos
/stos
উপরের দিকে যায়।মজাদার ঘটনা: এএমডির প্রথম প্রস্তাবিত
swapgs
/swapgs
নকশাswapgs
মুখোশ দেয়নি, তবে তারা এএমডি mail64 মেইলিং তালিকার (প্রথম সিলিকনের কয়েক বছর আগে 2000 ডলারে) কার্নেল বিকাশকারীদের প্রতিক্রিয়ার পরে এটিকে পরিবর্তন করেছে । -
কনফিগার করা
syscall
এন্ট্রি পয়েন্টে ঝাঁপ দেয় (সেটিং সিএস: RIP =IA32_LSTAR
)। পুরানোCS
মানটি কোথাও সংরক্ষণ করা হয়নি, আমার ধারণা। -
এটি অন্য কিছু করে না, কার্নেলকে কোনও তথ্য ব্লকের অ্যাক্সেস পেতে
swapgs
করতে হবে যেখানে এটি কার্নেল স্ট্যাক পয়েন্টারটি সংরক্ষণ করেছে, কারণrsp
এখনও ব্যবহারকারী-স্থান থেকে মূল্য রয়েছে।
সুতরাং সিস্কেল ডিজাইনের জন্য সিস্টেম-কল এবিআই দরকার যা ক্লোবারগুলি নিবন্ধভুক্ত করে এবং এজন্য মানগুলি সেগুলি হয়।