Writeup CTFR Salah Fokus

Khairu Aqsara Sudirman

Khairu Aqsara Sudirman

Mar 26, 2021 — 19 mins read
Sedikit Basic Encryption dengan function abal-abalan

Download : https://mega.nz/#!ks4BzA5b!ieG-RccWFiTuGVXd8B1qICt2YzYabetW0DUHYaiYSps

setelah di decompiler dengan ghidra, ternyata banyak banget fungsi yang di obfuscated, tetapi ada beberapa fungsi yang tidak di obfuscated, misalnya seperti fungsi main() dan fungsi encrypt()

gdb-peda$ pd main
Dump of assembler code for function main:
   0x0000000000001f27 <+0>:     endbr64 
   0x0000000000001f2b <+4>:     push   rbp
   0x0000000000001f2c <+5>:     mov    rbp,rsp
   0x0000000000001f2f <+8>:     lea    rdi,[rip+0x1595]        # 0x34cb
   0x0000000000001f36 <+15>:    call   0x1070 <puts@plt>
   0x0000000000001f3b <+20>:    lea    rdi,[rip+0x15a4]        # 0x34e6
   0x0000000000001f42 <+27>:    call   0x1189 <encrypt>
   0x0000000000001f47 <+32>:    mov    eax,0x0
   0x0000000000001f4c <+37>:    pop    rbp
   0x0000000000001f4d <+38>:    ret    
