Tersine Kod Mühendisliği

Başlatan Reverser, 03 Kasım 2014 - 20:34:00

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

7hr33l3t73r

#375
Anlatim da benden olsun ama switch case yapisi ile hic aklima gelmedi acikcasi. :)
Ben direk, if else yapisindan yurumustum. Sozde kodlar da zaten bu yolu gosterdi.Ben de fazla zorlamadim acikcasi.Isin ucunda devreleri yakmakta var tabi. :)
Aslinda analiz yapip, notlarimi almistim.Bir tek kontrol etmek kaldi ama araya yogunluk girince, oyle kaldi.:(
@Reverser, biraz sabirsizlanmis anlasilan(=>He bi dur da bakacaz,Indirmisiz yazilimi elinde sonunda vaktimiz olacak da. :)<=) :)
Yazilimin cok agir oldugunu dusunen kodcumuz, bir hafifletme teknigi kullanmis. :) (Partial RELRO)
Yani derleme olarak -Wl,-z,relro kullanilmis.Hee bir etki eder mi? yok canim ne yapsin bize.Ha gcc file.c -o file, ha o :) Sadece ikiye ayrildigini belirtelim yeter herhalde.
   RElocation Read-Only
1 => Kismi (Partial Relro)
2 => Tam (Full Relro)


RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      FILE
Partial RELRO   No canary found   NX enabled    No PIE          No RPATH   No RUNPATH   reverse.zip

Neyse biz kodlarimiza donelim.Yazilimci dostumuzun neden hafif siklet bransini sectigini kendisine birakalim. :) Bu kadar bilgi yeterli zira.Fazla bilgi bas agrisi yapar :)

  push   rbp
  mov    rbp,rsp
  sub    rsp,0x20
  mov    DWORD PTR [rbp-0x14],edi
  mov    QWORD PTR [rbp-0x20],rsi
  mov    BYTE PTR [rbp-0x1],0x44 ;"Tanimli Harfimiz 0x44 = D"
  mov    edi,0x4006a8 ; "Reverse_me*"
  call   400450 <puts@plt>
  movsx  eax,BYTE PTR [rbp-0x1] ;"Tanimli harf eax registirina tasiniyor"
  sub    eax,0x41 ; "Karaya cikarma yapiliyor.Savas basladi :)  0x44 - 0x41 = 0x3"
  cmp    eax,0x5 ; "5 ile karsilastir. Buyukse ?"
  ja     4005eb <main+0x65 = 101> ;"Karsilastima sonucu, Eger 5'ten buyuksem main+101 zipla # Gecersiz Not Kismi."
  mov    eax,eax
  mov    rax,QWORD PTR [rax*8+0x400710] ; "Cikarma isleminden sonra hangi ada'ya ayak basacam daa ben.??????????"
"Bakalim adalarimiza."
  gdb => x/12xw 0x400710
0x400710: 0x004005bb 0x00000000 0x004005c7 0x00000000
0x400720: 0x004005c7 0x00000000 0x004005d3 0x00000000
0x400730: 0x004005eb 0x00000000 0x004005df 0x00000000
"Kontrol yapalim ve aciklayalim."
  rax = 0 ise  = 0x004005bb Harika kismina yolla beni
  rax = 1 veya 2 ise = 0x004005c7 Iyisin iyi
  rax = 3 ise  = 0x004005d3 Gectin ; Bu bizim islem sonucumuz oluyor.
  rax = 4 ise  = 0x004005eb Gecersiz Not
  rax = 5 ise  = 0x004005df Daha Iyisini yapabilirsin
  rax = 5'ten buyuksem, beni yine gecersiz not kismina yolla.
 
 
  jmp    rax
  mov    edi,0x4006b4 ; "Harika"
  call   400450 <puts@plt>
  jmp    4005f5 <main+0x6f>
  mov    edi,0x4006bd ; "Iyisin iyi"
  call   400450 <puts@plt>
  jmp    4005f5 <main+0x6f>
  mov    edi,0x4006cc ; "Gectin"
  call   400450 <puts@plt>
  jmp    4005f5 <main+0x6f>
  mov    edi,0x4006d4 ;"Daha iyisini yapabilirsin."
  call   400450 <puts@plt>
  jmp    4005f5 <main+0x6f>
  mov    edi,0x4006ef ;"Geçersiz not."
  call   400450 <puts@plt>
  movsx  eax,BYTE PTR [rbp-0x1]; "0x44"
  mov    esi,eax
  mov    edi,0x4006fe ;"Geçme notu: %c\n"
  mov    eax,0x0
  call   400460 <printf@plt>
  mov    eax,0x0
  leave 
  ret 

