এনওপি নির্দেশের উদ্দেশ্য এবং x86 সমাবেশে বিবৃতি সারিবদ্ধ করুন


15

আমি সর্বশেষ একটি অ্যাসেমব্লিং ক্লাস নিয়েছি তার এক বছর বা তার বেশি পরে গেছে। সেই শ্রেণিতে আমরা প্রোগ্রামটি আরও সহজ করার জন্য ইরভিন লাইব্রেরি সহ এমএএসএম ব্যবহার করছিলাম।

আমরা বেশিরভাগ নির্দেশের মধ্য দিয়ে যাওয়ার পরে, তিনি বলেছিলেন যে এনওপি নির্দেশনা মূলত কিছুই করে নি এবং এটি ব্যবহারের বিষয়ে চিন্তা করা উচিত নয়। যাইহোক, এটি মধ্যবর্তী ঘটনা সম্পর্কে ছিল এবং তার কিছু উদাহরণ কোড রয়েছে যা সঠিকভাবে চলবে না, তাই তিনি আমাদের একটি এনওপি নির্দেশিকা যুক্ত করতে বলেছিলেন এবং এটি দুর্দান্ত কাজ করেছে। আমি জিজ্ঞাসা করেছি আমি ক্লাসের পরে কেন এবং এটি আসলে কী করেছিল এবং তিনি বলেছিলেন যে তিনি জানেন না।

কেউ জানেন?


এনওপি কিছুই করে না, তবে এটি চক্র গ্রহণ করে। আমি মনে করি না যে আপনার প্রশ্নের উত্তর দেওয়া যেতে পারে, কোড ব্যতীত আমরা কেবল অনুমান করতে পারি। ঠিক আছে, আমার অনুমানটি একটি এনওপি স্লাইড হবে ...
ইয়ানিস

11
এনওপি আসলে কিছু করে। এটি নির্দেশ পয়েন্টার বৃদ্ধি করে।
এরিকশাফার

উত্তর:


37

NOPনির্দেশের ঠিকানাগুলি সারিবদ্ধ করার জন্য প্রায়শই সময় ব্যবহৃত হয়। বাফার ওভারফ্লো বা ফর্ম্যাট স্ট্রিং দুর্বলতা কাজে লাগাতে শেলকোড লেখার সময় এটি সাধারণত দেখা যায়

বলুন আপনার কাছে 100 বাইট ফরোয়ার্ডের তুলনামূলক ঝাঁপ রয়েছে এবং কোডটিতে কিছু পরিবর্তন করুন ifications সম্ভাবনাগুলি হ'ল আপনার পরিবর্তনগুলি জাম্প টার্গেটের ঠিকানায় বিভ্রান্ত হয় এবং যেমন আপনাকে পূর্বোক্ত আপেক্ষিক জাম্পও পরিবর্তন করতে হবে। এখানে, আপনি NOPলক্ষ্য ঠিকানা এগিয়ে ধাক্কা গুলি যোগ করতে পারেন । আপনার যদি NOPলক্ষ্য ঠিকানা এবং জাম্প নির্দেশের মধ্যে একাধিক গুলি থাকে NOPতবে লক্ষ্য ঠিকানাটি পিছনে পিছনে টানতে আপনি গুলি সরাতে পারেন ।

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

NOPনির্দেশের জন্য আরেকটি ব্যবহারের ক্ষেত্রে হ'ল এনওপি স্লেজ নামে পরিচিত । সংক্ষেপে ধারণাটি হ'ল নির্দেশের বিশাল পরিমাণে অ্যারে তৈরি করা যা কোনও পার্শ্ব প্রতিক্রিয়া সৃষ্টি করে না (যেমন suchNOPবা ইনক্রিমেন্টিং এবং তারপরে একটি রেজিস্টার হ্রাস) তবে নির্দেশিকা নির্দেশকটি বাড়িয়ে দিন। এটি উদাহরণস্বরূপ কার্যকর যখন কোনও কোডের নির্দিষ্ট অংশে ঝাঁপিয়ে পড়তে চায় যা ঠিকানা জানা যায় না। কৌশলটি হ'ল উল্লিখিত এনওপি স্লেজকে টার্গেট কোডের সামনে রাখবে এবং তারপরে স্লেডের কোথাও লাফিয়ে। যা হয় তা কার্যকরভাবে অ্যারে থেকে কার্যকর হয় যার কোনও পার্শ্ব-প্রতিক্রিয়া নেই এবং এটি কোডের পছন্দসই অংশটিকে আঘাত না করা অবধি নির্দেশ-প্রতি-নির্দেশকে অনুসরণ করে। এই কৌশলটি সাধারণত পূর্বোক্ত বাফার ওভারফ্লো শোষণে এবং বিশেষত ASLR এর মতো সুরক্ষা ব্যবস্থার বিরুদ্ধে লড়াই করতে ব্যবহৃত হয় ।

