Welcome, Guest
Username: Password: Remember me
  • Page:
  • 1

TOPIC:

Binary Modification (Açıklıkları Yamama) 9 years 10 months ago #142

  • quantum50
  • quantum50's Avatar Topic Author
  • Offline
  • Elite Member
  • Elite Member
  • Posts: 480
  • Karma: 4
  • Thank you received: 6
Güvenlik dünyasında uygulama güvenliğinin önemi tartışılamaz. Bugtraq, Full-disc vb. e-postal listelerini takip ediyorsanız, birçok zero-day güvenlik açığının yayınlandığını görebilirsiniz.

Bu yazıda “disassembler” yardımıyla güvenlik zaafiyeti bulunan programların nasıl yamalanacağı temel düzeyde gösterilecektir.

Patching ?
Bu makalede anlatılacaklar literatürde “hotpatching” veya “runtime patching” olarak da bilinmektedir. Disassembler vb. yardımıyla bir programın “binary” kodlarının belli bir amaç için değiştirilmesine “patching” denilebilir.

Tersine mühendislerin (reverse engineers) bir çok işlemde kullandığı bir teknik. (API Hooking, Cracking , Code injection vb.) Ancak bu makalede “patching” tekniği uygulama açıklarının yamalanması açısından ele alınacaktır.

Alet Çantası
Her tersine mühendisin kullandığı bilinen programlar (debuggers, disassemblers, hex editor) bu makalede anlatılacak tekniği uygulamada yardımcı olabilirler.

Ancak IDA Pro, Ollydbg gibi “inline assembler” ve “binary edit” özelliği olan debugger/disassembler yazılımları yapılacak işi kolaylaştıracaktır. Tabi bu “inline assemble” ve binary edit özelliklerinin “x86” çalıştırılabilir dosyaları için geçerli olduğu unutulmamalıdır.

Örneğin bir ARM Executable(çalıştırılabilir) dosyası üzerinde patch işlemi yapılacaksa, IDA sadece disassemble kısmında yardımcı olacak, “patching” için işlemci kaynak kitaplarındaki Opcode (instruction encoding) gibi konulara göz atmanın faydası olacaktır.

Uygulama
Aşağıdaki hafıza taşması zaafiyeti barındıran program üzerinde patching işlemi yapılacaktır. Önce programı derleyin ve artık kaynak kodunu unutun çünkü bu bizim kapalı kaynak kodlu yazılımımız.

#include <stdio.h>
int main()
{
char buf[16];
printf("\nString giriniz:");
scanf("%s", &buf);
return 0;
}
*Hafıza taşması nedir, nasıl oluşur, etkileri vb. konularının bilindiği varsayılarak bu konulara değinilmiyecektir.

tablo-1.png
Resim - 1 Hafıza Taşması Zaafiyeti Barındıran Program Kaynak Kodu
Disassembler çıktısında ve öncesinde kaynak kodda da görüldüğü gibi “scanf” fonksiyonu girilen string'in uzunluğunu kontrol etmiyor. (%s) Bildiğiniz gibi scanf, sprintf gibi fonksiyonlarda format karakterinin önüne eklenecek sayı ile uzunluk kontrolü yapılabilir. (%15s veya %.15s gibi)

Şimdi adım adım bu hatayı düzeltmeye çalışalım. Bu düzeltme işlemi için alet olarak patching işlemlerinde daha kolay bir ortam sunduğu için Ollydbg tercih edilmiştir. IDA Pro ise analiz işlemlerinde tercih edilecektir.

Ollydbg ile vulnerable(savunmasız) programı açalım;

Disassembler'da görüldüğü gibi program string'i hafızaya taşımak için “00403011” adresini çağırıyor.

Ollydbg'da CTRL+G yapıp 00403011 adresine gidelim;
AND EAX, 694D0073 satırına sağ tıklayıp Assemble seçeneğine tıklayalım. %s 'i %15s olarak değiştirip fonksiyonun “buf” değişkenine kopyalanacak stringin uzunluğunu kontrol etmesi sağlanacak.

“AND EAX, 694D0073” kodunu “AND EAX, 733531” ile değiştiriyoruz. (313573 ün ascii karşılığını ve neden tersten girildiğini biliyorsunuz (lifo))

Evet bütün işlem bu, programın vulnerable kısmı kolayca yamalandı. Programı bu haliyle kaydetmek için değiştirilen satıra sağ tıklanıp “Copy to executable> Selection” seçeneğine tıklanır. Açılan yeni pencereyi kapatırken programın orjinalinden farklı olduğunu bu haliyle kaydetmek isteyip istenilmediği sorulacaktır. Programı kaydettikten sonra IDA ile son haline bir göz atarsak ;
Bu yazıda “disassembler” yardımıyla güvenlik zaafiyeti bulunan programların nasıl yamalanacağı hususu temel düzeyde ele alınmıştır.

Please Log in or Create an account to join the conversation.

  • Page:
  • 1
Time to create page: 1.081 seconds

NDK Hoş Geldin