.dtors লেখার যোগ্য মনে হয় তবে সেগফাল্ট লেখার চেষ্টা করে


9

এটি উবুন্টু 9.04, 2.6.28-11-সার্ভার, 32 বিট x86


$ cat test.c
main() { int *dt = (int *)0x08049f18; *dt = 1; }
$ readelf -S ./test
...
  [18] .dtors            PROGBITS        08049f14 000f14 000008 00  WA  0   0  4
...
$ ./test
Segmentation fault
$

নিরবিচ্ছিন্নতার জন্য: জিসিসি একটি ডিলস্ট্রাক্টর সেগমেন্ট তৈরি করে .dtors, এলিফ এক্সিকিউটেবলে, যাকে main()প্রস্থান শেষে বলা হয় । এই টেবিলটি দীর্ঘকাল লিখনযোগ্য, এবং দেখে মনে হচ্ছে এটি আমার ক্ষেত্রে হওয়া উচিত ( readelfআউটপুট দেখুন)। তবে টেবিলে লেখার চেষ্টা করার ফলে সেগফল্ট হয়।

আমি বুঝতে পেরেছি যে কেবলমাত্র পঠনযোগ্য ডিডটারের দিকে একটি আন্দোলন হয়েছে, প্লট, ইদানীং পেয়েছে, তবে যা আমি বুঝতে পারি না তা হ'ল সিগফল্টের মধ্যে মিল readelf


আসল প্রশ্ন হ'ল আপনি কেন এটি লেখার যোগ্য হতে চান?
অ্যালেক্স

1
আমি একটি সুরক্ষা ক্লাস শিখছি যা জরুরী প্রোগ্রামগুলির একটি ধারাবাহিক ভাঙ্গা জড়িত জড়িত, কিন্তু একটি অনুশীলন শেলকোড কার্যকর করতে .dtors লিখিত জড়িত। এটি আর কাজ করে না এবং আমি সমস্যাটি অনুসন্ধান করার চেষ্টা করছি।
ফিক্সি

অমিলটি হ'ল কারণ সেখানে সম্ভবত কিছু তথ্য স্থানান্তর রয়েছে (যা কেবলমাত্র পঠনযোগ্যরূপে চিহ্নিত করার আগে স্থির করা দরকার, এবং যাইহোক অলস হতে পারে না, তাই একবার স্থির হয়ে গেলে স্থির থাকবে)।
নিনজালজ

উত্তর:


5

এই বিভাগগুলিকে GNU_RELRO চিহ্নিত করা হয়েছে (কেবলমাত্র পঠন স্থানান্তর), যার অর্থ ডায়নামিক লোডার ঠিকঠাক হয়ে যাওয়ার সাথে সাথে (লোডের সময়, সেখানে কোনও অলস স্থানান্তর নেই) সমস্ত স্থানান্তরিত হয়েছে, এটি সেই বিভাগগুলি কেবল পঠনযোগ্য হিসাবে চিহ্নিত করে। নোট করুন যে বেশিরভাগটি .got.pltঅন্য পৃষ্ঠায় রয়েছে, তাই চিকিত্সা পান না।

আপনি এর সাথে লিঙ্কার স্ক্রিপ্টটি দেখতে পাচ্ছেন ld --verbose, আপনি যদি রেলোর জন্য অনুসন্ধান করেন তবে এর মতো কিছু পাবেন:

.got            : { *(.got) }
. = DATA_SEGMENT_RELRO_END (12, .);
.got.plt        : { *(.got.plt) }

যার অর্থ হল যে রেলো বিভাগগুলি 12 বাইটে শেষ হয় .got.plt(ডায়নামিক লিঙ্কার ফাংশনগুলির পয়েন্টারগুলি ইতিমধ্যে সমাধান হয়েছে, সুতরাং কেবলমাত্র পঠনযোগ্য হিসাবে চিহ্নিত করা যেতে পারে)।

কড়া জেন্টু প্রকল্পটির রেলো সম্পর্কিত কিছু ডকুমেন্টেশন রয়েছে http://www.gentoo.at/proj/en/hardened/hardened-toolchain.xml#RELRO- তে