Analiz tamam.Anladik mi? Anladik daa  :)
O zaman  eller calissin degil mi ama :)

cat << EOF > reverse.c
main(int not, int gec) {
puts("Reverse_me*");
not = 0x44;
gec = not  - 0x41;
  if(gec == 0x0)
    printf("Harika !\n");
      if(gec == 0x1||gec == 0x2)
        printf("Iyisin iyi\n");
          if(gec == 0x3)
            printf("Gectiniz\n");
              if(gec == 0x4||gec > 5)
                printf("Gecersiz Not.\n");
                  if(gec == 0x5)
                    printf("Daha iyisini yapabilirisin.\n");
           else
           printf("Gecme notu %c:\n",not);
     return 0;
  }
EOF
gcc -x c reverse.c && ./a.out

Evet,basit olarak boyle kodlar yazabiliriz.Konuyu anladiysak zaten  janjanli, conconlu  kodlar da yazabiliriz. :)
Yazimi dun gece tamamladim hatalarim olduysa  numaraya mesaj atin :) 383137633064337240676d61696c2e636f6d
Son olarak janjanli bir  gorsel yukleyelim ve bitirelim :)

dc -e '[q]sa[ln0=aln256%Pln256/snlbx]sb207356256404211981204295703670388snlbxq'
https://www.getgnu.org/gnulinux/gnulinux-ipuclari/nasil-akillica-soru-sorulur.html

Reverser

@817c0d3r, Haydaaaa ! E bunedir ya !? [1] https://www.youtube.com/watch?v=LEgkkb6qwKw :D :D
Hocam bekledim o kadar kimseden ses çıkmayınca paylaşayım dedim. Partial RELRO ile özel olarak uğraşmadım normal şekilde derledim.

XFCE ROCKS !
Powered by Thunar & XFWM4



7hr33l3t73r

:)
Yok ya ben espri yaptim @Reverser.Inceledim ama kimse ceviri yapmayinca ben yapayim dedim.Sizde haklisiniz.Zaten paylasmayacaktim ama  ceviri yapilmayinca, anlatim tadinda olsun istedim :)
Normal de inceleme firsatim olursa incele gec taktigi uyguluyorum. :)
dc -e '[q]sa[ln0=aln256%Pln256/snlbx]sb207356256404211981204295703670388snlbxq'
https://www.getgnu.org/gnulinux/gnulinux-ipuclari/nasil-akillica-soru-sorulur.html

Reverser

farkındayım hocam sıkıntı yok. :) Anlatımınız için kendi adıma teşekkür ediyorum zira okurken keyif aldım. :)

XFCE ROCKS !
Powered by Thunar & XFWM4



7hr33l3t73r

#379
Rica ederim @Reverser.
dc -e '[q]sa[ln0=aln256%Pln256/snlbx]sb207356256404211981204295703670388snlbxq'
https://www.getgnu.org/gnulinux/gnulinux-ipuclari/nasil-akillica-soru-sorulur.html

betseg

2 günlük tatilde can sıkıntısından yaptığım bir şey  :-\
C plz
http://s3.dosya.tc/server4/kiradm/a10.zip.html
Not: multilib sorun çıkarıyor, 32 bit yükleyemiyorum.

Reverser

@betseg, en son attığın dosyadan şimdiye kadar çıkartabildiğim kaynak kod assembly satırlarıyla birlikte aşağıda. (Henüz doğru çalışmıyor.)

//Reversed source code
//file: a10 x64
//Reverser

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h> // -> uint32_t

/* Functions
0x00000000004005b6  this_is_last_lel         --> Called in main
0x00000000004005e2  this_is_last             --> Called in sub function
0x0000000000400602  this_thingy_thing        --> Called in sub function
0x0000000000400618  this_thing               --> Called in main
0x0000000000400679  this_other_thing         --> Called in main
0x0000000000400704  this_last_thing          --> Called in main
0x0000000000400768  this_otter_thingy_thing  --> Called in sub function
0x000000000040077e  main
*/

