Перейти к содержанию

Небольшой UnlockMe для тех кому нечем заняться


Рекомендуемые сообщения

Небольшая задачка, чтобы проверить свою внимательность и навыки в чтении и понимании инструкции.

 

Условия задачи:

-Нельзя патчить байты.

 

Необходимо:

Ввести правильный пароль и получить надпись об успешном выполнении, и написать мне как вы решили и какой пароль ввели.

 

Ничего не шифрованно, не сжато, нет никаких анти-отладочных трюков.

Если понравится в следующий раз постараюсь сделать что-нибудь по сложнее и первый кто решил получит игру в стим.

 

В версии V2 особых изменений нет, задание остается тоже, только функции уже стали виртуальными на счет них можно посмотреть тут, это немного ухудшит читабельность и поиск соответственно. 

 

Всем удачи!

 

v1

Облако

UnlockMe.exe

VirusTotal

 

v2

Облако

UnlockMe_V2.exe

VirusTotal

DaokzzCTLIA.jpg

Изменено пользователем partoftheworlD
  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

Нашел, где используется строка "Hello what is your name?":

Скрытый текст

f2baa81126974359d49b3702961879ee.png

"Гуляя" по этому участку кода выяснил, что сравнение введенного пароля с эталонным происходит при вызове функции:

Скрытый текст

6345ea7232092e3371d6cf442d00fe8d.png

В ней обнаружил, что сравнение введенного пароля с эталонным начинается с 37 символа от начала введенного пароля:

Скрытый текст

88a140cc427e501a4782983e60767602.png

Т.е. первые 36 символов могут быть любыми, а последние 7 символов - "1234567". Например:

Скрытый текст

abc377b1a4e1b38d13f6139b9893a4dd.png

b4261853a0d675de17eca3444f235a5d.png

Ну как, правильно я сделал или нет?

  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

9 часов назад, Egorka сказал:

Ну как, правильно я сделал или нет?

Молодец все правильно, в программе рассчитано использование переполнения буфера для ввода пароля и логина, чтобы перемещаться по структуре и вводить пароль в настоящий буфер. через логин тоже можно попасть в буфер который сравнивается с реальным паролем и решить задачу, но пароль будет длиннее.

 

Вот исходный код в нем некоторые наработки и всякий мусор, так что не ругайте за быдлокод:D

Скрытый текст

#include <windows.h>
#include <iostream>


class anyvalue
{
public:
	virtual ~anyvalue() = default;
	virtual bool m_Win();
	virtual bool m_Exit();

	char m_cName[20] = "";
	char m_cPassword_input[20] = "";
	char JustEmptyBuffer[12] = "";
	char m_cRealBuffer[20] = "";
	char* m_cRealPassword = "1234567";
	WORD m_wState = 0;
};

auto a = new anyvalue;

class trash : anyvalue
{
public:
	/************************************************************************/
	/* Очистка мест под буферы перед использованием                         */
	/************************************************************************/
	virtual bool m_Clean()
	{
		memset(m_cName, 0x00, sizeof(m_cName));
		memset(m_cPassword_input, 0x00, sizeof(m_cPassword_input));
		memset(m_cRealBuffer, 0x00, sizeof(m_cRealBuffer));

		return true;
	}

	/************************************************************************/
	/*    Проверка паролей                                                  */
	/************************************************************************/
	virtual bool Validator()
	{
		if (!strcmp(m_cRealPassword, m_cRealBuffer)) { return true; }
		else { return false; }
	}
};

auto t = new trash;

int main()
{
	if (t -> m_Clean())
	{
		printf_s("Hello what is your name?\n:");
		std::cin >> a -> m_cName;
		if (strlen(a -> m_cName) >= 20) { a -> m_wState = 1; }

		printf_s("\nAnd write your password!\n:");
		std::cin >> a -> m_cPassword_input;
		if (strlen(a -> m_cPassword_input) >= 50) { a -> m_wState = 2; }

		switch (a -> m_wState)
		{
			case 1 :
				printf("Try using a shorter name!\n");
				a -> m_Exit();
				break;
			case 2 :
				printf("Try using a shorter password\n");
				a -> m_Exit();
				break;
		}

		if (t -> Validator()) { a -> m_Win(); }
	}
}

bool anyvalue::m_Win()
{
	printf_s("Well done, now write the solution in profile(@partoftheworlD).");
	m_Exit();
	return true;
}

bool anyvalue::m_Exit()
{
	delete t;
	delete a;
	Sleep(5000);
	exit(1);
	return true;
}

 

 

Изменено пользователем partoftheworlD
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.