End of assembler dump.
gdb-peda$ 
gdb-peda$ pd encrypt
Dump of assembler code for function encrypt:
   0x0000000000001189 <+0>:     endbr64 
   0x000000000000118d <+4>:     push   rbp
   0x000000000000118e <+5>:     mov    rbp,rsp
   0x0000000000001191 <+8>:     push   rbx
   0x0000000000001192 <+9>:     sub    rsp,0x28
   0x0000000000001196 <+13>:    mov    QWORD PTR [rbp-0x28],rdi
   0x000000000000119a <+17>:    mov    DWORD PTR [rbp-0x14],0x0
   0x00000000000011a1 <+24>:    jmp    0x1312 <encrypt+393>
   0x00000000000011a6 <+29>:    mov    eax,DWORD PTR [rbp-0x14]
   0x00000000000011a9 <+32>:    movsxd rdx,eax
   0x00000000000011ac <+35>:    mov    rax,QWORD PTR [rbp-0x28]
   0x00000000000011b0 <+39>:    add    rax,rdx
   0x00000000000011b3 <+42>:    movzx  eax,BYTE PTR [rax]
   0x00000000000011b6 <+45>:    cmp    al,0x40
   0x00000000000011b8 <+47>:    jle    0x1210 <encrypt+135>
   0x00000000000011ba <+49>:    mov    eax,DWORD PTR [rbp-0x14]
   0x00000000000011bd <+52>:    movsxd rdx,eax
   0x00000000000011c0 <+55>:    mov    rax,QWORD PTR [rbp-0x28]
   0x00000000000011c4 <+59>:    add    rax,rdx
   0x00000000000011c7 <+62>:    movzx  eax,BYTE PTR [rax]
   0x00000000000011ca <+65>:    cmp    al,0x5a
   0x00000000000011cc <+67>:    jg     0x1210 <encrypt+135>
   0x00000000000011ce <+69>:    mov    eax,DWORD PTR [rbp-0x14]
   0x00000000000011d1 <+72>:    movsxd rdx,eax
   0x00000000000011d4 <+75>:    mov    rax,QWORD PTR [rbp-0x28]
   0x00000000000011d8 <+79>:    add    rax,rdx
   0x00000000000011db <+82>:    movzx  eax,BYTE PTR [rax]
   0x00000000000011de <+85>:    movsx  eax,al
   0x00000000000011e1 <+88>:    lea    ecx,[rax+0x1]
   0x00000000000011e4 <+91>:    mov    eax,DWORD PTR [rbp-0x14]
   0x00000000000011e7 <+94>:    cdq    
   0x00000000000011e8 <+95>:    shr    edx,0x1b
   0x00000000000011eb <+98>:    add    eax,edx
   0x00000000000011ed <+100>:   and    eax,0x1f
   0x00000000000011f0 <+103>:   sub    eax,edx
   0x00000000000011f2 <+105>:   sub    ecx,eax
   0x00000000000011f4 <+107>:   mov    eax,DWORD PTR [rbp-0x14]
   0x00000000000011f7 <+110>:   cdqe   
   0x00000000000011f9 <+112>:   lea    rdx,[rax*4+0x0]
   0x0000000000001201 <+120>:   lea    rax,[rip+0x4e38]        # 0x6040 <ec>
   0x0000000000001208 <+127>:   mov    DWORD PTR [rdx+rax*1],ecx
   0x000000000000120b <+130>:   jmp    0x130e <encrypt+389>
   0x0000000000001210 <+135>:   mov    eax,DWORD PTR [rbp-0x14]
   0x0000000000001213 <+138>:   movsxd rdx,eax
   0x0000000000001216 <+141>:   mov    rax,QWORD PTR [rbp-0x28]
   0x000000000000121a <+145>:   add    rax,rdx
   0x000000000000121d <+148>:   movzx  eax,BYTE PTR [rax]
   0x0000000000001220 <+151>:   cmp    al,0x60
   0x0000000000001222 <+153>:   jle    0x127a <encrypt+241>
   0x0000000000001224 <+155>:   mov    eax,DWORD PTR [rbp-0x14]
   0x0000000000001227 <+158>:   movsxd rdx,eax
   0x000000000000122a <+161>:   mov    rax,QWORD PTR [rbp-0x28]
   0x000000000000122e <+165>:   add    rax,rdx
   0x0000000000001231 <+168>:   movzx  eax,BYTE PTR [rax]
   0x0000000000001234 <+171>:   cmp    al,0x7a
   0x0000000000001236 <+173>:   jg     0x127a <encrypt+241>
   0x0000000000001238 <+175>:   mov    eax,DWORD PTR [rbp-0x14]
   0x000000000000123b <+178>:   movsxd rdx,eax
   0x000000000000123e <+181>:   mov    rax,QWORD PTR [rbp-0x28]
   0x0000000000001242 <+185>:   add    rax,rdx
   0x0000000000001245 <+188>:   movzx  eax,BYTE PTR [rax]
   0x0000000000001248 <+191>:   movsx  eax,al
   0x000000000000124b <+194>:   lea    ecx,[rax+0x1]
   0x000000000000124e <+197>:   mov    eax,DWORD PTR [rbp-0x14]
   0x0000000000001251 <+200>:   cdq    
   0x0000000000001252 <+201>:   shr    edx,0x1c
   0x0000000000001255 <+204>:   add    eax,edx
   0x0000000000001257 <+206>:   and    eax,0xf
   0x000000000000125a <+209>:   sub    eax,edx
   0x000000000000125c <+211>:   add    ecx,eax
   0x000000000000125e <+213>:   mov    eax,DWORD PTR [rbp-0x14]
   0x0000000000001261 <+216>:   cdqe   
   0x0000000000001263 <+218>:   lea    rdx,[rax*4+0x0]
   0x000000000000126b <+226>:   lea    rax,[rip+0x4dce]        # 0x6040 <ec>
   0x0000000000001272 <+233>:   mov    DWORD PTR [rdx+rax*1],ecx
   0x0000000000001275 <+236>:   jmp    0x130e <encrypt+389>
   0x000000000000127a <+241>:   mov    eax,DWORD PTR [rbp-0x14]
   0x000000000000127d <+244>:   movsxd rdx,eax
   0x0000000000001280 <+247>:   mov    rax,QWORD PTR [rbp-0x28]
   0x0000000000001284 <+251>:   add    rax,rdx
   0x0000000000001287 <+254>:   movzx  eax,BYTE PTR [rax]
   0x000000000000128a <+257>:   cmp    al,0x2f
   0x000000000000128c <+259>:   jle    0x12e1 <encrypt+344>
   0x000000000000128e <+261>:   mov    eax,DWORD PTR [rbp-0x14]
   0x0000000000001291 <+264>:   movsxd rdx,eax
   0x0000000000001294 <+267>:   mov    rax,QWORD PTR [rbp-0x28]
   0x0000000000001298 <+271>:   add    rax,rdx
   0x000000000000129b <+274>:   movzx  eax,BYTE PTR [rax]
   0x000000000000129e <+277>:   cmp    al,0x39
   0x00000000000012a0 <+279>:   jg     0x12e1 <encrypt+344>
   0x00000000000012a2 <+281>:   mov    eax,DWORD PTR [rbp-0x14]
   0x00000000000012a5 <+284>:   movsxd rdx,eax
   0x00000000000012a8 <+287>:   mov    rax,QWORD PTR [rbp-0x28]
   0x00000000000012ac <+291>:   add    rax,rdx
   0x00000000000012af <+294>:   movzx  eax,BYTE PTR [rax]
   0x00000000000012b2 <+297>:   movsx  eax,al
   0x00000000000012b5 <+300>:   lea    ecx,[rax+0x1]
   0x00000000000012b8 <+303>:   mov    eax,DWORD PTR [rbp-0x14]
   0x00000000000012bb <+306>:   cdq    
   0x00000000000012bc <+307>:   shr    edx,0x1d
   0x00000000000012bf <+310>:   add    eax,edx
   0x00000000000012c1 <+312>:   and    eax,0x7
   0x00000000000012c4 <+315>:   sub    eax,edx
   0x00000000000012c6 <+317>:   sub    ecx,eax
   0x00000000000012c8 <+319>:   mov    eax,DWORD PTR [rbp-0x14]
   0x00000000000012cb <+322>:   cdqe   
   0x00000000000012cd <+324>:   lea    rdx,[rax*4+0x0]
   0x00000000000012d5 <+332>:   lea    rax,[rip+0x4d64]        # 0x6040 <ec>
   0x00000000000012dc <+339>:   mov    DWORD PTR [rdx+rax*1],ecx
   0x00000000000012df <+342>:   jmp    0x130e <encrypt+389>
   0x00000000000012e1 <+344>:   mov    eax,DWORD PTR [rbp-0x14]
   0x00000000000012e4 <+347>:   movsxd rdx,eax
   0x00000000000012e7 <+350>:   mov    rax,QWORD PTR [rbp-0x28]
   0x00000000000012eb <+354>:   add    rax,rdx
   0x00000000000012ee <+357>:   movzx  eax,BYTE PTR [rax]
   0x00000000000012f1 <+360>:   movsx  eax,al
   0x00000000000012f4 <+363>:   lea    ecx,[rax-0xf]
   0x00000000000012f7 <+366>:   mov    eax,DWORD PTR [rbp-0x14]
   0x00000000000012fa <+369>:   cdqe   
   0x00000000000012fc <+371>:   lea    rdx,[rax*4+0x0]
   0x0000000000001304 <+379>:   lea    rax,[rip+0x4d35]        # 0x6040 <ec>
   0x000000000000130b <+386>:   mov    DWORD PTR [rdx+rax*1],ecx
   0x000000000000130e <+389>:   add    DWORD PTR [rbp-0x14],0x1
   0x0000000000001312 <+393>:   mov    eax,DWORD PTR [rbp-0x14]
   0x0000000000001315 <+396>:   movsxd rbx,eax
   0x0000000000001318 <+399>:   mov    rax,QWORD PTR [rbp-0x28]
   0x000000000000131c <+403>:   mov    rdi,rax
   0x000000000000131f <+406>:   call   0x1080 <strlen@plt>
   0x0000000000001324 <+411>:   cmp    rbx,rax
   0x0000000000001327 <+414>:   jb     0x11a6 <encrypt+29>
   0x000000000000132d <+420>:   nop
   0x000000000000132e <+421>:   nop
   0x000000000000132f <+422>:   add    rsp,0x28
   0x0000000000001333 <+426>:   pop    rbx
   0x0000000000001334 <+427>:   pop    rbp
   0x0000000000001335 <+428>:   ret    
