Writeup CTFR Programming

Khairu Aqsara Sudirman

Khairu Aqsara Sudirman

Mar 19, 2021 — 8 mins read

Writeup Challenge dengan kategori programming, saya berharap teman-teman yang belum mencoba challenge-nya bisa mencoba dulu dan berusaha menyelesaikanya, cara saya menyelesaikan nya mungkin tidak sesuai atau berbeda dengan yang seharusnya, tetapi ya itu seni CTF, tidak penting caranya bagaiamana yang penting kita bisa menemukan flagnya.

1. Benih

Mimin di berikan benih sama member nih, coba cari tau dari tersebut. Oiya jangan lupa nama benih nya "CTFR"

Download : https://mega.nz/#!AkByiJiA!HHYR3Zxrh52ueX0i4D2QyPIx4TX2mm1gSX6ztSMsnvY

setelah didownload, ternyata isinya ada 2 file dengan nama challenge.py dan encrypt.txt, jika diamati source pada file challenge.py terdapat beberapa baris kode yang digunakan untuk membaca sebua file dan meng-encryptnya dengan metode simple ord(karakter) + nilai random

import random
encrypted = open("encrypt.txt", "r").read()
encrypt = ""
for x in encrypted:
    p = random.randint(0, 14)
    encrypt += chr(ord(x) + p)
print encrypt

dan isi file dari encrypt.txt adalah

GWQZ"qp{urlwco#^omwuyp!\llzlwsp"Lc{}{m&Uhn.Opis.kovugx&Nwoxj|!}p{nmxp3-Oc|+|etyyv‡e%|bzu„f+|go,GI8)F‚'xln$iudpz}o+C"G_P[f9q<vdxp6ye|6€<xƒ

berdasarkan deskripsi challenge nya untuk bisa mendecrypt file tersebut kita harus menggunakan seed dengan value CTFR, ini artinya fungsi random pada baris kode random.randint(0, 14) berdasarkan seed tersebut.

#!/home/kulikode/.pyenv/shims/python2
import random
encrypted = open("encrypt.txt", "r").read()
flag = ""
random.seed("CTFR")
for x in encrypted:
    flag += chr(ord(x) - random.randrange(0, 15))
print flag

setelah dijalankan maka hasilnya

CTFR{b3n1h_ul4r_p1t0n}

2. Covid 19

Selama pandemi covid-19 kita harus menjaga kesehatan dan selalu cuci tangan. Hint: Karakter ke 1 sampai 19 adalah : Jaga kesehatan dan

Dari judul Challenge bisa ketebak jika ini adalah Enkripsi dengan modulo 19,

