• Silahkan bergabung dengan chat kami di Telegram group kami di N3Forum - https://t.me/n3forum
  • Welcome to the Nyit-Nyit.Net - N3 forum! This is a forum where offline-online gamers, programmers and reverser community can share, learn, communicate and interact, offer services, sell and buy game mods, hacks, cracks and cheats related, including for iOS and Android.

    If you're a pro-gamer or a programmer or a reverser, we would like to invite you to Sign Up and Log In on our website. Make sure to read the rules and abide by it, to ensure a fair and enjoyable user experience for everyone.

RNDC Bahas Clue Cyber Jawara 2015

dono

3 SMP
STAFF N3
Tukang Sapu
cyberjawara.jpg

Cyber Jawara is online and offline ethical hacking, computer network defense game, dedicated to finding the top computer network defense teams.

Teams are made up of 3 players, and each round serves as an elimination round until only winning teams remain.

The top winning teams from every region get invited to play the game live in person at the finals stage.

Cyber Jawara's goal is to raise awareness towards increased education and ethics in information security through a series of cyber competitions that encompass forensics, ethical hacking and defense. Cyber Jawara aspires to create an opportunity for ethical hacking to be accepted, practiced and demonstrated without any discrimination, across all geographical boundaries - for the purpose of understanding what it takes to protect and secure critical information and assets.

BEATS