End of assembler dump.

Kalo di terjemahin dalam Bahasa C dengan tools Ghidra hasilnya

undefined8 main(undefined8 param_1,int param_2)
{
  puts("Im not looking to anywhere");
  encrypt("Im not looking to anywhere\n",param_2);
  return 0;
}

void encrypt(char *__block,int __edflag)
{
  size_t sVar1;
  uint uVar2;
  int local_1c;
  
  local_1c = 0;
  while( true ) {
    sVar1 = strlen(__block);
    if (sVar1 <= (ulong)(long)local_1c) break;
    uVar2 = local_1c >> 0x1f;
    if ((__block[local_1c] < 'A') || ('Z' < __block[local_1c])) {
      if ((__block[local_1c] < 'a') || ('z' < __block[local_1c])) {
        if ((__block[local_1c] < '0') || ('9' < __block[local_1c])) {
          *(int *)(ec + (long)local_1c * 4) = __block[local_1c] + -0xf;
        }
        else {
          *(uint *)(ec + (long)local_1c * 4) =
               (__block[local_1c] + 1) - ((local_1c + (uVar2 >> 0x1d) & 7) - (uVar2 >> 0x1d));
        }
      }
      else {
        *(uint *)(ec + (long)local_1c * 4) =
             __block[local_1c] + 1 + ((local_1c + (uVar2 >> 0x1c) & 0xf) - (uVar2 >> 0x1c));
      }
    }
    else {
      *(uint *)(ec + (long)local_1c * 4) =
           (__block[local_1c] + 1) - ((local_1c + (uVar2 >> 0x1b) & 0x1f) - (uVar2 >> 0x1b));
    }
    local_1c = local_1c + 1;
  }
  return;
}

