Writeup CTFR Warna Warni V2

Khairu Aqsara Sudirman

Khairu Aqsara Sudirman

Mar 25, 2021 — 5 mins read
Hayuuu lanjut ke Warna Warni versi 2. Kali ini mimin beri 1000 Points dehh yang bisa nyelesain :D. Good Luck and Have fun.

Download : https://mega.nz/#!h0I0TTYS!wCbP8hCdPeA900f8PeD-m7Nt0Tcu9rXOzQPouIgoZYg

Hampir sama dengan challenge Warna-Warni Sebelumnya, data nya disimpan dalam pixel warnanya, jika teman-teman perhatikan setiap barisan warna pada RBG akan ditemui beberapa pattern, seperti (127,85,127) atau (127,72,127) jadi bisa ditarik kesimpulan jika datanya ada pada pixel warna Green (G) yang diapit oleh (127,(x), 127)

from PIL import Image

gbr = Image.open('warnawarni2.png')
pixel = gbr.load()
lebar,tinggi = gbr.size
flag  = []
for x in range(lebar):
	for y in range(tinggi):
		if pixel[x,y][0] == 127 and pixel[x,y][2] == 127:
			flag.append(pixel[x,y][1])

dan ketika dijalankan hasilnya berupa deretan angka dalam bentuk hexadecimal, karena ketika saya coba menjadikan nya menjadi sebuah karakter hasilnya menjadi tidak jelas, jadi asumsi sementara datanya sesuatu yang bukan text dan yang pasti isinya akan membuka tabir misteri flag yang ada pada file chal.py

[85, 72, 137, 229, 199, 69, 252, 12, 0, 0, 0, 193, 101, 252, 10, 193, 125, 252, 5, 131, 69, 252, 10, 129, 109, 252, 194, 0, 0, 0, 129, 125, 252, 144, 1, 0, 0, 127, 6, 131, 69, 252, 1, 235, 241, 193, 125, 252, 2, 129, 125, 252, 255, 0, 0, 0, 127, 6, 131, 69, 252, 1, 235, 241, 129, 125, 252, 0, 1, 0, 0, 117, 90, 131, 69, 252, 1, 131, 109, 252, 1, 131, 69, 252, 1, 131, 109, 252, 1, 139, 69, 252, 107, 192, 26, 137, 69, 252, 139, 69, 252, 105, 192, 104, 3, 0, 0, 137, 69, 252, 139, 69, 252, 105, 192, 164, 16, 146, 0, 137, 69, 252, 139, 69, 252, 105, 192, 164, 16, 146, 0, 137, 69, 252, 139, 69, 252, 105, 192, 164, 16, 146, 0, 137, 69, 252, 139, 69, 252, 105, 192, 164, 16, 146, 0, 137, 69, 252, 139, 69, 252, 235, 121, 131, 69, 252, 1, 139, 85, 252, 137, 208, 193, 224, 2, 1, 208, 1, 192, 137, 69, 252, 139, 69, 252, 72, 99, 208, 72, 105, 210, 103, 102, 102, 102, 72, 193, 234, 32, 193, 250, 2, 193, 248, 31, 137, 193, 137, 208, 41, 200, 137, 69, 252, 193, 125, 252, 10, 139, 85, 252, 72, 99, 194, 72, 105, 192, 103, 102, 102, 102, 72, 193, 232, 32, 193, 248, 2, 137, 214, 193, 254, 31, 41, 240, 137, 193, 137, 200, 193, 224, 2, 1, 200, 1, 192, 41, 194, 137, 85, 252, 131, 69, 252, 10, 129, 109, 252, 255, 0, 0, 0, 139, 69, 252, 107, 192, 100, 137, 69, 252, 139, 69, 252, 93, 195, 247]

saya coba telusuri dan mencari-cari referensi untuk jenis-jenis signature dari sebuah file berharap mendapatkan informasi, tetapi hasilnya nihil, tidak ada signature file yang saya temukan cocok dengan deretan angka hexa tersebut, datanya sudah pasti ada didalam situ hanya saja sejauh ini belum mendapatkan dalam bentuk apa, karena stuck saya lompati challengenya untuk sementara sembari mencari referensi-referensi.

Setelah hampir 2 hari, akhirnya saya mendapatkan hint dari seorang teman yang sudah berhasil menyelesaikan challenge ini, dia memberikan saya hint jika hexa tersebut merupakan sebuah deretan instruksi dalam bahasa assembly, tanpa pikir panjang saya langsung mencoba nya, hasil dari deret hexa tersebut saya rubah menjadi perintah assembely

from pwn import *
print(disasm("".join([chr(x) for x in flag]), arch="amd64"))

dan hasilnya cukup mengejutkan saya, pantesan saja selama ini tidak ketemu, ternyata yang disimpan adalah instruksi dalam bahasa assembly.