তবুও NOPনির্দেশের জন্য আরেকটি বিশেষ ব্যবহার হ'ল যখন কোনও একটি প্রোগ্রামের কোড পরিবর্তন করে। উদাহরণস্বরূপ, আপনি শর্তসাপেক্ষ জাম্পগুলির অংশগুলি NOPএস এর সাথে প্রতিস্থাপন করতে পারেন এবং শর্তটি এড়ানোতে পারেন । সফ্টওয়্যারটির অনুলিপি " ক্র্যাকিং " করার সময় এটি প্রায়শই ব্যবহৃত পদ্ধতি used সরলতমতম সময়ে এটি কোড if(genuineCopy) ...লাইন জন্য সমাবেশ কোড কনস্ট্রাক্ট অপসারণ এবং NOPএস এবং .. এর সাথে নির্দেশাবলী প্রতিস্থাপন সম্পর্কে ! কোনও চেক তৈরি হয় না এবং খাঁটি অনুলিপি কাজ করে!

নোট করুন যে সংক্ষেপে শেলকোড এবং ক্র্যাকিংয়ের দুটি উদাহরণ একই কাজ করে; অপারেশনের আপেক্ষিক ঠিকানাগুলি আপডেট না করে বিদ্যমান কোডটি সংশোধন করুন যা আপেক্ষিক ঠিকানার উপর নির্ভর করে।


2
এটি একটি দুর্দান্ত উত্তর ছিল, এটি ব্যাখ্যা করার জন্য সময় দেওয়ার জন্য ধন্যবাদ! অবশেষে বুঝলাম!
alvonellos

কিছু রিয়েল-টাইম সিস্টেম (পিএলসি মাথায় আসে) এটি চলমান অবস্থায় আপনাকে কোনও বিদ্যমান প্রোগ্রামে "প্যাচ" দেওয়ার অনুমতি দেয়। এই সিস্টেমগুলি প্রতিটি ছোট ছোট লজিকের আগেই এনওপিগুলিকে ছেড়ে দেয় যাতে আপনি OPোকাচ্ছেন এমন নতুন যুক্তিতে ঝাঁপ দিয়ে NOP ওভাররাইট করতে পারেন। নতুন যুক্তির শেষে এটি আপনি প্রতিস্থাপন করছেন এমন মূল যুক্তির শেষে চলে যাবে। নতুন যুক্তির সামনে একটি এনওপি থাকবে যাতে আপনি নতুন যুক্তিকেও প্রতিস্থাপন করতে পারেন।
স্কট হুইটলক

10

এ- দেরি স্লটে একটি ডুপ ব্যবহার করা যেতে পারে যখন সেখানে অন্য কোনও নির্দেশ পুনরায় অর্ডার করা না যেতে পারে।

lw   v0,4(v1)
jr   v0

এমআইপিএস-এ, এটি একটি বাগ হবে কারণ জুনিয়র যখন রেজিস্টারটি ভি 0 পড়ছিলেন তখন রেজিস্টার ভি0 আগের নির্দেশনা থেকে এখনও মান সহ লোড হয়নি।

এটির সমাধানের উপায় হ'ল:

lw   v0,4(v1)
nop
jr   v0
nop

এটি লোড শব্দের পরে ডিলি স্লটগুলি পূরণ করে এবং লাফের সাথে নিবন্ধের নির্দেশাবলীর নির্দেশ দেয় যাতে লাফ শব্দ নির্দেশটি জাম্প রেজিস্টার কমান্ড কার্যকর হওয়ার আগেই সম্পন্ন হয়।

আরও পড়া - কিছুটা বিলম্বের স্লটগুলিতে স্পার্ক করা । সেই দস্তাবেজ থেকে:

দেরি স্লটে কি রাখা যেতে পারে?

  • কিছু কার্যকর নির্দেশ যা আপনি শাখা করেন না তা কার্যকর করা উচিত।
  • কিছু নির্দেশনা কার্যকর কাজ করে যা আপনি কেবল যখন শাখা করবেন (বা যখন আপনি শাখা করবেন না), তবে অন্য ক্ষেত্রে যদি মৃত্যুদন্ড কার্যকর করা হয় তবে কোনও ক্ষতি করে না।
  • যখন সমস্ত কিছু ব্যর্থ হয়, একটি এনওপি নির্দেশনা

