Format Karmaşası (Generate Binary Polyglots)

Hasan Ç.
4 min readApr 21, 2022

Bu yazımda size kısaca polyglots oluşturmayı göstereceğim, yani 2 farklı formatı veya programlama dilini aynı dosya üzerinde birleştirmeyi göstereceğim.
Bunu bir çok yol ile yapabilirsiniz belki , ama burada 2 dosya formatı da aktif olacak :)

Yazımı çook daha detaylıca işin matematiğine girerek de anlatabilirdim, ama bir çoğunuzu sıkacağı için bunu çook ama çook kısa ve bir araç ile örnek vererek pratiğini göstereceğim. Ama yine de merak edenler için “Anahtar Taahhüdü Olmadan Kimliği Doğrulanmış Şifrelemeyi Kötüye Kullanma ve Düzeltme” makalesini okuyabilirler linki ise: →https://eprint.iacr.org/2020/1456.pdf

Kullanılacak araç: https://github.com/Realradioactive/mitra Veya orjinali →https://github.com/corkami/mitra

İlk başta bu yazıyı görünce hemen aklınıza bir zip ve exe dosyasını birleştirerek, exe dosyasına bir payload(reverseshell) eklemek ve bu çalışan zip dosyasını ve aynı anda çalışan exe payload dosyasını ufak ayarlar sonrası antivirüslerden kaçırma fikri gelecektir. Ama o iş öyle olmuyor. Bu yöntem ilk çıktığında belki işe yarayabilirdi ama artık pek mümkün değil, ki .zip formatını .exe gibi çalıştıramazsınız her ne kadar içerisinde gömülü olsada payloadınız çalışmaz. Neyse devam edelim

Evet ilk başta dosyalarımızı tanıyalım.

3 Dosya var

  1. PDF (pozitron.pdf) 2.png(ccc.png) 3.jpg(abc.jpg)

Bu örnekte saz notalarının olduğu(evet :D bağlama notaları uzun sap Do karar :D ) ve oluşturduğum basit bir pdf dosyası var

Basit bir ptyhon scripti ile bu 2 dosyayı birleştireceğiz ama ondan önce hex. olarak basitçe bir inceleyelim dosyaları.

İlk başta ilk 15 satırı gösterdiğim .pdf dosyası var daha sonra png dosyası var gördüğünüz gibi hex değerlerini ve format verisi açıkça ortada.(head n 15 yaptım zira veri çok uzundu )

Şimdi Polyglots yani çoklu dil yaptığımız yani birleştirdiğimiz dosyayı inceliyelim.

Bakın değerlere aynı .png formatı gibi değil mi ? Hayır değil. yani tam olarak :) İleriki satırlarda pdf verisi başlıyor fakat ben öyle uzun uzadıya karmaşanın içinden seçmeniz kolay olsun diye girek getirdim. greplediğim pdf uzantı verisinin ilk satırını Heksadesimal olarak görüyorsunuz.

Bu arada bu yaptığımız işlem steganografi yani veri gizleme gibi gözükse de ve benzese de aynı işlem değildir.

Şimdi geçelim bu işlemi nasıl yaptığımıza .

İlk başta yazının başında verdiğim github arşivini indirmelisiniz.Daha sonra çok ama çok basit 1–2 satır komut ile siz de kendi Polyglots larınızı yapabileceksiniz.

Adım 1-
python3 mitra.py dosya1 dosya2

Ve daha sonra saliseler içerisinde işlem bitiyor.

Şimdi hemen dosyamızı açalım. Evet karşımıza .pdf dosyası çıktı.

Şimdi formatı değiştirelim. Sadece .pdf yi siliyorum ve .png kalıyor başka hiç bir işlem yapmıyorum dosya aynı dosya.

Veee
Ta ta ta daaam

Aynı dosya üzerinde 2 farklı format verisini görüyoruz.

Şimdi bu işlemi başka şekilde ifade edelim.

“Çok dilli bir program oluşturmak için en yaygın olarak kullanılan iki teknik, yorumlar için farklı karakterler kullanan dilleri özgürce kullanmak ve çeşitli simgeleri farklı dillerde diğerleri gibi yeniden tanımlamaktır. Genellikle, sözdizimi tuhaflıklarından iyi bir şekilde yararlanılır. Bunlar, ANSI C , PHP ve bash ile yazılmış bu kamuya açık çok dilli dilde gösterilmiştir.”

Yani alttaki kodlarda gördüğünüz gibi bu küçük script hem C hem php aynı zamanda bash porgramcığıdır. 3 farklı şekilde çalışan ama aynı dosya içerisinde bulunan klasik bir çokludil yapısına örnektir.

#define a /*
#<?php
echo "\010Hello, world!\n";// 2> /dev/null > /dev/null \ ;
// 2> /dev/null; x=a;
$x=5; // 2> /dev/null \ ;
if (($x))
// 2> /dev/null; then
return 0;
// 2> /dev/null; fi
#define e ?>
#define b */
#include <stdio.h>
#define main() int main(void)
#define printf printf(
#define true )
#define function
function main()
{
printf "Hello, world!\n"true/* 2> /dev/null | grep -v true*/;
return 0;
}
#define c /*
main
#*/

  • Bir karma işareti, C’de bir önişlemci ifadesini işaretler, ancak hem bash hem de PHP’de bir yorumdur.
  • “//” hem PHP’de hem de C’de ve bash’ta kök dizinde bir yorumdur .
  • Kabuk yeniden yönlendirmesi , istenmeyen çıktıları ortadan kaldırmak için kullanılır.
  • Açıklamalı satırlarda bile “ <?php" ve " ?>" PHP göstergeleri hala etkilidir.
  • function main()" ifadesi hem PHP hem de bash için geçerlidir; int main(void)C #defines , derleme zamanında onu " " biçimine dönüştürmek için kullanılır .
  • Yorum göstergeleri, çeşitli işlemleri gerçekleştirmek için birleştirilebilir.
  • if (($x))" hem bash hem de PHP'de geçerli bir ifadedir.
  • printfköşeli ayraçları içermemesi dışında C printf ile aynı olan bir bash kabuk yerleşikidir (bu, bir C derleyicisi ile derlenmişse C önişlemcisinin eklediği ).
  • mainSon üç satır, işlevi çağırmak için yalnızca bash tarafından kullanılır . PHP'de mainişlev tanımlanır ancak çağrılmaz ve C'de işlevi açıkça çağırmaya gerek yoktur main

<--

Teşekkürler :)

Kaynaklar:
https://en.wikipedia.org/wiki/Polyglot_(computing)
https://github.com/Realradioactive/mitra
https://github.com/corkami/mitra
Benim testlerim ve ben :D
https://medium.com/@hasanclskn

--

--

Hasan Ç.

Geophysical Engineer, İnformation Security, Cyber Security And Penetration Tester Specialist blog https://realradioactive.github.io/