Fs সেট করে: [0x28] (স্ট্যাক ক্যানারি)?


13

এই পোস্টটি থেকে এটি প্রদর্শিত হয় যে FS:[0x28]স্ট্যাক-ক্যানারি। আমি এই ফাংশনে জিসিসি ব্যবহার করে একই কোড তৈরি করছি,

void foo () {
    char a[500] = {};
    printf("%s", a);
}

বিশেষত, আমি এই সমাবেশটি পেয়ে যাচ্ছি ..

    0x000006b5      64488b042528.  mov rax, qword fs:[0x28]                ; [0x28:8]=0x1978 ; '(' ; "x\x19"
    0x000006be      488945f8       mov qword [local_8h], rax
...stuff...
    0x00000700      488b45f8       mov rax, qword [local_8h]
    0x00000704      644833042528.  xor rax, qword fs:[0x28]
    0x0000070d      7405           je 0x714
    0x0000070f      e85cfeffff     call sym.imp.__stack_chk_fail           ; void __stack_chk_fail(void)
    ; CODE XREF from 0x0000070d (sym.foo)
    0x00000714      c9             leave
    0x00000715      c3             ret

মান নির্ধারণ কি fs:[0x28]? কার্নেল, বা জিসিসি কোডে নিক্ষেপ করছে? আপনি কি কার্নেলের কোডটি প্রদর্শন করতে পারেন, বা যে বাইনারি সেট করে তা সংকলন করতে পারেন fs:[0x28]? ক্যানারিটি কি পুনরায় জেনারেট হয় - বুটে, বা প্রক্রিয়াটি স্প্যান হয়? এই নথি কোথায়?

উত্তর:


18

এই ইনিশিয়ালাইজেশনটি ট্র্যাক করা সহজ, কারণ (প্রায়) প্রতিটি প্রক্রিয়া straceপ্রক্রিয়া চালুর খুব শুরুতে একটি খুব সন্দেহজনক সিস্টাল দেখায়:

arch_prctl(ARCH_SET_FS, 0x7fc189ed0740) = 0

এটাই man 2 arch_prctlবলে:

   ARCH_SET_FS
          Set the 64-bit base for the FS register to addr.

হ্যাঁ, আমাদের যা প্রয়োজন তা দেখে মনে হচ্ছে। কাকে ডাকে arch_prctl, তা খুঁজতে, আসুন ব্যাকট্রিজটি সন্ধান করুন:

(gdb) catch syscall arch_prctl
Catchpoint 1 (syscall 'arch_prctl' [158])
(gdb) r
Starting program: <program path>

Catchpoint 1 (call to syscall arch_prctl), 0x00007ffff7dd9cad in init_tls () from /lib64/ld-linux-x86-64.so.2
(gdb) bt
#0  0x00007ffff7dd9cad in init_tls () from /lib64/ld-linux-x86-64.so.2
#1  0x00007ffff7ddd3e3 in dl_main () from /lib64/ld-linux-x86-64.so.2
#2  0x00007ffff7df04c0 in _dl_sysdep_start () from /lib64/ld-linux-x86-64.so.2
#3  0x00007ffff7dda028 in _dl_start () from /lib64/ld-linux-x86-64.so.2
#4  0x00007ffff7dd8fb8 in _start () from /lib64/ld-linux-x86-64.so.2
#5  0x0000000000000001 in ?? ()
#6  0x00007fffffffecef in ?? ()
#7  0x0000000000000000 in ?? ()

সুতরাং, এফএস সেগমেন্ট বেসটি প্রোগ্রাম লোডিংয়ের সময় ld-linuxএকটি অংশ যা দ্বারা সেট করা হয় glibc(প্রোগ্রামটি যদি স্ট্যাটিকালি লিঙ্কযুক্ত থাকে তবে এই কোডটি বাইনারিটিতে এমবেড করা আছে)। এখানেই এটি ঘটে থাকে।

প্রারম্ভকালে সময়, লোডার TLS এর সূচনা । এর মধ্যে রয়েছে মেমরি বরাদ্দ এবং টিএলএস শুরুর দিকে নির্দেশ করার জন্য এফএস বেস মান সেট করা। এটি arch_prctl সিস্টেল মাধ্যমে করা হয় । টিএলএস প্রারম্ভিককরণের security_init ক্রিয়াকলাপটি কল করার পরে , যা স্ট্যাক গার্ডের মান উত্পন্ন করে এবং এটি মেমরির স্থানে লেখায়, যা fs:[0x28]নির্দেশ করে:

এবং টিএলএস শুরুতে অবস্থিত কাঠামোর মাঠের 0x28অফসেট stack_guard


zomfg, সত্যিই দুর্দান্ত উত্তর। আমি রাডারের সাথে একটি বাইনারি বিচ্ছিন্ন করার চেষ্টা করছিলাম। এটিতে আমি যে ফর্ম এবং বিষয়বস্তু খুঁজছিলাম তা রয়েছে। অসংখ্য ধন্যবাদ.
ইভান ক্যারল

কোন প্রসেসের সূচনা কী arch_prctl(ARCH_SET_FS..)আমি এক্সিকিউটেবলের মধ্যে দেখতে পাই না? এটি কি কার্নেল কোড?
ইভান ক্যারল

পোস্টে "সিস্কেল" লিঙ্কটি দেখুন। এটি আসল কল সাইটকে ( git.launchpad.net/glibc/tree/sysdeps/x86_64/nptl/tls.h#n153 ) দিকে নিয়ে যায় যেখানে সিস্কাল কার্যকর করা হয়। এটি ld-linuxটিএলএস সূচনার সময় দ্বারা কার্যকর করা হয়।
ড্যানিলা কিভার

6

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

কেন টিএলএসে মান সংরক্ষণ করবেন? মানটি সেখানে অবস্থিত হওয়ায়, সিএস, ডিএস এবং এসএস রেজিস্টারগুলির দ্বারা এর ঠিকানাটি অ্যাক্সেসযোগ্য নয়, যদি আপনি দূষিত কোড থেকে স্ট্যাকটিকে পরিবর্তন করার চেষ্টা করছেন তবে সঞ্চিত মানটি অনুমান করা খুব কঠিন।


এটি আমি যা খুঁজছি তা নয়, তাই আমি পরিষ্কার হওয়ার প্রয়াসে কিছুটা পরিষ্কার করেছিলাম। "প্রারম্ভকালে প্রোগ্রাম দ্বারা উত্পন্ন এলোমেলো সংখ্যা" আপনি দেখতে পারেন যে এটি কার্যকর করা যায় যেখানে এটি উত্পন্ন হয় এবং কোডটি এটি তৈরি করার জন্য কী রাখে?
ইভান ক্যারল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.