//Function prototypes
int this_thing(int inpt);
int this_other_thing(int inpt);
int this_last_thing(int inpt);
int this_is_last_lel(int inpt);

int this_is_last(int inpt);
int this_thingy_thing(int inpt);
int this_otter_thingy_thing(int inpt);



int main(int argc, char *argv)
{
int inpt;
printf("integer pl0x lel");
scanf("%d",&inpt);

/*
0x00000000004007b1 <+51>: test   %eax,%eax
    0x00000000004007b3 <+53>: jle    0x4007c9 <main+75>
*/
if(inpt <= 0)
{
this_other_thing(inpt);
}
/*
0x00000000004007bb <+61>: mov    %eax,%edi
    0x00000000004007bd <+63>: mov    $0x0,%eax
    0x00000000004007c2 <+68>: callq  0x400618 <this_thing>
*/
else if(inpt > 0)
{
this_thing(inpt);
}
/*
0x0000000000400801 <+131>: jne    0x40080b <main+141>
*/
else if(inpt != 0)
{
this_is_last_lel(inpt);
}
/*
0x00000000004007d1 <+83>: jns    0x4007e7 <main+105>
*/
else
{
this_last_thing(inpt);
}
}

/*
0x0000000000400628 <+16>: imul   %edx,%eax
*/
int this_thing(int inpt)
{
inpt *= inpt;
/*
0x0000000000400639 <+33>: mov    $0x4008b4,%edi
    0x000000000040063e <+38>: mov    $0x0,%eax
    0x0000000000400643 <+43>: callq  0x400480 <printf@plt>
*/
printf("%d",inpt);
/*
0x000000000040065a <+66>: cmp    $0xa,%eax
    0x000000000040065d <+69>: jg     0x40064a <this_thing+50>
*/
while(inpt > 10)
{
this_thingy_thing(inpt); //no args ? not sure.
}
/*
0x0000000000400667 <+79>: mov    $0x4008b7,%edi
    0x000000000040066c <+84>: mov    $0x0,%eax
    0x0000000000400671 <+89>: callq  0x400480 <printf@plt>
*/
return printf("%d\n",inpt);
}

/*
   0x0000000000400679 <+0>: push   %rbp
   0x000000000040067a <+1>: mov    %rsp,%rbp
   0x000000000040067d <+4>: mov    0x2006e9(%rip),%eax        # 0x600d6c <a>
   0x0000000000400683 <+10>: neg    %eax
   0x0000000000400685 <+12>: mov    %eax,0x2006e1(%rip)        # 0x600d6c <a>
   0x000000000040068b <+18>: mov    0x2006db(%rip),%edx        # 0x600d6c <a>
   0x0000000000400691 <+24>: mov    0x2006d5(%rip),%eax        # 0x600d6c <a>
   0x0000000000400697 <+30>: imul   %edx,%eax
   0x000000000040069a <+33>: mov    %eax,0x2006cc(%rip)        # 0x600d6c <a>
   0x00000000004006a0 <+39>: mov    0x2006c6(%rip),%eax        # 0x600d6c <a>
   0x00000000004006a6 <+45>: neg    %eax
   0x00000000004006a8 <+47>: mov    %eax,0x2006be(%rip)        # 0x600d6c <a>
   0x00000000004006ae <+53>: mov    0x2006b8(%rip),%eax        # 0x600d6c <a>
   0x00000000004006b4 <+59>: mov    %eax,%esi
*/
int this_other_thing(int inpt)
{
inpt = - inpt;
inpt = inpt * inpt;
inpt = - inpt;
/*
0x00000000004006b6 <+61>: mov    $0x4008b4,%edi
    0x00000000004006bb <+66>: mov    $0x0,%eax
    0x00000000004006c0 <+71>: callq  0x400480 <printf@plt>
*/
printf("%d",inpt);
inpt = - inpt;

while(inpt < 10)
{
this_thingy_thing(inpt);
}
return printf("%d\n",inpt);
}