kalo dilihat-lihat, fungsi main() hanya memanggil fungsi encrypt(), dalam file binary saya juga tidak menemukan fungsi-fungsi yang berkaitan dengan decryptnya nya kalo di sederhankan fungsi encryptnya kedalam versi python

def encrypt(flag):
    panjang_flag = len(flag)
    i = 0
    enc_flag = []
    
    while(panjang_flag > i):
        shift_var = i >> 0x1f
        ord_flag = ord(flag[i])
        if ord_flag < ord('A') or ord('Z') < ord_flag:
            if ord_flag < ord('a') or ord('z') < ord_flag:
                if ord_flag < ord('0') or ord('9') < ord_flag:
                    cc = ord_flag - 0xf
                    enc_flag.append(cc)
                else:
                    cc = (ord_flag + 1) - ((i + (shift_var >> 0x1d) & 7) - (shift_var >> 0x1d))
                    enc_flag.append(cc)
            else:
                cc = ord_flag + 1 + ((i + (shift_var >> 0x1c) & 0xf) - (shift_var >> 0x1c))
                enc_flag.append(cc)
        else:
            cc = (ord_flag + 1) - ((i + (shift_var >> 0x1b) & 0x1f) - (shift_var >> 0x1b))
            enc_flag.append(cc)
        i+=1
    return enc_flag

setelah di cari-cari kemungkinan flag sebenarnya ada di fungsi undefined8 gqIBObWeQSulobiTtXtNJbboY(undefined8 param_1,int param_2) karena pada fungsi ini ada beberapa inisialisasi karakter dalam bentuk hexadecimal yang tidak ditemukan di fungsi yang lainnya.

