ฉันสามารถเรียกใช้งานไบนารี่ลินุกซ์โดยไม่ได้ตั้งค่าบิตการอนุญาตหรือไม่


25

มีวิธีเรียกใช้ไฟล์ไบนารี่ที่สามารถใช้งานได้ภายใต้ลีนุกซ์ซึ่งไม่ได้ตั้งค่าบิตเรียกทำงานหรือไม่? chmod +xไม่ใช่ตัวเลือก

เช่นการอนุญาตอาจมีได้r--r--r--เฉพาะ

รันสคริปต์เป็นไปได้โดยไม่ต้องตั้งรันบิตและวางใน shebang โดยการส่งผ่านแหล่งที่มาเพื่อล่ามเช่นหรือbash script.shpython script.py

ดังนั้นมีบางอย่างexecute abinaryfileที่จะโหลดรหัสวัตถุในหน่วยความจำและเรียกใช้หรือไม่


3
ทำสำเนาและ chmod ตัวเลือก?
TiCL

ไม่ฉันสงสัยว่าถ้ามีวิธีการดำเนินการไบนารีในสภาพแวดล้อมที่บิตได้รับอนุญาตไม่สามารถตั้งค่า (หรือตามไฟล์ที่กำหนดหรือสำเนาใด ๆ ของมัน ... )
ทอม

คำตอบ:


35

คุณสามารถใช้ /lib/ld*.so เป็นล่าม ELF ได้เช่น:

$ cp /bin/ls /tmp/ls
$ chmod a-x /tmp/ls
$ /lib/ld-linux.so.2 /tmp/ls

ชื่อจริงแตกต่างจากสถาปัตยกรรมกับสถาปัตยกรรม บางชื่อ ได้แก่/lib/ld-linux.so.2, และ/lib/ld-linux-x86-64.so.2 คุณอาจจะพบว่ามันแปลกประหลาดเป็น/lib/ld-2.7.so/lib/ld*


ข้อมูลที่ดี ..... ยังไง ld ย่อมาจากอะไร?
Vineet Menon

@VineetMenon ldเป็นโปรแกรมลิงก์ / โหลดเดอร์ มันค้นหาและโหลดไลบรารีที่แบ่งใช้ที่ใช้โดยโปรแกรมจากนั้นเรียกใช้งานมัน ld-linuxจัดการเอลฟ์ไบนารี
Daniel Beck

ตกลงสิ่งที่ถ้า/lib/ld-linux.so.2ไม่ได้ปฏิบัติการ (ที่เป็นไปได้ยัง?)
LawrenceC

@ultrasawblade AFAIK .soสามารถโหลด s ที่ปฏิบัติการได้เท่านั้นและld-linuxมีความสำคัญ
Daniel Beck

ใน Ubuntu แบบ 64 บิตมันคือ/lib64/ld-linux-x86-64.so.2
Tor Klingberg

1

ไม่อย่างน้อยก็ไม่ใช่ในลักษณะเดียวกัน คุณยังคงดำเนินการไบนารีเมื่อคุณทำสิ่งหลาม Python คือ + x คุณจะต้องรวบรวมสิ่งที่สามารถโหลดไฟล์และดำเนินการได้

TiCL ควรตอบคำถามของเขา / เธอเพราะเป็นวิธีที่ดีที่สุด


ใช่ฉันเข้าใจ "หลาม" เป็นเลขฐานสองในกรณีนั้น สิ่งที่ฉันหวังไว้คือ "รวบรวมบางสิ่งที่สามารถโหลดไฟล์และเรียกใช้งาน" มีอยู่แล้ว ...
Tom

@ Tom คุณจะพบโปรแกรม C ที่สามารถอ่านไบนารีลงในหน่วยความจำและดำเนินการได้ ฉันไม่ทราบว่า Python อยู่ในระดับต่ำพอที่จะทำในวิธี C หรือไม่
new123456

0

execsyscall ของลินุกซ์ล้มเหลวด้วยEACCESถ้าไฟล์ไม่ปฏิบัติการ

ในขณะที่คุณสามารถทำได้sh myprog.shพยายามเรียกใช้โปรแกรมในขณะที่./myprog.shไม่สามารถทำงานได้เนื่องจากเมื่อคุณทำเช่นนั้น:

สิ่งนี้สามารถตรวจสอบได้ด้วยmain.c:

#define _XOPEN_SOURCE 700
#include <errno.h>
#include <stdio.h>
#include <unistd.h>

int main(void) {
    char *argv[] = {"myprog", NULL};
    char *envp[] = {NULL};
    int ret;
    ret = execve("myprog.sh", argv, envp);
    perror("execve");
    printf("%d\n", errno);
    printf("%d\n", EACCES);
}

และmyprog.sh:

#!/bin/sh
echo worked

หากmyprog.shไม่สามารถเรียกใช้งานได้mainล้มเหลวด้วย:

execve: Permission denied
13
13

การทดสอบใน Ubuntu gcc -std=c9917.10,

POSIX 7 กล่าวถึงที่:

ฟังก์ชั่น exec ยกเว้น fexecve () จะล้มเหลวหาก:

[EACCES] สิทธิ์การค้นหาถูกปฏิเสธสำหรับไดเรกทอรีที่ระบุไว้ในคำนำหน้าพา ธ ของไฟล์อิมเมจกระบวนการใหม่หรือไฟล์อิมเมจกระบวนการใหม่ปฏิเสธการอนุญาตให้ใช้งาน

เหตุผลเพิ่มเติมสามารถดูได้ที่: https://security.stackexchange.com/questions/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.