int this_last_thing(int inpt)
{
inpt = 0x0;
//   0x000000000040071e <+26>: add    %edx,%eax
inpt = inpt + inpt;
printf("u found dat thing ");
/*
0x0000000000400756 <+82>: callq  0x400480 <printf@plt>
    0x000000000040075b <+87>: mov    $0x4008d0,%edi
    0x0000000000400760 <+92>: callq  0x400470 <puts@plt>
*/
printf("w0w");
}

/*
   0x00000000004005c2 <+12>: sub    $0x1,%eax
   0x00000000004005c5 <+15>: mov    %eax,0x2007a1(%rip)        # 0x600d6c <a>
   0x00000000004005cb <+21>: mov    $0x0,%eax
*/
int this_is_last_lel(int inpt)
{
while(inpt > 0)
{
inpt = inpt - 1;
//   0x00000000004005d0 <+26>: callq  0x4005e2 <this_is_last>
this_is_last(inpt); //No args ? Not sure.
}
return inpt;
}

/*
   0x00000000004005ec <+10>: sub    $0x1,%eax
   0x00000000004005ef <+13>: mov    %eax,0x200777(%rip)        # 0x600d6c <a>
   0x00000000004005f5 <+19>: mov    $0x0,%eax
*/
int this_is_last(int inpt)
{
inpt = inpt - 1;
//  0x00000000004005fa <+24>: callq  0x4005b6 <this_is_last_lel>
this_is_last_lel(inpt);
return inpt;
}

int this_thingy_thing(int inpt)
{
/*
0x0000000000400606 <+4>: mov    0x200760(%rip),%eax        # 0x600d6c <a>
    0x000000000040060c <+10>: sub    $10,%eax
*/
inpt = inpt - 10;
//   0x0000000000400617 <+21>: retq   
return inpt;
}

int this_otter_thingy_thing(int inpt)
{
/*
0x000000000040076c <+4>: mov    0x2005fa(%rip),%eax        # 0x600d6c <a>
    0x0000000000400772 <+10>: add    $0xa,%eax
*/
inpt = inpt + 10;
//   0x000000000040077d <+21>: retq 
return inpt;
}

not düşmek istiyorum.
1-)Fonksiyon adları birbirine çok benziyor bu nedenle anlamaya çalışmak fazlasıyla zor.
2-)Programında hatalar var gibi. Bir kaç fonksiyon loop içinde çağırılmış ama argüman almamış. (ya da ben yanlış anladım)
3-)Assembly satırlarıyla birlikte kod çıktısını okumak isteyenler, kodları IDE gibi bir ortam üzerinde okumanızı tavsiye ediyorum.

XFCE ROCKS !
Powered by Thunar & XFWM4



7hr33l3t73r

#382
Ben de bir krekme paylasayim.Ister kod cevirisi yapin ister krekleyin. :)
Zaten cok basit.Zorluklari asinca. :)
Ekran goruntusu:

http://s3.dosya.tc/server5/fh8ns3/crackme_.zip.html
dc -e '[q]sa[ln0=aln256%Pln256/snlbx]sb207356256404211981204295703670388snlbxq'
https://www.getgnu.org/gnulinux/gnulinux-ipuclari/nasil-akillica-soru-sorulur.html

Reverser


XFCE ROCKS !
Powered by Thunar & XFWM4



7hr33l3t73r

#384
@Reverser;
Aciklama alalim birde :)
Amac zaten analiz etmek.
Yoksa zaten cok basit.
Analiz edip.Vaktiniz olursa kod cevirisi de yapabilirsiniz.
dc -e '[q]sa[ln0=aln256%Pln256/snlbx]sb207356256404211981204295703670388snlbxq'
https://www.getgnu.org/gnulinux/gnulinux-ipuclari/nasil-akillica-soru-sorulur.html

Reverser

kullanıcı adı ile şifre'nin aynı olması yeterli.
Anladığım kadarıyla, long int strtol(const char *nptr, char **endptr, int base); fonksiyonu asıl olarak kullanılmakta. Rahat bir zamanda kod çevirisini de yaparım hocam.

XFCE ROCKS !
Powered by Thunar & XFWM4



7hr33l3t73r

Malesef tam olarak degil @Reverser.
Kullanici adinin ilk harfi kontrol ediliyor sadece.
Ceviri icin de sanirim bu bilgi yeterli. :)
dc -e '[q]sa[ln0=aln256%Pln256/snlbx]sb207356256404211981204295703670388snlbxq'
https://www.getgnu.org/gnulinux/gnulinux-ipuclari/nasil-akillica-soru-sorulur.html