gdb-peda$ pd gqIBObWeQSulobiTtXtNJbboY
Dump of assembler code for function gqIBObWeQSulobiTtXtNJbboY:
   0x00000000000016cc <+0>:     endbr64 
   0x00000000000016d0 <+4>:     push   rbp
   0x00000000000016d1 <+5>:     mov    rbp,rsp
   0x00000000000016d4 <+8>:     sub    rsp,0xe0
   0x00000000000016db <+15>:    mov    rax,QWORD PTR fs:0x28
   0x00000000000016e4 <+24>:    mov    QWORD PTR [rbp-0x8],rax
   0x00000000000016e8 <+28>:    xor    eax,eax
   0x00000000000016ea <+30>:    mov    DWORD PTR [rbp-0xe0],0x44
   0x00000000000016f4 <+40>:    mov    DWORD PTR [rbp-0xdc],0x54
   0x00000000000016fe <+50>:    mov    DWORD PTR [rbp-0xd8],0x45
   0x0000000000001708 <+60>:    mov    DWORD PTR [rbp-0xd4],0x50
   0x0000000000001712 <+70>:    mov    DWORD PTR [rbp-0xd0],0x6c
   0x000000000000171c <+80>:    mov    DWORD PTR [rbp-0xcc],0x79
   0x0000000000001726 <+90>:    mov    DWORD PTR [rbp-0xc8],0x7b
   0x0000000000001730 <+100>:   mov    DWORD PTR [rbp-0xc4],0x2a
   0x000000000000173a <+110>:   mov    DWORD PTR [rbp-0xc0],0x79
   0x0000000000001744 <+120>:   mov    DWORD PTR [rbp-0xbc],0x50
   0x000000000000174e <+130>:   mov    DWORD PTR [rbp-0xb8],0x77
   0x0000000000001758 <+140>:   mov    DWORD PTR [rbp-0xb4],0x2e
   0x0000000000001762 <+150>:   mov    DWORD PTR [rbp-0xb0],0x2d
   0x000000000000176c <+160>:   mov    DWORD PTR [rbp-0xac],0x79
   0x0000000000001776 <+170>:   mov    DWORD PTR [rbp-0xa8],0x2c
   0x0000000000001780 <+180>:   mov    DWORD PTR [rbp-0xa4],0x7e
   0x000000000000178a <+190>:   mov    DWORD PTR [rbp-0xa0],0x3a
   0x0000000000001794 <+200>:   mov    DWORD PTR [rbp-0x9c],0x50
   0x000000000000179e <+210>:   mov    DWORD PTR [rbp-0x98],0x33
   0x00000000000017a8 <+220>:   mov    DWORD PTR [rbp-0x94],0x78
   0x00000000000017b2 <+230>:   mov    DWORD PTR [rbp-0x90],0x50
   0x00000000000017bc <+240>:   mov    DWORD PTR [rbp-0x8c],0x76
   0x00000000000017c6 <+250>:   mov    DWORD PTR [rbp-0x88],0x30
   0x00000000000017d0 <+260>:   mov    DWORD PTR [rbp-0x84],0x2d
   0x00000000000017da <+270>:   mov    DWORD PTR [rbp-0x80],0x7e
   0x00000000000017e1 <+277>:   mov    DWORD PTR [rbp-0x7c],0x6e
   0x00000000000017e8 <+284>:   mov    DWORD PTR [rbp-0x78],0x2f
   0x00000000000017ef <+291>:   mov    DWORD PTR [rbp-0x74],0x6f
   0x00000000000017f6 <+298>:   mov    DWORD PTR [rbp-0x70],0x2d
   0x00000000000017fd <+305>:   mov    DWORD PTR [rbp-0x6c],0x72
   0x0000000000001804 <+312>:   mov    DWORD PTR [rbp-0x68],0x2e
   0x000000000000180b <+319>:   mov    DWORD PTR [rbp-0x64],0x50
   0x0000000000001812 <+326>:   mov    DWORD PTR [rbp-0x60],0x6f
   0x0000000000001819 <+333>:   mov    DWORD PTR [rbp-0x5c],0x30
   0x0000000000001820 <+340>:   mov    DWORD PTR [rbp-0x58],0x7a
   0x0000000000001827 <+347>:   mov    DWORD PTR [rbp-0x54],0x50
   0x000000000000182e <+354>:   mov    DWORD PTR [rbp-0x50],0x6b
   0x0000000000001835 <+361>:   mov    DWORD PTR [rbp-0x4c],0x2c
   0x000000000000183c <+368>:   mov    DWORD PTR [rbp-0x48],0x6a
   0x0000000000001843 <+375>:   mov    DWORD PTR [rbp-0x44],0x7d
   0x000000000000184a <+382>:   mov    DWORD PTR [rbp-0x40],0x36
   0x0000000000001851 <+389>:   mov    DWORD PTR [rbp-0x3c],0x50
   0x0000000000001858 <+396>:   mov    DWORD PTR [rbp-0x38],0x33
   0x000000000000185f <+403>:   mov    DWORD PTR [rbp-0x34],0x80
   0x0000000000001866 <+410>:   mov    DWORD PTR [rbp-0x30],0x50
   0x000000000000186d <+417>:   mov    DWORD PTR [rbp-0x2c],0x30
   0x0000000000001874 <+424>:   mov    DWORD PTR [rbp-0x28],0x30
   0x000000000000187b <+431>:   mov    DWORD PTR [rbp-0x24],0x2f
   0x0000000000001882 <+438>:   mov    DWORD PTR [rbp-0x20],0x34
   0x0000000000001889 <+445>:   mov    DWORD PTR [rbp-0x1c],0x6f
   0x0000000000001890 <+452>:   mov    DWORD PTR [rbp-0x18],0x65
   0x0000000000001897 <+459>:   mov    DWORD PTR [rbp-0x14],0x70
   0x000000000000189e <+466>:   mov    DWORD PTR [rbp-0x10],0x7e
   0x00000000000018a5 <+473>:   mov    DWORD PTR [rbp-0xc],0x6e
   0x00000000000018ac <+480>:   lea    rdi,[rip+0xec5]        # 0x2778
   0x00000000000018b3 <+487>:   call   0x1189 <encrypt>
   0x00000000000018b8 <+492>:   mov    eax,0x0
   0x00000000000018bd <+497>:   mov    rdx,QWORD PTR [rbp-0x8]
   0x00000000000018c1 <+501>:   xor    rdx,QWORD PTR fs:0x28
   0x00000000000018ca <+510>:   je     0x18d1 <gqIBObWeQSulobiTtXtNJbboY+517>
   0x00000000000018cc <+512>:   call   0x1090 <__stack_chk_fail@plt>
   0x00000000000018d1 <+517>:   leave  
   0x00000000000018d2 <+518>:   ret    