5

কেন এটি ব্যর্থ হচ্ছে তা আমি বলতে পারি, যদিও সিস্টেমের কোন অংশটি দায়ী তা আমি আসলে জানি না। যদিও .dtorsচিহ্নিত লিখনযোগ্য বাইনারি হয়, এটা (সহ এটা দেখে মনে হচ্ছে .ctors, আছে, এবং কয়েক অন্যান্য বিষয়) মেমরি পৃথক, অ-লিখনযোগ্য পৃষ্ঠাতে ম্যাপ করা হচ্ছে। আমার সিস্টেমে, .dtorsএ দেওয়া হচ্ছে 0x8049f14:

$ readelf -S test
  [17] .ctors            PROGBITS        08049f0c 000f0c 000008 00  WA  0   0  4
  [18] .dtors            PROGBITS        08049f14 000f14 000008 00  WA  0   0  4
  [19] .jcr              PROGBITS        08049f1c 000f1c 000004 00  WA  0   0  4
  [20] .dynamic          DYNAMIC         08049f20 000f20 0000d0 08  WA  6   0  4
  [21] .got              PROGBITS        08049ff0 000ff0 000004 04  WA  0   0  4
  [22] .got.plt          PROGBITS        08049ff4 000ff4 00001c 04  WA  0   0  4
  [23] .data             PROGBITS        0804a010 001010 000008 00  WA  0   0  4
  [24] .bss              NOBITS          0804a018 001018 000008 00  WA  0   0  4

যদি আমি এক্সিকিউটেবল চালনা করি এবং পরীক্ষা করে /proc/PID/mapsদেখি,

08048000-08049000 r-xp 00000000 08:02 163678     /tmp/test
08049000-0804a000 r--p 00000000 08:02 163678     /tmp/test
0804a000-0804b000 rw-p 00001000 08:02 163678     /tmp/test

.data/ .bssএখনও তাদের নিজস্ব পৃষ্ঠায় লিখিত হয়, কিন্তু অন্যদের 0x8049000-0x804a000না। আমি ধরে নিলাম এটি কার্নেলের একটি সুরক্ষা বৈশিষ্ট্য (যেমন আপনি বলেছিলেন, "কেবল পঠনযোগ্য। ডিটার্স, প্লট, ইদানীং পেয়েছে") এর দিকে একটি আন্দোলন হয়েছে, তবে আমি বিশেষভাবে জানি না এটি কী বলে (ওপেনবিএসডি-তে খুব অনুরূপ কিছু রয়েছে যা বলে ডাব্লু এক্স এক্স ; লিনাক্সে প্যাক্স রয়েছে তবে বেশিরভাগ কার্নেলের মধ্যে তৈরি করা হয়নি)

আপনি এটির সাথে এটি পেতে পারেন mprotect, যা আপনাকে একটি পৃষ্ঠার মেমরির বৈশিষ্ট্যগুলি পরিবর্তন করতে দেয়:

mprotect((void*)0x8049000, 4096, PROT_WRITE);

তার সাথে, আমার পরীক্ষার প্রোগ্রামটি ক্রাশ হয় না, তবে আমি যদি অন্য ফাংশনের ঠিকানা দিয়ে .dtors( 0x8049f18) এর শেষ সেন্ডিনেলটি ওভাররাইট করার চেষ্টা করি, তবে সেই ফাংশনটি কার্যকর হয় না; সেই অংশটি আমি বের করতে পারি না।

আশা করি পৃষ্ঠাটি কেবলমাত্র পঠন করার জন্য অন্য কেউ কী জানে এবং কেন পরিবর্তন .dtorsকরা আমার সিস্টেমে কিছুই করছে বলে মনে হচ্ছে না do


3
প্যাক্সের সাথে ওপি লিনাক্স যদি নির্বাহযোগ্য mprotectপৃষ্ঠাটি লিখিতযোগ্য করতে না পারে বা কোনও পৃষ্ঠা কার্যকর করতে সক্ষম না করে যা সেই বৈশিষ্ট্যটি অক্ষম না করা হয় তার আগে যা লিখনযোগ্য ছিল paxctl -m
stribika

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