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;
}

Необходимо найти флаг smile

Алгоритм работы программы:
- считываем данные у пользователя (не может быть больше 12 символов)
- на основе полученных данных путём "логических или" и сдвигов на 8 и 16 получаются четыре беззнаковых целочисленных переменные
- эти переменные сравниваются с магическими числами, если равны - это и есть искомый флаг.

Решать будем брутфорсом wink
Сперва нужно сбрутить четыре беззнаковых целочисленных переменные, а потом сбрутить конкретные символы исходного ключа.

Для решения написал небольшой скрипт

#!/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
скачать dle 10.5фильмы бесплатно

  • Автор: crmaxx
  • Комментарии: 0
  • Просмотры: 529

Добавить комментарий

Вы не авторизованы и вам запрещено писать комментарии. Для расширенных возможностей зарегистрируйтесь!