encrypted = "J`e^\x1cf_l]_WiUa\x12UQ]\x0esdj^hp\x1a\\mZ_\x15hT`XQ]\x0eumrrg\x1bg^
fZ[\\U[\x12aU]gea_o]i\x1a<gm_Y!$+\x11iPOh-\x1e?pr\x1am``i\x15]f\x12j_d`
 ej^c\x1b4\x19;K<GoV&c#Ng0tp\\o.f_W+dYS'^h$ha_bs`-Zn-f^*cq!\x12=_eS sml\x1cn_^\x18`j\x15Vhf\x11]PYe\x1fwlqm\x1afaeZ\x15[_ah\x10d^"

Dengan menerapkan sedikit kalkulasi matematika challenge ini bisa diselesaikan

flag = ''
for i in range(len(encrypted)):
  flag+=chr(ord(encrypted[i]) + (i % 19))
print(flag)

Setelah dijalankan hasilnya

CTFR{c4r3_y0ur_s3lf_4nd_4lw4ys_cuc1_t4ng4n}

3. CTFR Language

Mimin membuat sebuah bahasa sederhana, yang menggunakan 
bahasa kecil yaitu "push, up, mul, add, desc, ret, mov". Jika kalian penasaran cek nih.

Download : https://mega.nz/#!wwhCULBB!94_xpQD5Zpaqm_ekL5N0V2gEFjZtbaeQ4MzfAqKnvT0

Challenge ini menurut saya cukup menarik, disini kita bisa belajar memahami sebuah logik yang diterapkan untuk melakukan satu proses tetapi proses tersebut disamarkan seolah-olah sebuah string, script challengenya cukup panjang

import random
# Global Storage With 1024 Size
temp = [0 for x in range(1024)]
used = 0
def push(x):
    global used
    temp[used] = int(x)
    used += 1
    return temp[used - 1]
def up(x):
    return x ** 8
def mul(x):
    return x ** 2
def add(x, val):
    return x + val
def desc(x, val):
    return x - val
def ret(x):
    return x
def mov(x, val):
    temp[x] = val
    return temp[x]

data = {
    "\x10": push,
    "\x11": up,
    "\x12": mul,
    "\x13": add,
    "\x14": desc,
    "\x15": ret,
    "\x16": mov
}

def exe(val):
    res = 0
    if "," in val:
        x = val.split((val[0]) + " ")[1]
        x = x.split(",")
        if len(x) > 2:
            res = data[val[0]](int(x[0]), int(x[1]))
        elif len(x) == 2:
            res = data[val[0]](int(x[0]))
    return res
flag = "TEST"
for x in range(len(temp)):
    if x == len(flag):
        exe("\x10 999999,")
        continue
    if x >= len(flag):
        exe("\x10 %s," % (random.randint(0, 9999)))
        exe("\x16 %s,%s," % (random.randint(len(flag) + 1, len(temp) - 1), random.randint(0, 877221)))
        continue
    char = ord(flag[x])
    command = x % len(data)
    if command == 0:
        exe("\x10 %s," % exe("\x13 %s,%s," % (char, exe("\x11 %s," % char))))
    elif command == 1:
        exe("\x10 %s," % (exe("\x12 %s," % char) + exe("\x13 %s,%s," % (char, exe("\x12 %s," % char)))))
    elif command == 2:
        exe("\x10 %s," % (char - exe("\x12 %s," % 5)))
    elif command == 3:
        exe("\x10 %s," % exe("\x13 %s,%s," % (exe("\x11 %s," % exe("\x14 23,10,")), exe("\x11 %s," % char))))
    elif command == 4:
        exe("\x10 %s," % exe("\x13 %s,%s," % (len(data), char)))
    elif command == 5:
        if (exe("\x11 %s," % x)) % 3 == 0:
            exe("\x10 %s," % exe("\x13 %s,%s," % (x, exe("\x11 %s," % char))))
        else:
            exe("\x10 %s," % exe("\x12 %s," % char))
    else:
        exe("\x10 %s," % exe("\x13 %s,%s," % (5881 * 4, exe("\x12 %s," % char))))
print(temp)

jika dijalankan script tersebut akan menghasilkan sebanyak 1024 array , padahal hanya untuk mengenkrip string CTFR array tersebut didapat dari modifikasi temp = [0 for x in range(1024)] yang jika diperhartikan fungsi exe() hanya memanggil variable data yang mana merupakan sebuah alias dari fungsi-fungsi lain, misalnya seperti exe("\x10 999999,") sebenarnya ini memanggil fungsi def push(x) begitu juga dengan fungsi-fungsi yang lainya. dengan begitu kita bisa menerjemahkan alur kerja dari program tersebut.

perulangan akan dilakukan sejumlah len(temp) yang kemudian dilanjutkan dengan pemeriksaan kondisi dimana jika nilai x sama dengan len(flag) maka nilai temp[used] = 999999 jika kita telusuri dari file yang di encrypt angka 999999 ada pada posisi 122 didalam list artinya kemungkinan panjang flagnya adalah 122

Dan lagi jika x bernilai lebih besar dari len(flag) maka nilai temp akan diisi dengan angka random yang diciptakan oleh fungsi def push(x) dan def mov(x, val), begitu seterusnya jika kita breakdown satu persatu.

yang paling penting diperhatikan menurut saya ada pada bagian command = x % len(data) atau sama saja dengan command = x % 7, misalnya jika x = 0 maka command = 0 % 7 = 0, jika command bernilai 0 maka perintah exe("\x10 %s," % exe("\x13 %s,%s," % (char, exe("\x11 %s," % char)))) akan di eksekusi atau jika lebih jelasnya bentuknya jadi seperti berikut, dimana jika char kita asumsikan adalah nilai ordinal dari huruf C atau ord('C')

hasilnya sama, nah untuk proses decryptnya kita hanya perlu melakukan brute-forcing karakter by karakter hingga menemukan angka yang cocok untuk setiap list angka pada hasil enkripsinya

import random
import string
temp = [0 for x in range(1024)]
used = 0
def push(x):
    global used
    temp[used] = int(x)
    used += 1
    return temp[used - 1]
def up(x):
    return x ** 8
def mul(x):
    return x ** 2
def add(x, val):
    return x + val
def desc(x, val):
    return x - val
def ret(x):
    return x
def mov(x, val):
    temp[x] = val
    return temp[x]

data = {
    "\x10": push,
    "\x11": up,
    "\x12": mul,
    "\x13": add,
    "\x14": desc,
    "\x15": ret,
    "\x16": mov
}


def exe(val):
    res = 0
    if "," in val:
        x = val.split((val[0]) + " ")[1]
        x = x.split(",")
        if len(x) > 2:
            res = data[val[0]](int(x[0]), int(x[1]))
        elif len(x) == 2:
            res = data[val[0]](int(x[0]))
    return res
r_flag = [2252292232139124, 20503, 73, 10828567872011522, 117, 9409, 36520, 21435888100000110, 29403, 72, 1100327358497, 73, 7837433594376973, 34340, 7837433594377058, 26565, 72, 1100327358497, 112, 12100, 34549, 1099511627808, 19306, 80, 30590229441121346, 104, 1024, 34973, 7837433594377058, 23436, 80, 7837434410107682, 117, 1099511627809, 34973, 10828567056280902, 23871, 73, 7837434410107682, 117, 10609, 34973, 7837433594377058, 24310, 7, 15938481561039137, 112, 11449, 32933, 1099511627808, 23005, 72, 18509302918549537, 112, 7837433594377015, 35624, 1099511627808, 26565, 92, 17181862614049922, 104, 1024, 26888, 457163239653444, 3916, 7, 360041422000417, 123, 14161, 24548, 13685690504052840, 20503, 89, 10828567872011522, 39, 14774554437890700, 36749, 1099511627808, 29403, 86, 35114533573746562, 121, 1024, 28424, 18509302102818924, 18915, 78, 1100327358497, 65, 1024, 28013, 2478758911082580, 9870, 57, 52389095243993602, 122, 28179280429152, 35405, 45767944570452, 18145, 26, 53460544262177, 60, 14641, 32549, 18509302102818924, 5460, 85, 111429972842722, 124, 2704, 34133, 45767944570452, 18145, 23, 11716594625753377, 102, 9227446944279318, 36980, 11716593810022758, 26106, 100, 999999, 621, 748197, 4697, 701969, 6769, 763059, 107326, 877205, 145666, 53511, 4016, 727373, 8701, 762489, 7761, 472414, 1017, 120720, 304878, 507964, 62139, 5072, 327052, 9886, 343, 874628, 684918, 7205, 80610, 619665, 4160, 510907, 329754, 327299, 642761, 511725, 380002, 5281, 72525, 734241, 580731, 25831, 527637, 5412, 2666, 6124, 2670, 6047, 233556, 274450, 6097, 756266, 8232, 9934, 644619, 53142, 6445, 816107, 8417, 863144, 379402, 763752, 313107, 580371, 4088, 26745, 736667, 505335, 608641, 6669, 784148, 8207, 687829, 281117, 420119, 398931, 6755, 640252, 811344, 61259, 54311, 594, 4532, 625510, 840588, 1828, 635, 5264, 824761, 392379, 365472, 4812, 7462, 148280, 2073, 8515, 848455, 1825, 558456, 7314, 6154, 756126, 488336, 334542, 77522, 796, 3387, 8381, 810627, 641202, 582186, 728933, 7045, 305731, 1760, 849756, 7508, 4322, 763282, 5801, 689065, 331479, 3591, 1360, 183113, 568, 18834, 396061, 360514, 819557, 60920, 160968, 414026, 3349, 98566, 1844, 5583, 374486, 2703, 32318, 606025, 539693, 8377, 9672, 7480, 4281, 2912, 1607, 9344, 109485, 198842, 630028, 321834, 564143, 671749, 5620, 3561, 3290, 393243, 357703, 3052, 8644, 66841, 815, 1721, 5887, 64058, 605139, 9364, 1735, 223752, 7814, 622797, 591429, 220159, 448714, 785415, 840416, 5200, 830411, 6859, 6694, 408856, 228, 3398, 612381, 5524, 582153, 5586, 774438, 536396, 177208, 8032, 445812, 1702, 4285, 461170, 649744, 262994, 6920, 6951, 595926, 531507, 2778, 8804, 2545, 7685, 176583, 7412, 1375, 5814, 852892, 2662, 5913, 753073, 60836, 9226, 73282, 320763, 328780, 613475, 368187, 183075, 1557, 1155, 243246, 2119, 387867, 174672, 6834, 292767, 307, 4648, 107628, 232936, 8025, 596774, 630951, 636, 838250, 848835, 759, 7601, 4853, 490379, 8973, 5738, 80644, 602442, 253193, 2851, 2475, 8722, 378280, 721373, 9486, 4156, 272697, 687468, 96406, 274329, 568380, 229952, 4526, 109017, 629005, 6334, 6038, 442981, 664150, 3975, 12652, 824183, 8726, 7279, 585731, 288006, 4022, 575584, 4395, 734974, 4515, 538, 574776, 3623, 4218, 469, 3054, 4272, 6431, 365522, 727240, 446450, 4396, 295446, 8644, 8657, 1310, 459901, 97066, 695909, 508693, 343824, 7886, 8860, 547619, 703103, 9116, 9240, 38549, 4506, 6531, 3638, 294895, 198349, 568409, 807774, 122, 2674, 809892, 313612, 504348, 572606, 94378, 241470, 740499, 230624, 8252, 1639, 110837, 559104, 219841, 199295, 5313, 273997, 3406, 4258, 453657, 6020, 321, 456555, 8935, 507906, 430821, 6988, 1246, 3547, 478295, 406707, 229502, 6606, 1338, 458498, 337858, 7173, 66732, 6262, 320592, 7683, 394935, 385, 9638, 7508, 1918, 5167, 626021, 7711, 489838, 770312, 9073, 209100, 800537, 703485, 2984, 729, 809609, 577288, 810538, 6034, 497459, 871124, 144179, 210633, 414959, 5236, 591827, 421504, 864161, 1624, 284799, 526807, 6337, 294279, 565413, 4294, 6443, 3474, 808019, 6529, 1249, 334129, 703633, 4693, 417603, 7890, 785379, 4309, 371454, 20584, 202218, 413687, 356430, 6329, 1084, 94510, 380220, 418436, 388765, 3954, 267007, 3126, 726541, 619656, 1891, 5830, 242597, 2611, 8235, 3509, 414001, 285549, 9380, 549541, 3443, 4765, 703719, 447741, 22918, 9467, 8767, 3459, 360150, 608989, 4739, 173473, 798380, 1732, 41910, 2036, 929, 535707, 9676, 8629, 843921, 404671, 670788, 94765, 3411, 2897, 265644, 143146, 8500, 190490, 633175, 3711, 4219, 120577, 392439, 674, 719954, 711437, 7482, 9555, 9933, 7226, 393221, 805885, 5166, 6460, 2151, 2130, 621587, 7842, 44481, 3945, 439543, 368450, 6782, 642082, 5342, 2889, 520334, 6508, 574753, 7872, 8939, 5542, 246505, 3323, 471, 6716, 2953, 314678, 625911, 3282, 46502, 240090, 4628, 857, 338956, 655335, 4970, 2849, 2833, 4181, 7242, 69, 1436, 6328, 2265, 5433, 475849, 55303, 178235, 6874, 698859, 5567, 5879, 1474, 9501, 760584, 8975, 721865, 812, 495193, 6372, 5413, 4197, 327610, 218110, 5990, 7583, 611720, 2796, 304152, 1591, 1398, 2518, 5258, 5942, 8723, 2462, 1721, 8171, 8765, 2904, 6972, 1581, 4304, 12092, 3534, 5391, 6945, 4106, 304780, 7336, 5545, 1428, 8339, 881, 9686, 7989, 719925, 4198, 2821, 6684, 720301, 74754, 2822, 614962, 1974, 5709, 372049, 4981, 6343, 8172, 737093, 848414, 4345, 483197, 814703, 680967, 4230, 1375, 2132, 567, 7261, 9946, 718594, 3542, 4141, 681079, 5118, 7077, 7492, 359354, 6348, 6109, 4922, 4304, 177325, 1786, 4108, 3817, 9062, 771839, 5059, 3911, 8662, 5934, 138, 87946, 8913, 7619, 3230, 4682, 2069, 123558, 7608, 294602, 2003, 8240, 3602, 304274, 1328, 170143, 9622, 9748, 4859, 3831, 1866, 4830, 7226, 2430, 8254, 864, 469075, 8669, 2056, 3303, 8865, 8202, 496, 645915, 1142, 4348, 8475, 8767, 7687, 2562, 855, 6731, 4987, 9746, 2665, 547363, 499, 3438, 3191, 2545, 3590, 6891, 9018, 660364, 334, 5455, 862445, 3877, 52, 528802, 792101, 1783, 491, 6978, 842, 6631, 8087, 2509, 304805, 5759, 3371, 2554, 7537, 5519, 60, 9190, 862509, 2072, 8387, 621, 1597, 4590, 718644, 562997, 3240, 6923, 3341, 3166, 3459, 7386, 9007, 7694, 776263, 5333, 5969, 28, 3887, 1731, 8001, 3615, 4228, 561, 2947, 4930, 6011, 2670, 716, 5643, 6758, 1850, 3190, 1285, 4718, 2480, 133788, 4198, 1995, 402, 6470, 3991, 9428, 9226, 6547, 7176, 6738, 1722, 802, 1772, 14968, 7301, 705533, 2160, 105242, 7400, 1332, 3257, 621, 787890, 7140, 74117, 6345, 7903, 6451, 5389, 685584, 9435, 851128, 9218, 3128, 3910, 1384, 9194, 9214, 104, 8779, 7475, 4082, 320971, 7706, 871, 8859, 3113, 6798, 4919, 2711, 2600, 1231, 7439, 4906, 496533, 664, 5578, 3762, 5781, 127, 3657, 8924, 2276, 661566, 832561, 8429, 8555, 9935, 600, 9954, 466, 4459, 5741, 1428, 647453, 2466, 8665, 3135, 8899, 9656, 2260, 363, 8382, 706832, 3810, 3271, 3602, 5456, 5422, 2159, 373, 3629, 8672, 4172, 7140, 1398, 2806, 6272, 2649, 7018, 3616, 185, 571, 4828, 8118, 7943, 643843, 445523, 5379, 1018, 3700, 9594, 8510, 9685, 5949, 3346, 4934, 3931, 3567, 5786, 456, 3305, 8281, 7110, 577, 9958, 2617, 4051, 8733, 3492, 5620, 851, 4645, 3355, 5813, 7999, 9278, 4392, 6729, 2553, 4511, 1800, 9296, 3682, 7805, 6234, 3012, 5577, 4269, 2414, 4044, 2151, 4669, 3736, 6137, 3462, 7462, 9461, 8009, 2790, 9835, 3214, 9012, 3107, 5272, 5623]


flag = ""
karakter = string.printable
num = 0
while(True):
  if '}' in flag :
    break
  for ch in karakter:
    nflag = flag + ch
    for x in range(len(nflag)):
        if x == len(nflag):
            exe("\x10 999999,")
            continue
        if x >= len(nflag):
            exe("\x10 %s," % (random.randint(0, 9999)))
            exe("\x16 %s,%s," % (random.randint(len(nflag) + 1, len(temp) - 1), random.randint(0, 877221)))
            continue
        char = ord(nflag[x])
        command = x % len(data)
        if command == 0:
            exe("\x10 %s," % exe("\x13 %s,%s," % (char, exe("\x11 %s," % char))))
        elif command == 1:
            exe("\x10 %s," % (exe("\x12 %s," % char) + exe("\x13 %s,%s," % (char, exe("\x12 %s," % char)))))
        elif command == 2:
            exe("\x10 %s," % (char - exe("\x12 %s," % 5)))
        elif command == 3:
            exe("\x10 %s," % exe("\x13 %s,%s," % (exe("\x11 %s," % exe("\x14 23,10,")), exe("\x11 %s," % char))))
        elif command == 4:
            exe("\x10 %s," % exe("\x13 %s,%s," % (len(data), char)))
        elif command == 5:
            if (exe("\x11 %s," % x)) % 3 == 0:
                exe("\x10 %s," % exe("\x13 %s,%s," % (x, exe("\x11 %s," % char))))
            else:
                exe("\x10 %s," % exe("\x12 %s," % char))
        else:
            exe("\x10 %s," % exe("\x13 %s,%s," % (5881 * 4, exe("\x12 %s," % char))))


    if temp[num] == r_flag[num] and temp[num] != 999999:
      flag+=ch
      print(flag)
      temp = [0 for x in range(1024)]
      used = 0
      num+=1
      break
    else:
      temp = [0 for x in range(1024)]
      used = 0

dan setelah dijalankan hasilnya adalah

Sebenarnya Bahasa ini bisa kalian kembangkan jika kalian suka :D, 
Btw here is your Flag : CTFR{s0m3_345y_l4n9u4g3_0f_ctfr}

4. Dot

Sesuai dengan namanya, mimin diberikan sebuah teks 
titik-titik yang sangat banyak sekali :(. Kalian bisa bantu cari tau arti dari titik titik itu kan...

Download : https://mega.nz/#!U1ZnUQiJ!8HEzYdSdVUHJ1ZNWLU4qxOF6qsiimLJheNmwfGG2ml0

setelah dilihat-lihat dengan texteditor isinya kosong, tetapi jika dilihat dengan hexeditor jadinya

00002ea0: 2e2e 2e2e 2e2e 2e2e 2e2e 2e2e 2e2e 2e2e  ................
00002eb0: 2e2e 2e2e 2e2e 2e2e 2e2e 2e2e 2e2e 2e2e  ................
00002ec0: 2e2e 2e2e 2e2e 2e2e 2e2e 2e2e 2e2e 2e2e  ................
00002ed0: 2e2e 2e2e 2e2e 2e2e 2e2e 2e2e 2e2e 2e2e  ................
00002ee0: 2e2e 2e20 2e2e 2e2e 2e2e 2e2e 2e2e 2e2e  ... ............

hanya ada titik dan spasi, bisa diasumsikan kalo jumlah titik itu nunjukin ordinal dari sebuah karakter

with open('dot.txt', 'r') as f:
    p = [line.rstrip() for line in f][0]
    string ="".join([chr(len(x)) for x in  p.split()])
    print(string, end='')

hasilnya

CTFR{b154_d1l1h4t_d4r1_juml4h_d0t_d0t_t3r53but_4d4l4h_4sc11_ch4r4ct3r}
writeup ctf
Read More

Writeup CTFR Find Differ3nt

dari Judul chalenge nya sudah psati bisa ditebak, kalo kita diminta mencari perbedaan dari 2 buah file yang didownload yaitu file apple.txt dan coconut.txt, sebenarnya chalenge ini bisa diselesaikan dengan tools online https://text-compare.com/

Read More

Writeup CTFR Sekolah CTFR 1 Dan 2

Diberikan sebuah service pada alamat 103.157.96.13 pada port 7773 untuk Challenge Sekolah CTFR #1 dan Sebuah service pada port 7774, untuk Challenge Sekolah CTFR #2. pada kedua service tersebut dapat menginputkan atau melakukan registrasi sebagai siswa baru, seperti menginputkan nama dan id dari siswa, tetapi juga terdapat satu menu yang hanya bisa diakses oleh data yang memiliki akses admin, perbedaan dari Challenge ini yaitu pada Challenge Sekolah CTFR #2 merupakan perbaikan dari Sekolah CTFR #1.