assemble
Forum Kalfası
C++ ile toplama işlemi:
Delphi ile toplama işlemi :
Her ikisininde Assembly karşlıklılar :
C++
Delphi:
Görüldüğü gibi hangi dilde yazılırsa yazılsın derleyiciler tarafından üretilecek assembly kodları birbirinin ya tamamen aynısı ya da çok az farklı olacaktır.
Assembly dilinde üst seviyeli programlama dillerindeki farklar ortadan kalktığı için programlara yapılmak istenen müdahale de yine bu dil ile olmaktadır.
Assembly ile yapılacak değişikliğin program üzerindeki etkisini anlamak için yukarıda; 1. örnekteki add eax, edx satırını şu şekilde değiştirelim sub eax, edx ve 2. örnekteki add eax, [ebp + 0C ] satırını şu şekilde değiştirelim sub eax, [ ebp + 0C ]. Bu değişiklik ile Topla işlevinden beklenen toplama işlemi sonucu yerine çıkarma işlemi sonucu üretilecektir.
Gözden kaçırılmamalıdır ki; programınız için geliştirdiğiniz algoritmalar da başkaları tarafından yine aynı şekilde kopya edilebilir, kontrol mekanizmalarınız kırılabilir, şifreler elde edilebilir, vs.
Durum böyle olunca ister istemez akla programımızın amacından farklı çalıştırılmasının nasıl önüne geçilebilir sorusu akla gelmektedir. İşte bu sorunun cevabıdır, yazılım güvenliği.
Yazılım Güvenliğine Genel Bakış
Yazılım güvenliği genel olarak; yazılımların tersine mühendislik yöntemleri ve araçları ile (debugger, disassembler, vb.) algoritmalarının ortaya çıkartılması veya değiştirilmesini engellemeyi amaçlayan yöntemler bütünüdür. Yazılım güvenliğinin ele aldığı temel sorunlar, kodların açığa çıkmasını ve değiştirilmesini (debugging, tracing ya da disassembly ile) ve tersine mühendislik araçlarını (debugger, disassembler, vb.) engellemek şeklinde özetlenebilir.
Tersine mühendislik için kullanılan araçları da kısaca tanıyacak olursak:
Debugger: Derlenmiş bir programın, çalışma anında assembly kodlarına dönüştürülmesi ve üzerinde değişiklik yapılmasını sağlayan araçlardır. En yaygın tersine mühendislik aracıdır. Çok çeşitlidir tersine mühendislerin en sevdiği araçtır.
Disassembler: Derlenmiş bir programın, çalıştırılmadan çözümlenmesini (assembly kodlarına dönüştürme) sağlayan tersine mühendislik aracıdır. Uygulama algoritmalarının ve denetim mekanizmalarının kavranarak çözümlenmesi amacıyla sıkça kullanılmaktadır.
Özetleyecek olursak; yazılım güvenliğini ortaya çıkaran sorun tersine mühendislik araç ve yöntemlerininin kötüye kullanılmasıdır. Buna karşı yöntem geliştirmek çok fazla bilgi ve tecrübe gerektirdiğinden sıradan bir yazılımcı ya da programcılar tarafından engellenmesi de mümkün değildir.
Yazılım Güvenliğinde Etkileşim
Gelişen bilgisayar ve yazılım teknolojileri yazılım güvenliğini daha da karmaşık hale getirmiştir. Dün, işletim sistemleri ve programlarımız sadece donanım ile etkileşim halinde iken bugün işletim sistemleri, işletim sistemi bileşenleri, kullanıcı bileşenleri, 3. parti bileşenler vs. ile etkileşimlidir.
Etkileşim beraberinde güvenlik sorunlarını da getirmektedir. Böylesi karmaşık problemlerin çözümlenmesi için problemde soyutlama yapılarak, saldırıya en fazla maruz kalacak nesne (base object) tespit edilerek korunması sağlanır. Bu yaklaşım ise çoğu zaman etkileşimli bileşenlerin korunmasını göz ardı etmeyi gerektirir.
Güvenliğin En Zayıf Halkası Çalışabilirler (Programlar)
Yukarıda da anlattığı gibi yazılım güvenliğnin en zayıf halkasını çalışabilirler (programlar) oluştururlar. Çünkü; uygulama geliştiriciler (programcılar) yazılım güvenliği bilgilerine sahip değillerdir. Bir program üzerinde güvenlik açığı oluşturabilecek pek çok unsur bulunmaktadır.
Bu unsurlar:
Code: Uygulamaların kodlarının bulunduğu bölümdür. Programların çalışabilir kodları burada bulunur. En fazla saldırıya maruz kalan bölümdür. Üzerinde değişiklik yapılması çok da kolay değildir. Temel assembly bilgisinden daha fazlasını gerektirir.
Import: Uygulamaların diğer bileşenleriyle ve işletim sistemleriyle bütünleşme noktalarıdır. Programların çalışmasına doğrudan etkisi vardır. Ulaşılması ve değiştirilmesi oldukça kolay olduğundan saldırganlar tarafından sıkça kullanılmaktadır. Bölümün bir özelliği de, uygulamanın çalışmasına yönelik bilgiler bulundurmasıdır. Buradaki bilgiler normal kullanıcılar ya da program geliştiriciler için önemli gibi görünmesede, saldırgan için değerli bilgiler içerir. Bu bakımdan da saldırganlar için yüksek önceliğe sahiptir. Genel olarak bu bölüme yapılan saldırılar:
Bütünleşme adresleri üzerinde değişiklikler,
Saldırgan tarafından hazırlanan bileşenlerin uygulama etkileşimine dahil edilmesi,
Uygulama kodlarının ve verilerinin daha belleğe yüklenme sırasında değiştirilmesi ya da yönlendirilmesi,
Bütünleşmesi beklenen bileşenler yerine saldırgan tarafından hazırlanan bileşenleri ikame edilmesi, vb. yöntemler sayılabilir.
Resource: Uygulama iç verilerinin tutulduğu ve ihtiyaç duyulduğunda karşılandığı bölümüdür. Programların çalışmasına dolaylı etkisi vardır. Ulaşılması ve değiştirilmesi oldukça kolaydır, ancak doğrudan çalışabilir olmadığından saldırganlar için daha düşük önceliğe sahiptir. Uygulama iç verileri (resimler, sesler, ikonlar, vb.) burada bulunduğundan başkaları tarafından da kolayca kopya edilebilir. Herhangi bir program üzerinden kopya edilen resimler, sesler ya da ikonlar değersiz gibi görünsede ülkemizde de patente konu olduğundan dikkatle korunması gerekmekir. Bu bölüm üzerinden saldırı yapmak daha fazla tecrübe gerektirdiğinden uzman saldırganlar tarafından tercih edilir.
Uygulama güvenliğinde korunması gereken en önemli unsurları bu üç bölüm oluşturmaktadır. Bunlar dışında uygulama üzerinden yapılacak pek çok saldırı türü ve bu amaçla kullanılabilecek uygulama unsurları bulunmaktadır. Bu yazıda yalnızca en güncel ve en çok kullanılan yöntemler ele alınmıştır.
Kynk: Tübitak
Kod:
int __stdcall Topla( int _giA, int _giB )
{ return _giA + _giB; }
Kod:
function Topla( _giA, _giB : Integer ) : Integer; stdcall;
begin
Result := _giA + _giB;
end;
C++
Kod:
push ebp
mov ebp, esp
mov eax, [ ebp + 8 ]
mov edx, [ ebp + 0C ]
add eax, edx
mov esp, ebp
pop ebp
ret 8
Kod:
push ebp
mov ebp, esp
mov eax, [ ebp + 8 ]
add eax, [ ebp + 0C ]
mov esp, ebp
pop ebp
ret 8
Assembly dilinde üst seviyeli programlama dillerindeki farklar ortadan kalktığı için programlara yapılmak istenen müdahale de yine bu dil ile olmaktadır.
Assembly ile yapılacak değişikliğin program üzerindeki etkisini anlamak için yukarıda; 1. örnekteki add eax, edx satırını şu şekilde değiştirelim sub eax, edx ve 2. örnekteki add eax, [ebp + 0C ] satırını şu şekilde değiştirelim sub eax, [ ebp + 0C ]. Bu değişiklik ile Topla işlevinden beklenen toplama işlemi sonucu yerine çıkarma işlemi sonucu üretilecektir.
Gözden kaçırılmamalıdır ki; programınız için geliştirdiğiniz algoritmalar da başkaları tarafından yine aynı şekilde kopya edilebilir, kontrol mekanizmalarınız kırılabilir, şifreler elde edilebilir, vs.
Durum böyle olunca ister istemez akla programımızın amacından farklı çalıştırılmasının nasıl önüne geçilebilir sorusu akla gelmektedir. İşte bu sorunun cevabıdır, yazılım güvenliği.
Yazılım Güvenliğine Genel Bakış
Yazılım güvenliği genel olarak; yazılımların tersine mühendislik yöntemleri ve araçları ile (debugger, disassembler, vb.) algoritmalarının ortaya çıkartılması veya değiştirilmesini engellemeyi amaçlayan yöntemler bütünüdür. Yazılım güvenliğinin ele aldığı temel sorunlar, kodların açığa çıkmasını ve değiştirilmesini (debugging, tracing ya da disassembly ile) ve tersine mühendislik araçlarını (debugger, disassembler, vb.) engellemek şeklinde özetlenebilir.
Tersine mühendislik için kullanılan araçları da kısaca tanıyacak olursak:
Debugger: Derlenmiş bir programın, çalışma anında assembly kodlarına dönüştürülmesi ve üzerinde değişiklik yapılmasını sağlayan araçlardır. En yaygın tersine mühendislik aracıdır. Çok çeşitlidir tersine mühendislerin en sevdiği araçtır.
Disassembler: Derlenmiş bir programın, çalıştırılmadan çözümlenmesini (assembly kodlarına dönüştürme) sağlayan tersine mühendislik aracıdır. Uygulama algoritmalarının ve denetim mekanizmalarının kavranarak çözümlenmesi amacıyla sıkça kullanılmaktadır.
Özetleyecek olursak; yazılım güvenliğini ortaya çıkaran sorun tersine mühendislik araç ve yöntemlerininin kötüye kullanılmasıdır. Buna karşı yöntem geliştirmek çok fazla bilgi ve tecrübe gerektirdiğinden sıradan bir yazılımcı ya da programcılar tarafından engellenmesi de mümkün değildir.
Yazılım Güvenliğinde Etkileşim
Gelişen bilgisayar ve yazılım teknolojileri yazılım güvenliğini daha da karmaşık hale getirmiştir. Dün, işletim sistemleri ve programlarımız sadece donanım ile etkileşim halinde iken bugün işletim sistemleri, işletim sistemi bileşenleri, kullanıcı bileşenleri, 3. parti bileşenler vs. ile etkileşimlidir.
Etkileşim beraberinde güvenlik sorunlarını da getirmektedir. Böylesi karmaşık problemlerin çözümlenmesi için problemde soyutlama yapılarak, saldırıya en fazla maruz kalacak nesne (base object) tespit edilerek korunması sağlanır. Bu yaklaşım ise çoğu zaman etkileşimli bileşenlerin korunmasını göz ardı etmeyi gerektirir.
Güvenliğin En Zayıf Halkası Çalışabilirler (Programlar)
Yukarıda da anlattığı gibi yazılım güvenliğnin en zayıf halkasını çalışabilirler (programlar) oluştururlar. Çünkü; uygulama geliştiriciler (programcılar) yazılım güvenliği bilgilerine sahip değillerdir. Bir program üzerinde güvenlik açığı oluşturabilecek pek çok unsur bulunmaktadır.
Bu unsurlar:
Code: Uygulamaların kodlarının bulunduğu bölümdür. Programların çalışabilir kodları burada bulunur. En fazla saldırıya maruz kalan bölümdür. Üzerinde değişiklik yapılması çok da kolay değildir. Temel assembly bilgisinden daha fazlasını gerektirir.
Import: Uygulamaların diğer bileşenleriyle ve işletim sistemleriyle bütünleşme noktalarıdır. Programların çalışmasına doğrudan etkisi vardır. Ulaşılması ve değiştirilmesi oldukça kolay olduğundan saldırganlar tarafından sıkça kullanılmaktadır. Bölümün bir özelliği de, uygulamanın çalışmasına yönelik bilgiler bulundurmasıdır. Buradaki bilgiler normal kullanıcılar ya da program geliştiriciler için önemli gibi görünmesede, saldırgan için değerli bilgiler içerir. Bu bakımdan da saldırganlar için yüksek önceliğe sahiptir. Genel olarak bu bölüme yapılan saldırılar:
Bütünleşme adresleri üzerinde değişiklikler,
Saldırgan tarafından hazırlanan bileşenlerin uygulama etkileşimine dahil edilmesi,
Uygulama kodlarının ve verilerinin daha belleğe yüklenme sırasında değiştirilmesi ya da yönlendirilmesi,
Bütünleşmesi beklenen bileşenler yerine saldırgan tarafından hazırlanan bileşenleri ikame edilmesi, vb. yöntemler sayılabilir.
Resource: Uygulama iç verilerinin tutulduğu ve ihtiyaç duyulduğunda karşılandığı bölümüdür. Programların çalışmasına dolaylı etkisi vardır. Ulaşılması ve değiştirilmesi oldukça kolaydır, ancak doğrudan çalışabilir olmadığından saldırganlar için daha düşük önceliğe sahiptir. Uygulama iç verileri (resimler, sesler, ikonlar, vb.) burada bulunduğundan başkaları tarafından da kolayca kopya edilebilir. Herhangi bir program üzerinden kopya edilen resimler, sesler ya da ikonlar değersiz gibi görünsede ülkemizde de patente konu olduğundan dikkatle korunması gerekmekir. Bu bölüm üzerinden saldırı yapmak daha fazla tecrübe gerektirdiğinden uzman saldırganlar tarafından tercih edilir.
Uygulama güvenliğinde korunması gereken en önemli unsurları bu üç bölüm oluşturmaktadır. Bunlar dışında uygulama üzerinden yapılacak pek çok saldırı türü ve bu amaçla kullanılabilecek uygulama unsurları bulunmaktadır. Bu yazıda yalnızca en güncel ve en çok kullanılan yöntemler ele alınmıştır.
Kynk: Tübitak
- Yönetici düzenlemesi: :