במקום לפתוח shell

healthy2

New member
שלום

כתבתי תוכנית אסמבלי (NASM, על אובונטו 20.4 64 ביט) שמממשת syscall execve עבור הפקודה sh.

במקום לפתוח shell, התוכנית לא עושה דבר.

הייתי מאד מודה לכל עזרה במימושה התקין של התוכנית: הפעלת shell.

הנה הוקד:

global _start

_start:

mov rax,59

xor rdi, rdi

mov rdi, str1


xor rsi, rsi

mov rsi, str2


mov rdx, 0xa


syscall ;execute execve syscall


mov rax,60

xor rdi,rdi

syscall ;execute exit syscall



section .data

str1: db '/bin/sh' ;string of the first argument of execve

str2: db '/bin/sh',0xa ;string array of the secand argument of execve.​



כך אני מקמפלת אותה ומריצה :


nasm -felf64 execve_sh.nasm -o xxx.o

ld xxx.o -o zzz

./zzz


תודה רבה

טלי
 

BravoMan

Active member
ההודעה הזו בת חודש כמעת, אבל אולי יש סיכוי להחיות את הפורום, אז אענה:

בקוד שלמעלה יש מספר בעיות:
1. הקוד משתמש בערך 0xa במספר מקומות בהם צריך להיות ערך 0 (מצביע NULL או סוף מחרוזת).
2. חסרה תווית text.
3. כל הקוד שאחרי קריאה ל-execve מיותר, כי קריאה זו לא חוזרת והתהליך הנוכחי מוחלף בתהליך החדש.
4. הפרמטר השני של execve אינו מחרוזת, כפי שמוגדר בקוד, אלא מערך מחרוזות - כלומר, מערך מצביעים.

כך נראה קוד עם תיקונים לכל הבעיות הנ"ל:
קוד:
section .text
global _start

_start:
    mov rax,59
    mov rdi, filename
    mov rsi, argv
    xor rdx, rdx ;third parameter to execve is NULL for this example

    syscall ;execute execve syscall

section .data

    filename:
        db '/bin/sh', 0 ;string of the first argument of execve
    
    argv:
        dq filename, 0 ;this is an array of 64 bit (QUAD WORD) pointers
 

healthy2

New member
ההודעה הזו בת חודש כמעת, אבל אולי יש סיכוי להחיות את הפורום, אז אענה:

בקוד שלמעלה יש מספר בעיות:
1. הקוד משתמש בערך 0xa במספר מקומות בהם צריך להיות ערך 0 (מצביע NULL או סוף מחרוזת).
2. חסרה תווית text.
3. כל הקוד שאחרי קריאה ל-execve מיותר, כי קריאה זו לא חוזרת והתהליך הנוכחי מוחלף בתהליך החדש.
4. הפרמטר השני של execve אינו מחרוזת, כפי שמוגדר בקוד, אלא מערך מחרוזות - כלומר, מערך מצביעים.

כך נראה קוד עם תיקונים לכל הבעיות הנ"ל:
קוד:
section .text
global _start

_start:
    mov rax,59
    mov rdi, filename
    mov rsi, argv
    xor rdx, rdx ;third parameter to execve is NULL for this example

    syscall ;execute execve syscall

section .data

    filename:
        db '/bin/sh', 0 ;string of the first argument of execve
  
    argv:
        dq filename, 0 ;this is an array of 64 bit (QUAD WORD) pointers
תודה רבה על התשובה המאד מפורטת.
אני כבר לא זוכרת כיצד התגברתי על בעיה זאת, אך עדיין שמחתי לקבל את התשובה, גם אם באיחור (שלי) של כמעט חודש מעת פרסומה :)
טלי
 
למעלה