বিলম্ব স্লটে কি করা উচিত নয়?

  • সিসি সেট করে এমন যে কোনও কিছুই শাখার সিদ্ধান্তের উপর নির্ভর করে। শাখা নির্দেশটি এখনই শাখা করা উচিত কিনা তা সিদ্ধান্ত নিয়েছে তবে বিলম্বের নির্দেশ না দেওয়া পর্যন্ত এটি আসলে শাখাটি করে না। (কেবল শাখা বিলম্বিত হচ্ছে, সিদ্ধান্ত নয়।)
  • অন্য শাখার নির্দেশ। (আপনি যদি এটি করেন তবে এটি সংজ্ঞায়িতও করা হয় না! ফলাফলটি অনাকাঙ্ক্ষিত!)
  • একটি "সেট" নির্দেশনা। এটি সত্যই দুটি নির্দেশ, একটি নয় এবং এর অর্ধেকই বিলম্ব স্লটে থাকবে। (সমাবেশকারী আপনাকে এ সম্পর্কে সতর্ক করবে))

বিলম্ব স্লটে কী লাগাতে হবে তার তৃতীয় বিকল্পটি নোট করুন। আপনি যে বাগটি দেখেছেন সম্ভবত এটি কেউ এমন একটি জিনিস পূরণ করছে যা অবশ্যই বিলম্ব স্লটে রাখা উচিত নয়। Location লোকেশনটিতে কোনও উত্তর না দেওয়ার পরে বাগটি ঠিক হয়ে যায়।

দ্রষ্টব্য: প্রশ্নটি পুনরায় পড়ার পরে, এটি x86 এর জন্য ছিল, যার বিলম্ব স্লট নেই (পরিবর্তে কেবল পাইপলাইন স্টল করে) branch সুতরাং এটি বাগের কারণ / সমাধান হবে না। আরআইএসসি সিস্টেমে এর উত্তর হতে পারত।


4
নোট করুন যে প্রশ্নটি ট্যাগ হয়েছে x86, এবং x86 এর বিলম্ব স্লট নেই। কখনও হয় না, যেহেতু এটি একটি ব্রেকিং পরিবর্তন।
এমসাল্টারস

6

এনওপি ব্যবহারের কমপক্ষে একটি কারণ প্রান্তিককরণ। x86 প্রসেসরগুলি বেশ বড় বড় ব্লকগুলিতে মূল স্মৃতি থেকে ডেটা পড়েন এবং পড়ার জন্য ব্লকের শুরুটি সর্বদা প্রান্তিক থাকে, সুতরাং যদি কোনওর মধ্যে কোডের ব্লক থাকে তবে সেটি খুব বেশি পড়বে, এই ব্লকটি সারিবদ্ধ করা উচিত। এর ফলে সামান্য গতি হবে in


এটি ঠিক যে ব্লকটি সারিবদ্ধ করা দরকার তা নয়, এটি হ'ল আপনি আগের ব্লকের সর্বশেষ দম্পতি বাইট আনতে চান না। সুতরাং এটিতে লাফিয়ে ফেলা ঠিক আছে 0x1002, কারণ 16 বি এর সারিবদ্ধ ব্লকে এখনও 14 টি বাইট রয়েছে যাতে লক্ষ্য ঠিকানা রয়েছে তবে লাফিয়ে উঠতে ভাল নয় 0x099D
পিটার কর্ডস

3

NOP এর জন্য একটি উদ্দেশ্য (সাধারণ সমাবেশে, কেবল x86 নয়) এটি সময় বিলম্বের সূচনা করে। উদাহরণস্বরূপ আপনি এমন একটি মাইক্রোকন্ট্রোলার প্রোগ্রাম করতে চান যা 1 টি বিলম্বের সাথে কিছু এলইডি আউটপুট করতে হয়। এই বিলম্বটি এনওপি (এবং শাখাগুলি) দ্বারা প্রয়োগ করা যেতে পারে। অবশ্যই আপনি কিছু ADD বা অন্য কিছু ব্যবহার করতে পারেন, তবে এটি কোডটি আরও অপঠনযোগ্য করে তুলবে; অথবা হতে পারে আপনার সমস্ত নিবন্ধক প্রয়োজন।


1
সাধারণত দীর্ঘ সময় ফ্রেমের জন্য যেমন 1 সেকেন্ড, টাইমার ব্যবহার করা হয়। NOPS ঘড়িটির দৈর্ঘ্যের ক্রম - ন্যানো এবং মাইক্রো সেকেন্ডের মধ্যে একটি যুগের জন্য ব্যবহৃত হয়।
mattnz

