First Rev hackyou Врайтап
Райтап написан crmaxx - независимым CTF игроком.
Дан исходный файл rev100_4e4ccaa.cpp
#include <stdio.h>
#include <string.h>
int main() {
char buf[64];
gets(buf);
printf("Congratulations %s is flag\n",buf);
int l = strlen(buf);
if (l * l != 144)
return 1;
unsigned int a = buf[0] | (buf[4] << 8) | (buf[8] << 16);
unsigned int b = buf[1] | (buf[5] << 8) | (buf[9] << 16);
unsigned int c = buf[2] | (buf[6] << 8) | (buf[10] << 16);
unsigned int d = buf[3] | (buf[7] << 8) | (buf[11] << 16);
if (!(((a % 3571) == 2963) && (((a % 2843) == 215)) && (((a % 30243) == 13059))))
return 2;
if (!(((b % 80735) == 51964) && (((b % 8681) == 2552)) && (((b % 40624) == 30931))))
return 3;
if (!(((c % 99892) == 92228) && (((c % 45629) == 1080)) && (((c % 24497) == 12651))))
return 4;
if (!(((d % 54750) == 26981) && (((d % 99627) == 79040)) && (((d % 84339) == 77510))))
return 5;
printf("Congratulations %s is flag\n",buf);
return 0;
}
Необходимо найти флаг
Алгоритм работы программы:
- считываем данные у пользователя (не может быть больше 12 символов)
- на основе полученных данных путём "логических или" и сдвигов на 8 и 16 получаются четыре беззнаковых целочисленных переменные
- эти переменные сравниваются с магическими числами, если равны - это и есть искомый флаг.
Решать будем брутфорсом
Сперва нужно сбрутить четыре беззнаковых целочисленных переменные, а потом сбрутить конкретные символы исходного ключа.
Для решения написал небольшой скрипт
#!/usr/bin/env ruby
def a
i = 0
loop do
break if ((i % 3571) == 2963) && ((i % 2843) == 215) && ((i % 30_243) == 13_059)
i += 1
end
i
end
def b
i = 0
loop do
break if ((i % 80_735) == 51_964) && ((i % 8681) == 2552) && ((i % 40_624) == 30_931)
i += 1
end
i
end
def c
i = 0
loop do
break if ((i % 99_892) == 92_228) && ((i % 45_629) == 1080) && ((i % 24_497) == 12_651)
i += 1
end
i
end
def d
i = 0
loop do
break if ((i % 54_750) == 26_981) && ((i % 99_627) == 79_040) && ((i % 84_339) == 77_510)
i += 1
end
i
end
def buf048(num)
a = 0
(0).upto(255) do
b = 0
(0).upto(255) do
c = 0
(0).upto(255) do
# puts "#{a},#{b},#{c}"
return [a, b, c] if num == a | b « 8 | c « 16
c += 1
end
b += 1
end
a += 1
end
end
buf = []
puts "a=#{a}"
buf[0], buf[4], buf[8] = buf048(a)
puts "buf[0]=#{buf[0]} buf[4]=#{buf[4]} buf[8]=#{buf[8]}"
puts "b=#{b}"
buf[1], buf[5], buf[9] = buf048(b)
puts "buf[1]=#{buf[1]} buf[5]=#{buf[5]} buf[9]=#{buf[9]}"
puts "c=#{c}"
buf[2], buf[6], buf[10] = buf048(c)
puts "buf[2]=#{buf[2]} buf[6]=#{buf[6]} buf[10]=#{buf[10]}"
puts "d=#{d}"
buf[3], buf[7], buf[11] = buf048(d)
puts "buf[3]=#{buf[3]} buf[7]=#{buf[7]} buf[11]=#{buf[11]}"
puts "Congratulations #{buf.pack('C*')} is flag"
Запускаем солвер и получаем искомый ключ
$ ./solver.rb
a=4730967
buf[0]=87 buf[4]=48 buf[8]=72
b=3362099
buf[1]=51 buf[5]=77 buf[9]=51
c=7484236
buf[2]=76 buf[6]=51 buf[10]=114
d=3366731
buf[3]=75 buf[7]=95 buf[11]=51
Congratulations W3LK0M3_H3r3 is flag
- Автор: crmaxx
- Комментарии: 0
- Просмотры: 2426