স্ক্রিপ্টিং ভাষা থেকে একটি লিনাক্স সিস্কল কল করুন


15

আমি সরাসরি একটি স্ক্রিপ্টিং ভাষা থেকে একটি লিনাক্স সিস্কেল (বা কমপক্ষে libc মোড়ক) কল করতে চাই। কোন স্ক্রিপ্টিং ভাষাটি আমি খেয়াল করি না - এটি সঙ্কলিত না করা কেবল গুরুত্বপূর্ণ (কারণ মূলত নির্ভরতার পথে সংকলকটি না চাওয়ার সাথে সম্পর্কিত তবে এটি এখানে বা সেখানে নয়)। এখানে কি কোনও স্ক্রিপ্টিং ভাষা রয়েছে (শেল, পাইথন, রুবি, ইত্যাদি) যা এটির অনুমতি দেয়?

বিশেষত, এটি গেটরেন্ডম সিস্কেল


3
getrandom কেবল এলোমেলো বাইট থেকে টান /dev/urandom। আপনি অবশ্যই এটি শেল স্ক্রিপ্ট থেকে করতে পারেন।
স্টিভ

@ প্রকৃতপক্ষে, /devএখনও অবধি উপলব্ধ না হলে। তবে তারপরে পার্ল কল্পনা করা শক্ত হবে!
ডারোবার্ট

সমালোচনামূলকভাবে, আমি এন্ট্রপি পুলটি শুরু না হওয়া অবধি এটি অবরুদ্ধ করতে চাই, যা ফাইল হিসাবে / dev / urandom থেকে পড়ে না।
জোশল্ফ

5
/dev/randomএটি অবরুদ্ধ হওয়া অবধি পড়ুন , তারপরে পড়বেন /dev/urandom?
বিশপ

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

উত্তর:


33

পার্ল এটির syscallকার্যকারিতা দিয়ে এটিকে মঞ্জুরি দেয় :

$ perldoc -f syscall
    syscall NUMBER, LIST
            Calls the system call specified as the first element of the list,
            passing the remaining elements as arguments to the system call. If
⋮

ডকুমেন্টেশন কল কল (2) কল করার একটি উদাহরণ দেয়:

require 'syscall.ph';        # may need to run h2ph
my $s = "hi there\n";
syscall(SYS_write(), fileno(STDOUT), $s, length $s);

যদিও আমি কখনও এই বৈশিষ্ট্যটি ব্যবহার করেছি তা বলতে পারি না । ঠিক আছে, উদাহরণস্বরূপ নিশ্চিত করার আগে ঠিক এখন কাজ করে।

এটি এর সাথে কাজ করে বলে মনে হচ্ছে getrandom:

$ perl -E 'require "syscall.ph"; $v = " "x8; syscall(SYS_getrandom(), $v, length $v, 0); print $v' | xxd
00000000: 5790 8a6d 714f 8dbe                      W..mqO..

এবং যদি আপনার syscall.ph এ getrandom না থাকে তবে আপনি তার পরিবর্তে নম্বরটি ব্যবহার করতে পারেন। এটি আমার ডেবিয়ান টেস্টিং (amd64) বাক্সে 318। সাবধান! লিনাক্স সিস্কল নম্বরগুলি আর্কিটেকচার-নির্দিষ্ট are


2
পার্ল - পরিকল্পনা বি হাতুড়ি!
থোরবজর্ন রাভন অ্যান্ডারসন

28

পাইথনে আপনি ctypesগতিশীল লাইব্রেরিতে স্বেচ্ছাসেবী ফাংশন অ্যাক্সেস করতে মডিউলটি ব্যবহার করতে পারেন , syscall()libc সহ :

import ctypes

SYS_getrandom = 318 # You need to check the syscall number for your target architecture

libc = ctypes.CDLL(None)
_getrandom_syscall = libc.syscall
_getrandom_syscall.restypes = ctypes.c_int
_getrandom_syscall.argtypes = ctypes.c_int, ctypes.POINTER(ctypes.c_char), ctypes.c_size_t, ctypes.c_uint

def getrandom(size, flags=0):
    buf = (ctypes.c_char * size)()
    result = _getrandom_syscall(SYS_getrandom, buf, size, flags)
    if result < 0:
        raise OSError(ctypes.get_errno(), 'getrandom() failed')
    return bytes(buf)

যদি আপনার লিবিসিতে getrandom()মোড়ক ফাংশন অন্তর্ভুক্ত থাকে তবে আপনি এটিকেও কল করতে পারেন:

import ctypes

libc = ctypes.CDLL(None)
_getrandom = libc.getrandom
_getrandom.restypes = ctypes.c_int
_getrandom.argtypes = ctypes.POINTER(ctypes.c_char), ctypes.c_size_t, ctypes.c_uint

def getrandom(size, flags=0):
    buf = (ctypes.c_char * size)()
    result = _getrandom(buf, size, flags)
    if result < 0:
        raise OSError(ctypes.get_errno(), 'getrandom() failed')
    return bytes(buf)

সিস্কেলের getrandomচেয়ে সরাসরি আপনি libc ফাংশন কল করার একটি উদাহরণ যুক্ত করতে পারেন getrandom? এটা কি সম্ভব?
জোশল্ফ

@ জোশল্ফ অবশ্যই এটি সম্ভব আমি আমার উত্তর সম্পাদনা করেছি।
cg909

আপনি কি জানেন যে SYS_getrandomরানটাইমের সময় গতিরূপে মানটির সঠিক মূল্য অনুসন্ধান করার কোনও উপায় আছে (যাতে আপনি এটি বর্তমান প্ল্যাটফর্মের জন্য সঠিকভাবে পেয়েছেন)? উদাহরণস্বরূপ, /usr/includeহেডার ফাইলগুলি বিশ্লেষণ করে?
জোশল্ফ

আমি চেষ্টা করে দেখিনি, তবে পাইকপার্সারের সাথে আপনার ভাগ্য থাকতে পারে ।
cg909

17

রুবির একটি syscall(num [, args...]) → integerফাংশন রয়েছে।

উদাহরণ স্বরূপ:

irb(main):010:0> syscall 1, 1, "hello\n", 6
hello
=> 6

সহ getrandom():

irb(main):001:0> a = "aaaaaaaa"
=> "aaaaaaaa"
irb(main):002:0> syscall 318,a,8,0
=> 8
irb(main):003:0> a
=> "\x9Cq\xBE\xD6|\x87\u0016\xC6"
irb(main):004:0> 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.