এটি কেবলমাত্র একটি আধুনিক x86 নয়, একটি মাইক্রোকন্ট্রোলারকে বোঝায়। বেশিরভাগ x86 কোড আধুনিক সুপারসালার-এর-বাইরে-অর্ডার সিপিইউগুলির পাইপলাইন প্রস্থ পরিপূর্ণ করে না, সুতরাং বেশিরভাগ কোডে প্রতিটি নির্দেশের মধ্যে একটি এনওপি যুক্ত করা কেবলমাত্র একটি ছোট প্রভাব ফেলবে (আমি "গড়" কোডের জন্য নম্বরটি অনুমান করতে পারি) 5 20% নির্দেশাবলী সংখ্যা দ্বিগুন, কিছু না মন্দার কিন্তু কয়েক আঁট প্রায় এক 2x মন্দার দেখাচ্ছে লুপ দেখাচ্ছে কোড সহ জন্য।) যাই হোক, কর্কশ পুরাতন এক্স 86 কোড ঐতিহ্যগতভাবে ব্যবহৃত বিলম্ব loops জন্য নির্দেশ না NOPs। loop
পিটার কর্ডস

3

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

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


3

একটি x86 নির্দিষ্ট কেস এখনও রয়েছে যা অন্য উত্তরে বর্ণিত হয়নি: বিঘ্নিত হ্যান্ডলিং। এর কয়েকটি শৈলীর জন্য, বাধাগুলি অক্ষম থাকাকালীন কোড বিভাগ থাকতে পারে কারণ প্রধান কোড বাধা হ্যান্ডলারের সাথে ভাগ করা কিছু ডেটা নিয়ে কাজ করে, তবে এই ধরণের বিভাগগুলির মধ্যে বাধা দেওয়ার অনুমতি দেওয়া যুক্তিসঙ্গত। কেউ যদি নির্লিপ্তভাবে লেখেন


    STI
    CLI

এটি মুলতুবি বাধাগুলি প্রক্রিয়া করবে না কারণ, ইন্টেলের উদ্ধৃতি দিয়ে:

আইএফ পতাকা সেট হওয়ার পরে, প্রসেসরের পরবর্তী নির্দেশ কার্যকর হওয়ার পরে বাহ্যিক, মাস্কেবল বিঘ্নগুলিতে সাড়া দেওয়া শুরু করে।

সুতরাং এটি কমপক্ষে হিসাবে আবার লিখতে হবে:


    STI
    NOP
    CLI

দ্বিতীয় ভেরিয়েন্টে, সমস্ত মুলতুবি বাধা কেবল NOP এবং CLI এর মধ্যে প্রক্রিয়া করা হবে। (অবশ্যই, এসটিআই নির্দেশকে দ্বিগুণ করার মতো অনেকগুলি বিকল্প রূপ থাকতে পারে But তবে সুস্পষ্ট এনওপি কমপক্ষে আমার পক্ষে আরও স্পষ্ট)


-2

এনওপি মানে অপারেশন নয়

এটি সাধারণত মেশিন কোড সন্নিবেশ করানো বা মুছে ফেলার জন্য বা একটি নির্দিষ্ট কোড কার্যকর করতে বিলম্ব করার জন্য ব্যবহৃত হয়।

ক্র্যাকারস এবং ডিবাগারগুলি ব্রেকপয়েন্টগুলি সেট করতে ব্যবহৃত হয়।

সুতরাং সম্ভবত এর মতো কিছু করছেন: এক্সসিএইচজি বিএক্স, বিএক্স এর ফলাফলও ঘটবে।

আমার কাছে মনে হচ্ছে যেন কয়েকটি অপারেশন রয়েছে যা এখনও প্রক্রিয়াধীন রয়েছে এবং তাই এটি একটি ত্রুটি ঘটায়।

আপনি যদি ভিবির সাথে পরিচিত হন তবে আমি আপনাকে একটি উদাহরণ দিতে পারি:

আপনি যদি ভিবিতে লগইন সিস্টেম তৈরি করেন এবং 3 টি পৃষ্ঠা একসাথে লোড করেন - ফেসবুক, ইউটিউব এবং টুইটার 3 টি ভিন্ন ট্যাবে different

এবং সবার জন্য 1 লগইন বোতাম ব্যবহার করুন। আপনার ইন্টারনেট সংযোগটি ধীর হয়ে থাকলে এটি একটি ত্রুটি দিতে পারে। যার অর্থ পৃষ্ঠাগুলির একটি এখনও লোড হয়নি। সুতরাং আমরা এটিকে কাটিয়ে উঠতে অ্যাপ্লিকেশন.ডাউনভেন্টস এ রেখেছি। অ্যাসেম্বলি এনওপি তে একই উপায়ে ব্যবহার করা যেতে পারে।

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