Professional Documents
Culture Documents
Easy Exploit
.text:0804850C
.text:0804850C main
public main
proc near
.text:0804850C
push ebp
.text:0804850D
mov
.text:0804850F
and
esp, 0FFFFFFF0h
.text:08048512
sub
esp, 30h
.text:08048515
mov
.text:0804851D
lea
eax, [esp+18h]
.text:08048521
mov
[esp+4], eax
.text:08048525
mov
.text:0804852C
call ___isoc99_scanf
.text:08048531
lea
eax, [esp+18h]
.text:08048535
mov
[esp+4], eax
.text:08048539
mov
ebp, esp
.text:08048540
call _printf
.text:08048545
mov
eax, [esp+2Ch]
.text:08048549
mov
[esp+4], eax
.text:0804854D
mov
.text:08048554
call _printf
.text:08048559
cmp
.text:08048561
jnz
.text:08048563
mov
.text:0804856A
call _puts
.text:0804856F
mov
.text:08048576
call _system
.text:0804857B
mov
eax, 0
.text:08048580
jmp
short locret_804859A
.text:08048582 ; --------------------------------------------------------------------------.text:08048582
.text:08048582 loc_8048582:
.text:08048582
mov
.text:08048589
call _puts
.text:0804858E
mov
.text:08048595
call _exit
.text:0804859A ; --------------------------------------------------------------------------.text:0804859A
.text:0804859A locret_804859A:
.text:0804859A
leave
.text:0804859B
retn
.text:0804859B main
endp
Dari kode diatas, program ini akan mengeksekusi perintah "/bin/cat valid/flag" (file yang isinya flag)
apabila nilai di [esp+2Ch] adalah 0C0FFEE76h (Bisa dilihat pada alamat 08048559)
Di alamat 0804852C, program akan mengambil inputan dari stdin lewat fungsi ___isoc99_scanf
dan buffer nya diletakkan di alamat [esp+18h].
Jumlah buffer 'normal' yang akan menampung inputan tersebut adalah 2Ch - 18h = 14h (20 karakter),
sehingga apabila input yang diambil oleh program melebihi 20 karakter, buffer pada [esp+2Ch] akan
dioverwrite.
Dan nilai dari [esp+2Ch] harus sama dengan 0C0FFEE76h jika ingin program ini mengoutpukan flag dari
file valid/flag.
Salah satu cara input dari stdin adalah dengan mengetikkan langsung karakter ke terminal.
Masalahnya nilai 0C0FFEE76h tidak bisa diketik langsung ke terminal. Terminal hanya memroses
karakter unicode dan bukan ASCII.
Jadi inputnya harus pake trik dari file kemudian di 'cat' filenya ke stdout, lalu di pipe ke programnya.
12345678901234567890v
Easy Forensic,
Easy Programming.
fibo = fiblike([1,1,1])
for i in range(2000000):
s=("%s") % fibo(i)
if s[:10] == '1471338318':
print i
break
Easy Web.
dan di view-source nya, ada clue lagi : <!--clue: cobalah dengan user yang lain untuk mendapatkan flag->
Disini kita bisa menyimpulkan, dengan mengganti input name password dengan array,
semua input user akan diterma karena semua password akan diload oleh script.
Jadi apapun input password kita, asalkan username nya benar, sistem akan menganggap inputan itu
valid.
Easy Reversing.
Setelah dibuka dengan ILSpy, bagian yang menarik dari program ini adalah :
Untuk opsi 1 dan 2, kita bikin program yang sama, dengan kode yang sama menggunakan Microsoft
Visual Studio.
Hasilnya :
Password : ganteng2014
Flag : 9bd03cfdfe10124755e2a051288c6dda
Jadi apapun string yang kita input, program akan menampilkan flag nya.
Easy Crypto
String tersebut adalah hexstring dari sebuah string, dimana ketika didecode (http://www.stringfunctions.com/hex-string.aspx) hasilnya :
http://dl.dropbox.com/s/24i1kq6ycoohqjl/crypto1Flag.mp3
Medium Forensic,
#--------------------------------------------------------------#!/bin/bash
IP=$(cat ./access.log | awk {'print $1'} | sort -u)
cari () {
for X in $IP; do
I=$(echo $X)
echo "[+] IP $I berasal dari : "
C=$(geoiplookup $I | head -1 | cut -d ':' -f2)
echo "[+] IP $I berasal dari : $C"
done
}
yakin () {
read -r -p "${1:-Yakin nih? [y/N]} " response
case $response in
[yY][eE][sS]|[yY])
true
;;
*)
false
;;
esac
}
if [ $# -eq 0 ]; then
echo "[*] Liat semua IP"
yakin && cari
else
echo "[*] Cari IP dari : $1"
cari | grep -i $1
fi
#----------------------------------------------------------------------
Medium Crypto,
Medium Reverse
Disini kita dikasih executable, encoded string, dan petunjuk key yang dipakai, executable nya adalah
program untuk mengencode string menggunakan key. Kita disuruh buat decode string
VLZHXPZNYRBXPMEB dan key untuk decode nya harus dicari sendiri (clue : key ada didalam encode).
Dari analisis program, pemanggilan fungsi untuk encode ada di
Dimana yang menarik disini adalah, fungsi encode ini merupakan fungsi encode mod 26
c = (p + k) mod 26
Sehingga fungsi decodenya adalah
p = (c k) mod 26
c = ciphertext, p = plaintext, k = key
Setelah teks dan clue diganti oleh CTF lord nya, akhirnya level ini bisa terpecahkan. (asli.. ga nemu key
buat decode string pertamanya..)
To decode : WFGNEOFGEDQGE
Key : ABCD
Sehingga string asli setelah di decode adalah : WEEKENDDECODE
Selanjutnya, server akan mengulang proses pada sub_400ED2 sebanyak 54h (84) kali dan apabila return
dari fungsi tersebut selalu true, pada loop terakhir server akan membaca file flag dan mengirimkan
isinya ke client.
Di dalam sub_400ED2, ada 2 fungsi yang menarik yaitu sub_400CEC dan sub_400E58.
Fungsi di sub_400CEC, akan mengambil input string random dari program dan outputnya adalah array
dari integer sebanyak panjang string inputan, dan sub sub_400E58 akan mengambil input dari array
tersebut, setiap elemen dari array itu akan diconvert ke string, kemudian diencode dan hasil string nya
akan dikirim ke client.
Setiap karakter input, akan dikurangkan dengan 10 dan diappend dengan karakter 5Fh (_) sebanyak 2
karakter.
Di fungsi ini, ada 3 loop dimana tiap loop akan memroses tiap karakter yang ada dari string dan
mentranformasi string tersebut menjadi array dari bilangan integer.
Berikut code python untuk encode string :
def encode_part2(part2):
i=0
c2 = 0
c3 = 0
ln = len(part2)
arr = [0] * ln
j=0
while i < ln:
arr[i] = ((i << 4) + ln) ^ ord(part2[i])
c2 = 0
while c2 < i:
arr[c2] = arr[c2] ^ (~(arr[i]))
c3 = 0
while c3 < c2:
arr[c3] = arr[c3] + (~(arr[c2] ^ arr[i]))
c3 += 1
c2 += 1
i += 1
return arr
Flag dari level ini gak diketahui karna server buat ngetest nya udah dimatiin. Tapi dari hasil eksekusi,
nampaknya level ini berhasil ditembus.
Server :
Client :