End of assembler dump.

kalo di coba jalanin dan ngasi breakpoint di beberapa bagian

gdb-peda$ b *main
Breakpoint 1 at 0x1f27
gdb-peda$ b *gqIBObWeQSulobiTtXtNJbboY+480
Breakpoint 2 at 0x18ac
gdb-peda$ r
gdb-peda$ jump *gqIBObWeQSulobiTtXtNJbboY

dan memerphatikan stack pada fungsi gqIBObWeQSulobiTtXtNJbboY()

0000| 0x7fffffffdee0 --> 0x5400000044 ('D')
0008| 0x7fffffffdee8 --> 0x5000000045 ('E')
0016| 0x7fffffffdef0 --> 0x790000006c ('l')
0024| 0x7fffffffdef8 --> 0x2a0000007b ('{')
0032| 0x7fffffffdf00 --> 0x5000000079 ('y')
0040| 0x7fffffffdf08 --> 0x2e00000077 ('w')
0048| 0x7fffffffdf10 --> 0x790000002d ('-')
0056| 0x7fffffffdf18 --> 0x7e0000002c (',')

jadi bisa dipastikan flag yang asli ada dalam fungsi ini dalam bentuk ter-enkrip, jika kita keluarkan semua stringnya, karena panjang ruang untuk realflag ini sub  rsp,0xe0 = 212 dalam decimal, jadi coba aja keluarin semua value dalam memory dari rentang 0x7fffffffdee0 s/d 0x7fffffffdee0 + 0xe0

