Practical Reverse Engineering Solution(Page 78-79)

Bu yazıda “Practical Reverse Engineering” kitabındaki sayfa 78-79 arasındaki egzersizlerin çözümlerini yazacağım.

Kitabın nasıl olduğunu merak edenler için söyleyeyim, gerçekten yardımcı oluyor fakat bu kitabı okumadan önce ciddi anlamda bilgi sahibi olmak gerekiyor(Zaten kitabın başında kitabı rahatça anlayabilmek için önceden okumanız gereken kaynaklar belirtiliyor). Kendim için konuşursam, benim bu kadar bilgim yok. Daha çok acemiyim. Buna rağmen okumamın sebebi bilmediğim yerler geldiğinde anında o konu ile ilgili araştırma yapmam. Bu şekilde yapınca eksiklikler çok oluyor ama en azından başlamam için iyi bir nokta.

Şimdi çözümlere geçelim.

1)Mystery1 – Figure 2.8

Kodlara buradan ulaşabilirsiniz.

a)Arm or Thumb State

Kodlara göz gezdirdiğimizde bunun ARM state olduğunu görüyoruz. Neden olduğuna gelirsek, gözüktüğü gibi sadece 32bit instruction lar kullanılmış ve 52. satırdaki rsc instruction Thumb state te kullanılamıyor.

b)Instruction’s Semantic

  1. Satır: R4,R5,R6,R7,R8 registerlarını stack te depolar.

3.Satır: R0 registerındaki byte’ı R3 registerına aktarır.

4.Satır: R3 registerını #0x2D (45) ile karşılaştırır.

5.Satır: Eğer eşitlerse 6.satıra değilse 57.satıra atlatır.

6-8. Satır: Eğer R3 registerı 43 ise R3 registerı (R0+1) olur ve R0 registerı (R0+1) olur.

57-61. Satırlar: R3 registerı (R0+1) , R0 registerı (R0+1) ve R6 registerı 1 olur. 6-8 satırları arasındaki fark, duruma bağlı olarak gerçekleşmemesi.

9-11. Satırlar: R3 registerını #0x30 (48) ile karşılaştırır. 11.satır, R3 registerı #0x30′ a eşit değil ise 12. satıra geçer. 12-17 arasındaki kodlar ise eşit olana kadar döngüye girip eşitler ve 18.satıra dallanır.

18-23. Satırlar: Bir dizi atama yapar. R12 = 0, R4 = 0, R5 = 0, R8 = 10.

27-32. Satırlar: R7 = R0+R12. R12 = R12 + 1. 30. satırda umull instruction ı görüyoruz. ARM information center’ a göre bu instruction unsigned integer için kullanılıyor. Yani R2,R3,R4,R8 unsigned integer tipinde. R7= R7 – #0x30.

  1. Satır: Buradaki MLA instruction R8 ile R5’i çarpar ve R3′ ü ekler. En önemsiz 32biti de R3’e aktarır.
  2. Satır: R4 ten R6’ı çıkarır ve uygun olan flag i aktifleştirir.
  3. Satır: Bu instruction carry flag ile çıkartma yapar. R3 = -R5.
  4. Satır: R4 = -R4.
  5. Satır: R5 = – R5.
  6. Satır: R4’ü R1 deki hafıza yerine depolar.
  7. Satır: 2. satırın tersini yapar.

c)Types

13-17 satırları arasında döngü içerisinde R0 ile işlemler yaptığından büyük ihtimal arg1 bir dizi. 3. ve 15. satırlara bakarsak LDRB instruction ının kullanıldığını görüyoruz. Bu instruction 1 byte uzunluğunda aktarım yapar. Bu da bize dizinin char tipinde bir dizi olduğu konusunda ufak bir ipucu veriyor. 4-6 satırlarda 0x2b ve 0x2d ile karşılaştırma yapıldığını görüyoruz. Bu rakamların ascii karşılığı “-” ve “+” .

31-32 ve 33-35 satırları arasında dizinin elemanları 0-9 arasında olup olmadığı kontrol ediliyor. Buradanda arg1’in büyük ihtimal sayı karşılıkları tutulan bir string olduğunu düşünüyoruz.

  1. argüman dönüştürmenin sonucunu tutuyor ve tipi pointer integer.
  2. ve 55. satırlarda gördüğümüz gibi fonksiyonun return değeri 0 veya 1 oluyor. Buradan da fonksiyonun tipinin “boolean” olduğunu belirliyoruz.

d)Function Prototype

BOOL functionname(char*, int*);

2)Mystery2 – Figure 2.9

Kodlara buradan ulaşabilirsiniz.

a)Arm or Thumb State

Kodlara baktığımızda Thumb state olduğunu görüyoruz.

Bunun nedeni: 16 bit instructionların kullanılmış olması, 3.satırda instruction a “.W” ekinin eklenmiş olması.

b)Instruction’s Semantic

  1. Satır: _CBZ instruction eğer R0 sıfırsa locC672 gitmesini aksi halde 3. satırdan devam etmesini sağlar.
  2. Satır: R0 = R0 + #0x63 . Fakat sadece 1 byte aktarır.

4-5-6. Satırlar: R0 != 0 kontrol eder. Eşit değilse 1 eşit ise 0 döndürür.

c)Types

  1. satırda görüldüğü gibi arg1 (R0)’in 0x63h offsetine erişilip 1 byte uzunluğunda veri R0′ a aktarılmış. Ya en az 100 elemanlı tipi char olan bir dizi argüman olarak verilmiş yada struct argüman olarak verilmiş. Büyük ihtimal struct fakat kodların geri kalanı verilmediği için emin olamıyoruz.

d)Function Prototype

BOOL isnotzero(struct*);

3)Mystery3

Kodlara buradan ulaşabilirsiniz.

a)Arm or Thumb State

16bit instruction lar kullanıldığı için Thumb State tir.

b)Instruction’s Semantic

  1. Satır: arg1‘ in #0x8 offsetini R3 registerına aktarır.
  2. Satır: R3 teki değeri R1’ in #0x0 offsetine depolar.
  3. Satır: arg1‘ in #0xC (12) offsetini R3 registerına aktarır.
  4. Satır: R3 teki değeri R1’in #0x4 offsetine depolar.

c)Types

struct1
...
0x08 struct1_offset8; int
0x0c struct1_offsetc; int
struct2
0x00 struct2_offset0; int, struct1_offset8 ile aynı tip
0x04 struct2_offset4; int, struct1_offsetc ile aynı tip

Fonksiyon argüman olarak 2 tane struct alıyor. Fakat bu kadar kod parçacığı ile kesin bir şey demek yanlış olur. Örneğin 2 tane tipi integer olan dizide olabilirdi ve bu kodlara göre herhangi bir hata olmazdı.

d)Function Prototype

BOOL copy(struct*, struct*);

ya da

BOOL copy(int*, int*);

Normalde çözümlerin hepsini yazacaktım fakat gördümki yazı çok fazla uzuyor. Sadece ilk 3 egzersizin çözümünü yazdım. Diğerlerinin çözümlerini aynı şekilde tek tek inceleyerek ve araştırarak yapabilirsiniz. Eğer takıldığınız bir yer, sormak istediğiniz bir soru yada hata yapmışsam lütfen yorumlarda belirtin. En kısa sürede yorumlara cevap vermeye çalışacağım.

Be First to Comment

Leave a Reply

Your email address will not be published.