Pada tutorial kali ini, akan dibahas mengenai solusi dari soal beats pada kompetisi Cyber Jawara 2015. Soal ini merupakan sebuah aplikasi ELF 32bit.
  • Pertama kita melihat dulu tipe dari aplikasi beats tersebut (langkah ini sifatnya opsional):
    Code:
    % file beats
    beats: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, \
    for GNU/Linux 2.6.32, BuildID[sha1]=63776c74e5a42191ebd0010b6f91dd0da1f4f0a2, not stripped
  • Selanjutnya, kita akan menggunakan radare2 untuk melakukan analisa terhadap aplikasi tersebut. Gunakan instruksi aaa pada radare2 seperti ini:
    Code:
    % r2 beats
    [0x080483b0]> aaa
  • Kemudian, kita akan melakukan static analysis terhadap fungsi main pada aplikasi tersebut. Berikut ini adalah analisa yang telah diberi keterangan untuk masing-masing instruksinya:
    Code:
    [0x080483b0]> pd @sym.main
    / (fcn) sym.main 197
    | ; var int local_0_1 @ ebp-0x1 ;
    | ; var int local_1 @ ebp-0x4 ;
    | ; var int local_3 @ ebp-0xc ; variabel untuk counter
    | ; var int local_23 @ ebp-0x5c ; variabel untuk input flag dari user
    | ; DATA XREF from 0x080483c7 (sym.main)
    | ;-- main:
    | 0x080484ab 8d4c2404 lea ecx, [esp + 4] ; 0x4
    | 0x080484af 83e4f0 and esp, 0xfffffff0 ;
    | 0x080484b2 ff71fc push dword [ecx - 4] ;
    | 0x080484b5 55 push ebp ;
    | 0x080484b6 89e5 mov ebp, esp ; inisialisasi stack
    | 0x080484b8 51 push ecx ;
    | 0x080484b9 83ec64 sub esp, 0x64 ; inisialisasi variabel local sebanyak 0x64 byte
    | 0x080484bc a180980408 mov eax, dword [obj.stdout__GLIBC_2.0] ; EAX = stdout
    | 0x080484c1 50 push eax ; parameter4: EAX (stdout)
    | 0x080484c2 6a10 push 0x10 ; parameter3: 16 (jumlah karakter yang akan ditulis)
    | 0x080484c4 6a01 push 1 ; parameter2: 1 (ukuran karakter yang akan ditulis 1 byte)
    | 0x080484c6 6819860408 push str.Guess_the_flag: ; parameter1: "Guess the flag: " @ 0x8048619
    | 0x080484cb e8b0feffff call sym.imp.fwrite ; fwrite("Guess the flag: ", 1, 16, stdout)
    | 0x080484d0 83c410 add esp, 0x10 ; normalisasi stack
    | 0x080484d3 a180980408 mov eax, dword [obj.stdout__GLIBC_2.0] ; EAX = stdout
    | 0x080484d8 83ec0c sub esp, 0xc ; ESP -= 0x0c
    | 0x080484db 50 push eax ; parameter1: EAX (stdout)
    | 0x080484dc e87ffeffff call sym.imp.fflush ; fflush(stdout);
    | 0x080484e1 83c410 add esp, 0x10 ; normalisasi stack
    | 0x080484e4 a160980408 mov eax, dword [obj.stdin__GLIBC_2.0] ; EAX = stdin
    | 0x080484e9 83ec04 sub esp, 4 ;
    | 0x080484ec 50 push eax ; parameter3: EAX (stdin)
    | 0x080484ed 6a50 push 0x50 ; parameter2: 80 byte
    | 0x080484ef 8d45a4 lea eax, [ebp-local_23] ; EAX = buffer
    | 0x080484f2 50 push eax ; parameter1: EAX (buffer)
    | 0x080484f3 e878feffff call sym.imp.fgets ; fgets(local_23, 80, stdin);
    | 0x080484f8 83c410 add esp, 0x10 ; normalisasi stack
    | 0x080484fb c745f4000000. mov dword [ebp-local_3], 0 ; local_3 = 0 (counter)
    | ,=< 0x08048502 eb40 jmp 0x8048544 ; lompat ke alamat 0x8048544
    | | ; JMP XREF from 0x0804854a (sym.main)
    | .--> 0x08048504 8d55a4 lea edx, [ebp-local_23] ; EDX = local_23 (buffer)
    | || 0x08048507 8b45f4 mov eax, dword [ebp-local_3] ; EAX = counter
    | || 0x0804850a 01d0 add eax, edx ; EAX = ambil karakter sesuai dengan counter (buffer)
    | || 0x0804850c 0fb600 movzx eax, byte [eax] ; EAX = buffer[i]
    | || 0x0804850f f7d0 not eax ; EAX ~= EAX
    | || 0x08048511 89c2 mov edx, eax ; EDX = hasilnya disimpan di register EDX
    | || 0x08048513 8b45f4 mov eax, dword [ebp-local_3] ; EAX = counter
    | || 0x08048516 0500860408 add eax, obj.cipher ; EAX = ambil karakter sesuai dengan counter (cipher)
    | || 0x0804851b 0fb600 movzx eax, byte [eax] ; EAX = cipher[i]
    | || 0x0804851e 38c2 cmp dl, al ; bandingkan nilai pada register DL dan AL
    | ,===< 0x08048520 741e je 0x8048540 ; jika sama, maka lompat ke alamat 0x8048540
    | ||| 0x08048522 a180980408 mov eax, dword [obj.stdout__GLIBC_2.0] ; EAX = stdout
    | ||| 0x08048527 50 push eax ; parameter4: EAX (stdout)
    | ||| 0x08048528 6a0a push 0xa ; parameter3: 10 (jumlah karakter yang akan ditulis)
    | ||| 0x0804852a 6a01 push 1 ; parameter2: 1 (ukuran karakter yang akan ditulis 1 byte)
    | ||| 0x0804852c 682a860408 push str.Nice_try._n ; parameter1: "Nice try.." @ 0x804862a
    | ||| 0x08048531 e84afeffff call sym.imp.fwrite ; fwrite("Nice try..", 1, 10, stdout);
    | ||| 0x08048536 83c410 add esp, 0x10 ; normalisasi stack
    | ||| 0x08048539 b8ffffffff mov eax, 0xffffffff ; eax = return value (-1)
    | ,====< 0x0804853e eb28 jmp 0x8048568 ; lompat ke instruksi untuk keluar dari aplikasi
    | |||| ; JMP XREF from 0x08048520 (sym.main) ;
    | |`---> 0x08048540 8345f401 add dword [ebp-local_3], 1 ; tambahkan 1 ke variabel counter
    | | || ; JMP XREF from 0x08048502 (sym.main) ;
    | | |`-> 0x08048544 8b45f4 mov eax, dword [ebp-local_3] ; EAX = local_3 (counter)
    | | | 0x08048547 83f818 cmp eax, 0x18 ; apakah jumlahnya sudah 24 karakter?
    | | `==< 0x0804854a 76b8 jbe 0x8048504 ; jika belum, maka ulangi ke alamat 0x8048504
    | | 0x0804854c a180980408 mov eax, dword [obj.stdout__GLIBC_2.0] ; EAX = stdout
    | | 0x08048551 50 push eax ; parameter4: EAX (stdout)
    | | 0x08048552 6a11 push 0x11 ; parameter3: 17 (jumlah karakter yang akan ditulis)
    | | 0x08048554 6a01 push 1 ; parameter2: 1 (ukuran karakter yang akan ditulis 1 byte)
    | | 0x08048556 6835860408 push str.Congraturations__n ; parameter1: "Congraturations!." @ 0x8048635
    | | 0x0804855b e820feffff call sym.imp.fwrite ; fwrite("Congraturations!.", 1, 17, stdout);
    | | 0x08048560 83c410 add esp, 0x10 ; normalisasi stack
    | | 0x08048563 b800000000 mov eax, 0 ; EAX = 0 (return value)
    | | ; JMP XREF from 0x0804853e (sym.main)
    | `----> 0x08048568 8b4dfc mov ecx, dword [ebp-local_1] ;
    | 0x0804856b c9 leave ; normalisasi stack
    | 0x0804856c 8d61fc lea esp, [ecx - 4] ;
  • Pada alamat 0x08048516 bisa terlihat instruksi yang mengakses variabel cipher, dan pada alamat 0x08048547 bisa terlihat bahwa kalkulasi jumlah karakter pada flag (ukuran flag) adalah 0x18 heksadesimal atau 24 desimal. Jadi kita cukup melihat 24 byte dari variabel cipher. Caranya adalah sebagai berikut:
    Code:
    [0x080487b0]> x [email protected]
    - offset - 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
    0x08048600 bcb5 cdcf ceca 84bb 8da0 bb8d 9aa0 889e ................
    0x08048610 8ca0 979a 8d9a 82f5 ........

  • Untuk menemukan flag yang benar, maka kita akan melakukan instruksi bitwise NOT untuk setiap karakter pada variabel cipher tersebut. Caranya adalah seperti ini:
    Code:
    [0x080483b0]> !python
    Python 2.7.10 (default, Sep 8 2015, 17:20:17)
    [GCC 5.1.1 20150618 (Red Hat 5.1.1-4)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> print ''.join([chr(~ord(c) & 0xff) for c in "\xbc\xb5\xcd\xcf\xce\xca\x84\xbb\x8d\xa0\xbb\x8d\x9a\xa0\x88\x9e\x8c\xa0\x97\x9a\x8d\x9a\x82\xf5"])
    CJ2015{Dr_Dre_was_here}
  • Bisa terlihat bahwa flag yang benar adalah CJ2015{Dr_Dre_was_here}.
Sekian tutorial singkat ini, semoga bermanfaat. Terima kasih kepada Tuhan Yang Maha Esa, Maxindo, N3 dan Anda yang telah membaca tutorial ini.

Referensi: http://radare.org/r/
Credits: Drubizca
Source: http://rndc.or.id/wiki/index.php?title=Beats
Groups: https://www.facebook.com/groups/rndc.or.id/
 

dono

3 SMP
STAFF N3
Tukang Sapu
SCARLET

Pendahuluan

Tutorial singkat kali ini akan membahas solusi soal scarlet pada kompetisi Cyber Jawara 2015. Soal tersebut berisi 2 buah berkas, yaitu sebuah berkas gambar dengan nama Capture.JPG dan sebuah berkas teks dengan nama kabayan.txt.



Langkah-langkah
  • Berikut ini adalah informasi dari kedua berkas tersebut:
    Code:
    % file *
    Capture.JPG: JPEG image data, JFIF standard 1.01, resolution (DPI), density 96x96, segment length 16, \
    Exif Standard: [TIFF image data, big-endian, direntries=4], baseline, precision 8, 205x33, frames 3
    kabayan.txt: ASCII text, with very long lines, with CRLF line terminators
  • Sekarang, perhatikan gambar Capture.JPG. Gambar tersebut menggunakan karakter dancingmen, yang jika diterjemahkan akan menghasilkan kata CYRJWRA.
  • Selanjutnya, buka berkas kabayan.txt menggunakan teks editor, bisa terlihat bahwa teks pada berkas tersebut menggunakan encoding base64 sehingga terlebih dahulu harus di-decode dengan cara seperti ini:
    Code:
    % base64 -d < kabayan.txt > kabayan.bin
    base64: invalid input
  • Pesan invalid input pada langkah di atas terjadi kerena pada bagian akhir berkas kabayan.txt terdapat karakter baris baru yang biasa dikenal dengan istilah newline (karakter "\r\n"). Hasil dari langkah di atas adalah berkas bernama kabayan.bin. Selanjutnya kita perlu mencari tahu jenis berkas tersebut:
    Code:
    % file kabayan.bin
    kabayan.bin: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, Exif Standard:
    [TIFF image data, little-endian, direntries=2, software=Google], baseline, precision 8, 153x210, frames 3
  • Bisa terlihat bahwa berkas tersebut merupakan gambar dalam format JPEG. Selanjutnya periksa string yang terdapat pada berkas tersebut:
    Code:
    % strings kabayan.bin
    JFIF
    ~Exif
    Google
    ...
    flag.txt
    flag.txt
  • scralet.png
  • Gunakan CYRJWRA sebagai kata kunci untuk membuka arsip tersebut:
    Code:
    % 7z x -pCYRJWRA flag.zip
    
    7-Zip [64] 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18
    p7zip Version 9.20 (locale=en_US.utf8,Utf16=on,HugeFiles=on,4 CPUs)
    
    Processing archive: flag.zip
    
    Extracting flag.txt
    
    Everything is Ok
    
    Size: 15
    Compressed: 195
  • Langkah terakhir adalah melihat isi dari berkas flag.txt:
    Code:
    % cat flag.txt
    w1lu73n9_T3P4ng


Penutup
Sekian tutorial singkat kali ini, semoga bermanfaat. Terima kasih kepada Tuhan Yang Maha Esa, Maxindo, N3 dan Anda yang telah membaca tutorial ini.
 

dono

3 SMP
STAFF N3
Tukang Sapu
Ellegarden

Pendahuluan
Tutorial ini akan membahas soal ellegarden dari kompetisi Cyber Jawara 2015. Soal ini berupa file executable ELF 32bit.

Langkah-langkah
Pertama periksa jenis executable ellegarden tersebut (langkah ini sifatnya opsional):
Code:
% file ellegarden
ellegarden: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, \
interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=d123e05b945e7da70948c7ffd6b60366a53da3cc, stripped
Selanjutnya, periksa printable string pada executable tersebut:
Code:
% strings ellegarden
/lib/ld-linux.so.2
libc.so.6
_IO_stdin_used
puts
strcmp
__libc_start_main
__gmon_start__
GLIBC_2.0
PTRh
QVh+
[^_]
Good morning kids!
But, do I know you?
MORNING!
this is your flag CJ2015{Dr_dR3_4r3_w47cH1n6_y0u}
;*2$"(
GCC: (Debian 4.9.2-10) 4.9.2
GCC: (Debian 4.8.4-1) 4.8.4
.shstrtab
.interp
.note.ABI-tag
.note.gnu.build-id
.gnu.hash
.dynsym
.dynstr
.gnu.version
.gnu.version_r
.rel.dyn
.rel.plt
.init
.text
.fini
.rodata
.eh_frame_hdr
.eh_frame
.init_array
.fini_array
.jcr
.dynamic
.got
.got.plt
.data
.bss
.comment
Bisa terlihat sebuah string yang cukup menarik yaitu this is your flag CJ2015{Dr_dR3_4r3_w47cH1n6_y0u}. String tersebut akan ditampilkan jika parameter yang dimasukkan pada commandline benar. Berikut ini adalah penjelasan dari static analysis aplikasi tersebut menggunakan radare2:
Code:
[0x08048430]>
/ (fcn) main 113
|           ; var int local_1      @ ebp-0x4
|           ; DATA XREF from 0x08048347 (main)
|           0x0804842b    8d4c2404       lea ecx, [esp + 4]             ; 0x4
|           0x0804842f    83e4f0         and esp, 0xfffffff0            ;
|           0x08048432    ff71fc         push dword [ecx - 4]           ;
|           0x08048435    55             push ebp                       ;
|           0x08048436    89e5           mov ebp, esp                   ; inisialisasi stack
|           0x08048438    51             push ecx                       ;
|           0x08048439    83ec04         sub esp, 4                     ;
|           0x0804843c    89c8           mov eax, ecx                   ; EAX = ARGC
|           0x0804843e    833801         cmp dword [eax], 1             ; apakah user memasukkan parameter?
|       ,=< 0x08048441    7f12           jg 0x8048455                   ; jika iya, maka lompat ke alamat 0x8048455
|       |   0x08048443    83ec0c         sub esp, 0xc                   ; jika tidak, maka tampilkan pesan berikut
|       |   0x08048446    6830850408     push str.Good_morning_kids_    ; parameter1: "Good morning kids!"
|       |   0x0804844b    e8b0feffff     call sym.imp.puts              ; puts("Good morning kids!");
|       |   0x08048450    83c410         add esp, 0x10                  ; normalisasi stack
|      ,==< 0x08048453    eb3f           jmp 0x8048494                  ; lompat ke alamat 0x8048494
|      ||   ; JMP XREF from 0x08048441 (main)
|      |`-> 0x08048455    8b4004         mov eax, dword [eax + 4]       ; [0x4:4]=0x10101
|      |    0x08048458    83c004         add eax, 4                     ;
|      |    0x0804845b    8b00           mov eax, dword [eax]           ; EAX = parameter pada command line (ARGV[1])
|      |    0x0804845d    83ec08         sub esp, 8                     ;
|      |    0x08048460    6843850408     push 0x8048543                 ; parameter2: string pada alamat 0x8048543 "sun"
|      |    0x08048465    50             push eax                       ; parameter1: ARGV[1]
|      |    0x08048466    e885feffff     call sym.imp.strcmp            ; strcmp("sun", ARGV[1]);
|      |    0x0804846b    83c410         add esp, 0x10                  ; normalisasi stack
|      |    0x0804846e    85c0           test eax, eax                  ; apakah hasil dari perbandingan di atas sama?
|      |,=< 0x08048470    7412           je 0x8048484                   ; jika sama, maka lompat ke alamat 0x8048484
|      ||   0x08048472    83ec0c         sub esp, 0xc                   ; jika tidak, maka tampilkan pesan berikut
|      ||   0x08048475    6847850408     push str.Hi__                  ; parameter1: "Hi!.But, do I know you?"
|      ||   0x0804847a    e881feffff     call sym.imp.puts              ; puts("Hi!.But, do I know you?");
|      ||   0x0804847f    83c410         add esp, 0x10                  ; normalisasi stack
|     ,===< 0x08048482    eb10           jmp 0x8048494                  ; lompat ke alamat 0x8048494
|     |||   ; JMP XREF from 0x08048470 (main)
|     ||`-> 0x08048484    83ec0c         sub esp, 0xc                   ;
|     ||    0x08048487    6860850408     push str.MORNING__             ; parameter1: "MORNING!.this is your flag CJ2015{Dr_dR3_4r3_w47cH1n6_y0u}"
|     ||    0x0804848c    e86ffeffff     call sym.imp.puts              ; puts("MORNING!.this is your flag CJ2015{Dr_dR3_4r3_w47cH1n6_y0u}")
|     ||    0x08048491    83c410         add esp, 0x10                  ; normalisasi stack
|     ||    ; JMP XREF from 0x08048482 (main)
|     ||    ; JMP XREF from 0x08048453 (main)
|     ``--> 0x08048494    8b4dfc         mov ecx, dword [ebp-local_1]   ;
|           0x08048497    c9             leave                          ;
|           0x08048498    8d61fc         lea esp, [ecx - 4]             ;
\           0x0804849b    c3             ret                            ;
...
Dan berikut ini adalah string yang terdapat pada alamat 0x8048543:
Code:
[0x08048530]> x 16@0x8048543
- offset -   0 1  2 3  4 5  6 7  8 9  A B  C D  E F  0123456789ABCDEF
0x08048543  7375 6e00 4869 210a 4275 742c 2064 6f20  sun.Hi!.But, do
Bisa terlihat bahwa string sun diakhiri dengan null terminator akan dibandingkan dengan parameter pertama yang dimasukkan pada command line menggunakan fungsi strcmp. Berikut ini adalah hasil dari eksekusi aplikasi tersebut dengan tiga cara:
Code:
% # Tanpa menggunakan parameter
% ./ellegarden
Good morning kids!
%
% # Menggunakan parameter acak
% ./ellegarden rammstein
Hi!
But, do I know you?
%
% # Menggunakan parameter "sun"
% ./ellegarden sun
MORNING!
this is your flag CJ2015{Dr_dR3_4r3_w47cH1n6_y0u}
Seperti yang bisa dilihat, cara ketiga menampilkan flag string yang berisi flag.

Penutup
Sekian tutorial kali ini, semoga bermanfaat. Terima kasih kepada Tuhan Yang Maha Esa, Maxindo, N3 dan Anda yang telah membaca tutorial ini.
 
Top