gdb-peda$ x/212s $rsp
0x7fffffffdee0: "D"
0x7fffffffdee2: ""
0x7fffffffdee3: ""
0x7fffffffdee4: "T"
0x7fffffffdee6: ""
0x7fffffffdee7: ""
0x7fffffffdee8: "E"
0x7fffffffdeea: ""
0x7fffffffdeeb: ""
0x7fffffffdeec: "P"
0x7fffffffdeee: ""
0x7fffffffdeef: ""
0x7fffffffdef0: "l"
....
....
0x7fffffffdfb3: ""
0x7fffffffdfb4: "n"

atau sama dengan

DTEPly{*yPw.-y,~:P3xPv0-~n/o-r.Po0zPk,j}6P300/4oep~n

karena realflag kemungkinan sudah ketemu, dan tidak ditemukan juga fungsi untuk decrypt, jadinya di brute aja, berhubung karena fungsi encrypt() sudah ada.

import sys
import time
c = [0x44,0x54,0x45,0x50,0x6c,0x79,0x7b,0x2a,0x79,0x50,0x77,0x2e,0x2d,0x79,0x2c,0x7e,0x3a,0x50,0x33,0x78,0x50,0x76,0x30,0x2d,0x7e,0x6e,0x2f,0x6f,0x2d,0x72,0x2e,0x50,0x6f,0x30,0x7a,0x50,0x6b,0x2c,0x6a,0x7d,0x36,0x50,0x33,0x80,0x50,0x30,0x30,0x2f,0x34,0x6f,0x65,0x70,0x7e,0x6e]
enc_flag = ''.join([chr(x) for x in c])
def enc(flag):
    panjang_flag = len(flag)
    i = 0
    enc_flag = []
    
    while(panjang_flag > i):
        shift_var = i >> 0x1f
        ord_flag = ord(flag[i])
        if ord_flag < ord('A') or ord('Z') < ord_flag:
            if ord_flag < ord('a') or ord('z') < ord_flag:
                if ord_flag < ord('0') or ord('9') < ord_flag:
                    cc = ord_flag - 0xf
                    enc_flag.append(cc)
                else:
                    cc = (ord_flag + 1) - ((i + (shift_var >> 0x1d) & 7) - (shift_var >> 0x1d))
                    enc_flag.append(cc)
            else:
                cc = ord_flag + 1 + ((i + (shift_var >> 0x1c) & 0xf) - (shift_var >> 0x1c))
                enc_flag.append(cc)
        else:
            cc = (ord_flag + 1) - ((i + (shift_var >> 0x1b) & 0x1f) - (shift_var >> 0x1b))
            enc_flag.append(cc)
        i+=1
    return enc_flag
printable = 'abcdefgijklmnopqrstuvwxyz0123456789{}_?!'
p = 'CTFR{'
for z in range(55):
    for a in printable:
        e = enc(p + a)
        pp = ''.join([chr(x) for x in e])
        if pp == enc_flag[:len(p) + 1]:
            p+=a
            sys.stdout.write('\r' + p)
            break

dan hasilnya

CTFR{st0p_l00k1n9_4t_p53ud0c0d3_n0w_f0cu5_4t_4553mbly}
writeup ctf Reverse
Read More

Writeup CTFR 1000 Jam

Diberikan sebuah link ke website dengan alamat https://web.ctf.rasyidmf.com/chal21/, pada website tersebut jika diperhatikan source nya, terdapat barisan kode javascript Promise, sesuai deskripsi challengenya, kita diharuskan membaypass setTimeout() agar fungsinya bisa dijalankan tanpa harus menunggu x milidetik.

Read More

Writeup CTFR Obfuscate .NET

Dari deskripsi dan judul Challengenya sudah jelas jika aplikasinya di-obfuscate, jadi akan sangat sulit jika mereversenya dalam kondisi ter-obfuscate, saya menggunakan beberapa tool untuk menyelsaiakan challenge ini, pertama saya menggunakan tools dengan nama de4dot tetapi sayang nya repo tersebut sudah diarsipkan oleh siempunya, jadi harus compile fork dulu kemudian compile ulang untuk bisa menggunakan https://github.com/khairu-aqsara/de4dot/ kemudian menggunakan tools https://devextras.com/decompiler/ untuk yang ini banyak pilihan, bisa menggunakan decompiler lain juga