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 এখনও ব্যবহারকারী-স্থান থেকে মূল্য রয়েছে।

সুতরাং সিস্কেল ডিজাইনের জন্য সিস্টেম-কল এবিআই দরকার যা ক্লোবারগুলি নিবন্ধভুক্ত করে এবং এজন্য মানগুলি সেগুলি হয়।





system-calls