main:
  push   rbp
  mov    rbp, rsp
  mov    DWORD PTR [rbp-0x4], 0xc
  shl    DWORD PTR [rbp-0x4], 0xa
  sar    DWORD PTR [rbp-0x4], 0x5
  add    DWORD PTR [rbp-0x4], 0xa
  sub    DWORD PTR [rbp-0x4], 0xc2
  cmp    DWORD PTR [rbp-0x4], 0x190
  jg     0x2d
  add    DWORD PTR [rbp-0x4], 0x1
  jmp    0x1e
  sar    DWORD PTR [rbp-0x4], 0x2
  cmp    DWORD PTR [rbp-0x4], 0xff
  jg     0x40
  add    DWORD PTR [rbp-0x4], 0x1
  jmp    0x31
  cmp    DWORD PTR [rbp-0x4], 0x100
  jne    0xa3
  add    DWORD PTR [rbp-0x4], 0x1
  sub    DWORD PTR [rbp-0x4], 0x1
  add    DWORD PTR [rbp-0x4], 0x1
  sub    DWORD PTR [rbp-0x4], 0x1
  mov    eax, DWORD PTR [rbp-0x4]
  imul   eax, eax, 0x1a
  mov    DWORD PTR [rbp-0x4], eax
  mov    eax, DWORD PTR [rbp-0x4]
  imul   eax, eax, 0x368
  mov    DWORD PTR [rbp-0x4], eax
  mov    eax, DWORD PTR [rbp-0x4]
  imul   eax, eax, 0x9210a4
  mov    DWORD PTR [rbp-0x4], eax
  mov    eax, DWORD PTR [rbp-0x4]
  imul   eax, eax, 0x9210a4
  mov    DWORD PTR [rbp-0x4], eax
  mov    eax, DWORD PTR [rbp-0x4]
  imul   eax, eax, 0x9210a4
  mov    DWORD PTR [rbp-0x4], eax
  mov    eax, DWORD PTR [rbp-0x4]
  imul   eax, eax, 0x9210a4
  mov    DWORD PTR [rbp-0x4], eax
  mov    eax, DWORD PTR [rbp-0x4]
  jmp    0x11c
  add    DWORD PTR [rbp-0x4], 0x1
  mov    edx, DWORD PTR [rbp-0x4]
  mov    eax, edx
  shl    eax, 0x2
  add    eax, edx
  add    eax, eax
  mov    DWORD PTR [rbp-0x4], eax
  mov    eax, DWORD PTR [rbp-0x4]
  movsxd rdx, eax
  imul   rdx, rdx, 0x66666667
  shr    rdx, 0x20
  sar    edx, 0x2
  sar    eax, 0x1f
  mov    ecx, eax
  mov    eax, edx
  sub    eax, ecx
  mov    DWORD PTR [rbp-0x4], eax
  sar    DWORD PTR [rbp-0x4], 0xa
  mov    edx, DWORD PTR [rbp-0x4]
  movsxd rax, edx
  imul   rax, rax, 0x66666667
  shr    rax, 0x20
  sar    eax, 0x2
  mov    esi, edx
  sar    esi, 0x1f
  sub    eax, esi
  mov    ecx, eax
  mov    eax, ecx
  shl    eax, 0x2
  add    eax, ecx
  add    eax, eax
  sub    edx, eax
  mov    DWORD PTR [rbp-0x4], edx
  add    DWORD PTR [rbp-0x4], 0xa
  sub    DWORD PTR [rbp-0x4], 0xff
  mov    eax, DWORD PTR [rbp-0x4]
  imul   eax, eax, 0x64
  mov    DWORD PTR [rbp-0x4], eax
  mov    eax, DWORD PTR [rbp-0x4]
  pop    rbp
  ret

Sampai tahap ini saya rasa challengenya sudah menjadi sedikit lebih mudah, tugas selanjutnya adalah bagaiaman menjalankan instruksi-instruksi assembly tersebut, saya menggunakan MASM compiler dengan sedikit modifikasi pada instrukusi assemblernya karena dari instruksi-instruksi tersebut jika diperhatikan cara kerjanya mirip seperti key generator atau password generator, dan satu hal lagi yang bisa dipastikan jika hasil dari instruksi tersebut akan digunakan untuk melakukan decrypt pada chal.py, dan setelah saya compile dan jalankan hasilnya adalah

./testes.exe
48734240469230826517996249679921152

kemudian dilanjutkan dengan memodifikasi file chal.py untuk mendapatkan flagnya dan mendifinisikan hasil diatas sebagai keynya, yang perlu diperhatikan adalah angka yang ada pada file chal.py satu-satunya cara yang mungkin adalah dengan mengurangi flag[0] dengan key atau membagi flag[0] dengan key karana jika ditambah atau dikali hasilnya menjadi lebih besar dan akan tidak mungkin untuk dianggap sebagai ordinal dari sebuah karakter, misalnya seperti

3752536516130773641885711225353928704/48734240469230826517996249679921152 = 77 = M
5117095249269236784389606216391720960/48734240469230826517996249679921152 = 105 = i
5312032211146160090461591215111405568/48734240469230826517996249679921152 = 109 = m

jadi bisa dipastikan operasi yang digunakan adalah pembagian, selebihnya tinggal memodifikasi file chal.py untuk mendapatkan semua flagnya

key = 48734240469230826517996249679921152
for c in flag:
	ordinal_f = chr(c/key)
  	print(ordinal_f, end='')

dan hasilnya adalah

Mimin sengaja menambahkan beberapa kalimat disini agar mencegah Bruteforce :D. 
Btw here is your flag : CTFR{4553mbly_1n5truct10n_1n51d3_1m4g3_1f_y0u_r34d_it}. 
Maaf nihh challenge nya di remake tross :(
programming Forensic writeup ctf
Read More

Writeup CTFR R3verse Python

Dari Opcode tersebut terdapat 3 buah fungsi, yaitu CreateKey, Decrypt dan Encrypt, sebenarnya cukup fokus kebagian fungsi Decrypt aja, karena bagian ini yang akan digunakan untuk melakukan decrypt dari file yang di enkrip, jika diterjemahkan kedalam versi python kira-kira bentuk fungsi Decrypt seperti berikut

Read More

Writeup CTFR AES #2

Dalam kriptografi, Standar Enkripsi Lanjutan merupakan standar enkripsi dengan kunci simetris yang diadopsi oleh Pemerintah Amerika Serikat. Standar ini terdiri dari tiga penyandian blok, yaitu AES-128, AES-192, dan AES-256, yang diadopsi dari koleksi yang lebih besar yang awalnya diterbitkan sebagai Rijndael.