kaansef

Merhaba,

Benim birkaç sorum olacaktı bu konu hakkında. Özellikle @817c0d3r ve @Reverser'a. 20 yaşındayım, matematik bilgim 4 işlemden fazla değil. Fakat çok uzun süredir programlama ile uğraşıyorum.

1-) GDB Kullanımını nereden öğrendiniz? Türkçe kaynak var mıdır?

2-) Assembly dilini nereden öğrendiniz?

3-) Bu konuda kendimi geliştirmek için neler yapmalıyım?


Teşekkürler. Herkese iyi akşamlar.
# 28065

Reverser

@817c0d3r, doğrudur hocam fazla inceleme fırsatı bulamadım henüz.
@kaansef,
1-) GDB kullanımını, yazdığım programların davranışlarını analiz etmek için debug ederken öğrendim. GDB kullanımı ile ilgili bilgi veren sayısız yabancı kaynak mevcut.
2-) Assembly öğreneli çok uzun zaman oldu, açıkçası net olarak hatırlamıyorum ama bir çok kaynak var assembly için. (Bu arada assembly becerim aman aman iyi değildir. Bu konuda @817c0d3r daha çok yardımcı olabilir. )
3-) Bu konuda, özellikle programlama konusunda yabancı dil çok önemli. Yabancı dilin varsa özellikle 'İngilizce' kendini çok hızlı şekilde geliştirebilirsin. Ben senin yerinde olsam bolca Assembly intsruction reference setlerine bakar ve anlamaya çalışırdım. Küçük küçük programlar yazar, GDB altında analiz ederdim.

XFCE ROCKS !
Powered by Thunar & XFWM4



kaansef

Cevapladığınız için çok teşekkür ederim. Assembly'yi biliyorum sayılır fakat nedense assembly programı yazmak için kendimi yeterli görmüyorum. Daha çok geliştirmek istiyorum. Biraz karışık bir öğrenme dönemi geçirdim, herşey birbirine girdi bu yüzden. 6502, 8086, x86, x64 hepsini bir arada öğrenmeye çalıştım. Şimdi birbirine karıştırıyorum.
# 28065

7hr33l3t73r

#390
Hafta sonuna yetistirecektim sozle ama malesef yetismedi.Firindan daha yeni cikti :)
@Reverser, Cozerseniz ozelden alalim cevabi sizden. :)
Basit bir krekmi zaten.Diger arkadaskari tesvik edelim.
http://s6.dosya.tc/server2/9tebmc/badman.exe.zip.html
dc -e '[q]sa[ln0=aln256%Pln256/snlbx]sb207356256404211981204295703670388snlbxq'
https://www.getgnu.org/gnulinux/gnulinux-ipuclari/nasil-akillica-soru-sorulur.html

oasln

Alıntı yapılan: 817c0d3r - 06 Eylül 2015 - 22:20:27
Hafta sonuna yetistirecektim sozle ama malesef yetismedi.Firindan daha yeni cikti :)
@Reverser, Cozerseniz ozelden alalim cevabi sizden. :)
Basit bir krekmi zaten.Diger arkadaskari tesvik edelim.
http://s6.dosya.tc/server2/9tebmc/badman.exe.zip.html


Yarin zaman bulursam bakacagim. Sifre kirma daha zevkli. Umarim son ornek gibi "truncated" degildir :-)
--

7hr33l3t73r

#392
@oasln, yazilim  calisiyorsa  sorun yoktur. :) Calismiyorsa isi zorlastirir. :)
Kolay gelsin.
dc -e '[q]sa[ln0=aln256%Pln256/snlbx]sb207356256404211981204295703670388snlbxq'
https://www.getgnu.org/gnulinux/gnulinux-ipuclari/nasil-akillica-soru-sorulur.html

Sh4oTT

Su yaptiginiz ise gercekten cok hevesleniyorum ama acele etmemem gerek daha C tam bilmiyorken Tersine Muhendislige kalkismak sacma olacaktir zanlimca, takipteyim konu harika ozellikle cekilen video :)

7hr33l3t73r

Merhabalar;
Sanirim bazi arkadaslarin kafasi karismis.Bir noktaya deginmem gerekti.
Bazilari indirdikleri dosyayi direk inceliyorlar herhalde.
Inen dosyaya file komutu ile kontrol edip sizi yaniltmasin

$ file badman.exe.zip
badman.exe.zip: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=59765af37e3e4a32676ff5fd3a4153e8a3026b70, stripped

Asil dosyamiz bu degil. :)
Sadece arsiv dosyamiz.Ben ucbirim uzerinden cikarmaniz kolay olsun diye bu yolu sectim.Yaniltmasin sizi.

$ strings badman.exe.zip|grep -i sfx
Usage: 7zSFX [<command>] [<switches>...]
7-Zip SFX 9.38 beta  Copyright (c) 1999-2014 Igor Pavlov  2015-01-03

Yani kisaca ucbirimden arsiv dosyasiini calistirdiginiz zaman.

$ ./badman.exe.zip
7-Zip SFX 9.38 beta  Copyright (c) 1999-2014 Igor Pavlov  2015-01-03
p7zip Version 9.38.1
7-Zip SFX 9.38 beta  Copyright (c) 1999-2014 Igor Pavlov  2015-01-03
p7zip Version 9.38.1 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,2 CPUs,ASM)
Processing archive: ./badman.exe.zip
Extracting  badman
Everything is Ok

badman adinda ki asil dosyamizi incelemeniz gerekiyor. :)

$ file badman
badman: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, stripped
$ wc -c badman
1087 badman

1.1 kb'lik bir dosya sadece.Karsilama logosunu cikartirsaniz, 345 bayt falan. :)
Bilgi olarak paylasmak istedim.
Her zaman kilosunu dusurmak icin arsivleme kullanmayacagiz.Biraz tersih olsun. :)

dc -e '[q]sa[ln0=aln256%Pln256/snlbx]sb207356256404211981204295703670388snlbxq'
https://www.getgnu.org/gnulinux/gnulinux-ipuclari/nasil-akillica-soru-sorulur.html

Reverser

hocam, arşivden çıkarıp execute etme kısmında sorun yok fakat asm dökümüne ulaşmak bayağı uğraştıyor. Analizim henüz tamamlanmadı ne olduğunu anlamaya çalıştığım bir fonksiyon var ve fonksiyon char tipinde veri döndürüyor bu fonksiyonu reverse edebilirsem sonucu size bildireceğim. :) Yeni başlayanlar için biraz fazla uğraştırıcı sanki.

XFCE ROCKS !
Powered by Thunar & XFWM4



7hr33l3t73r

Statik analiz icin yardimci olayim o zaman.
Dinamik analiz ellerinizden oper. :)
objdump -M intel -D -m i386 -b binary --start-address=0x74 badman
yada

cat badman|ndisasm -b32 -

Oohh, o kadar zor mu? olmus.
Demek ki kolaylik kavrami goreceli birseymis. :)
dc -e '[q]sa[ln0=aln256%Pln256/snlbx]sb207356256404211981204295703670388snlbxq'
https://www.getgnu.org/gnulinux/gnulinux-ipuclari/nasil-akillica-soru-sorulur.html

kaansef

Merhaba,

Arkadaşlar birkaç sorum olacak bu konu hakkında. Birçok programlama dili biliyorum ve 2007'den beri aktif olarak kullanıyorum. Kendimi daha çok geliştirmek istiyorum. Matematik bilgim 4 işlemden ibaret. İngilizcem ise iyi değil (teknik ingilizce hariç). Eğer mümkünse yaşlarınızı ve mesleğinizi yazıp, bu konulara nasıl ulaştığınızı yazabilir misiniz? Nasıl başladınız ve nasıl geliştirdiniz? Geliştirecek olanlara tavsiyeleriniz nelerdir? Şimdiden teşekkür ederim. Herkese iyi akşamlar.
# 28065

Sh4oTT

@kaansef hocam cok guzel bir konuya deginmissiniz :) Ayri bir konu uzerinden paylasirsaniz cok makbule gecer tesekkurler :)

kaansef

@ShaoTT aslında bu konu üzerinde paylaşılsa daha çok işe yarar kanısındayım. Çünkü farklı bir konu açarsak konuyu bölmüş olacağız.
# 28065