Это остановит? (Грабители)


46

Это нить грабителей. Нить полицейских здесь .

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

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

Несколько человек могут публиковать крэки в одной и той же копе, если они разные.

(Если SE преобразовал ваш дублированный ответ в комментарий, вы можете проголосовать по этому запросу )


Ищете необработанные материалы?

fetch("https://api.stackexchange.com/2.2/questions/135363/answers?order=desc&sort=activity&site=codegolf&filter=!.Fjs-H6J36vlFcdkRGfButLhYEngU&key=kAc8QIHB*IqJDUFcjEF1KA((&pagesize=100").then(x=>x.json()).then(data=>{var res = data.items.filter(i=>!i.body_markdown.toLowerCase().includes("cracked")).map(x=>{const matched = /^ ?##? ?(?:(?:(?:\[|<a href ?= ?".*?">)([^\]]+)(?:\]|<\/a>)(?:[\(\[][a-z0-9/:\.]+[\]\)])?)|([^, ]+)).*[^\d](\d+) ?\[?(?:(?:byte|block|codel)s?)(?:\](?:\(.+\))?)? ?(?:\(?(?!no[nt][ -]competing)\)?)?/gim.exec(x.body_markdown);if(!matched){return;}return {link: x.link, lang: matched[1] || matched[2], owner: x.owner}}).filter(Boolean).forEach(ans=>{var tr = document.createElement("tr");var add = (lang, link)=>{var td = document.createElement("td");var a = document.createElement("a");a.innerText = lang;a.href = link;td.appendChild(a);tr.appendChild(td);};add(ans.lang, ans.link);add(ans.owner.display_name, ans.owner.link);document.querySelector("tbody").appendChild(tr);});});
<html><body><h1>Uncracked Submissions</h1><table><thead><tr><th>Language</th><th>Author</th></tr></thead><tbody></tbody></table></body></html>


2
Означает ли это, что разные входные данные (скажем, все входные данные, заканчивающиеся на 2 взломают сообщение полицейского - можете ли вы разные люди опубликовать разные номера, заканчивающиеся на 2?) Или разные семейства входных данных, или разные типы входных данных?
Стивен

1
Несколько человек могут публиковать крэки в одном и том же представлении полицейского ... Пожалуйста, укажите разные .
Деннис

Ответы:


49

Мальболге, дверная ручка

Попробуйте онлайн (спасибо Деннис !)

Вход для Windows: F_⌠1234567890

Вход в систему на основе Linux с использованием ISO-8559-1: F_ô1234567890

Суть того, как работала программа Malbolge, заключается в том, что она зависела от поведения интерпретатора Malbolge, который вызывает бесконечный цикл, если он встречает какую-либо инструкцию, которая не находится между 33 и 126. Программа была сконструирована так, что ваш ввод позволит вам изменять единственная инструкция.

Я изменил интерпретатор, чтобы вывести состояние памяти программы в начале выполнения, а также создать «нормализованный» исходный код, который принимает форму списка кодов операций, которые будут выполняться во время выполнения программы. С помощью этой информации вы можете (медленно) определить, что, хотя программа потребовала 13 входов, только 1-й и 3-й входы действительно имели значение.

Просматривая нормализованный код и дамп памяти (и немного помощи отладчика), я разработал следующее:

a = op (вход 1, 29524)

b = op (вход 3, а)

с = ор (486, б)

d = op (c, 37)

е = д / 4 + д% 3 * 3 ^ 9

должно быть от 33 до 126

Где opнаходится так называемый «триумфальный» «оп», который описан в спецификации. Используя эту информацию, вы можете написать простую программу, которая перебирает возможные входные данные (от 0 до 255) и находит все решения, которые соответствуют вышеуказанным критериям. Я нашел 2219 возможных решений, некоторые из которых, вероятно, не будут работать (вы не можете ввести необходимые символы). В частности, вышеупомянутые входные данные основаны на решении:

(Input 1 = 70, Input 3 = 244)


У меня нет представителя, чтобы комментировать взломанный пост полицейских. Может ли кто-нибудь сделать это для меня?
KBRON111

4
Добро пожаловать в PPCG! Отличная работа! Я думаю, что с этим крэком у вас скоро будет достаточно репутации :)
Стивен

1
Я прокомментировал через. И да, отличная работа; Я наполовину ожидал, что Мальболж продлится неделю!
Ведрак

6
Хорошо сделано! TIO использует UTF-8, но, обернув его в Bash, ваш взлом все еще может быть проверен. tio.run/… Кажется, тебе ничего не нужно, кроме F_ôкак кстати.
Деннис

1
Теперь я снова могу спать
Хуан Тонина


13

JS (ES6), Хуан Тонина

+0,-0

Потребовалось немного заглянуть, Object.isчтобы найти. В основном, +0 === -0поскольку ===проверяет их как числа, и 0конечно, но Object.isвидит +0и -0как разные объекты. Очень умный полицейский :)

Попробуйте онлайн!


Ниндзя получил это, когда я входил. Стреляй.
user3033745

Блин, решил быстрее, чем потратил время на размышления о коде: D
Хуан Тонина

11

Питон, Сифор

class A:
    i = True
    def __eq__(self, a):
        self.i = not self.i
        return self.i

a = A()
f(a)

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


Хотя я полагаю , я мог бы просто определить __eq__для raise...
g.rocket

Я собирался подать с только что вернувшимся 0: р
Джонатан Аллан

@JonathanAllan Как это работает?
Рокет

1
Уверен, просто так class A:__eq__=lambda s,o:0и f(A())делает свою работу.
Джонатан Аллан

1
Ах да, нужно отрицание> _ <
Джонатан Аллан


8

PHP, Сизиф

(-0[0)> deal with it=1

Функция parse_str изменяет пробелы и другие символы на подчеркивания. Если вы поместите [используемый для разделителя массива без закрытия, он изменит его на подчеркивание, но не будет переводить следующие пробелы (я не знаю почему).

Попробуйте онлайн!


WTF ?! Это безумие ...
Veedrac

7

JavaScript (Node.js), Аднан

[]и []похоже на работу. Я перепробовал кучу из них в том числе null, undefined, NaN...

[] >= [] && [] <= [] && [] != [] оценивает как истинное.

Мораль истории: JavaScript странный .

Попробуйте онлайн!


Да, массивы - это просто объекты.
programmer5000

И объекты приводятся в строки для этих типов сравнений.
Конор О'Брайен

7

JavaScript (ES7), Арнаулд

стандарт

"8e7" это решение

var crack_me = (x=0)=>{for(;~x/x.length**3!=-2962963;);}

var key = "8e7"

crack_me(key)
console.log("stopped :)")

мотыга

Не нужно рассчитывать это число, мы можем переопределить lengthсвойство

Это наборы ~x/x.length**3!=-2962963дляfalse

var crack_me = (x=0)=>{for(;~x/x.length**3!=-2962963;);}

var key = {toString:()=>"2962962",length:"1"}

crack_me(key)
console.log("stopped :)")

Приоритет операторов

~ поразрядно не первый

** exponentiation второй

/ division третий


6

Баш, Ведрак

LD_TRACE_LOADED_OBJECTS

Попробуйте онлайн!

Из ld.so(8)справочной страницы:

LD_TRACE_LOADED_OBJECTS

Если установлено (любое значение), программа выдает список своих динамических зависимостей, как если бы она запускалась ldd(1), вместо того, чтобы работать нормально.


Я думал, что это будет длиться дольше! Превосходная работа.
Veedrac

1
@Veedrac: Полагаю, что так как вы указали bash, маловероятно, что вы найдете статически связанные ссылки (например, busybox?) /bin/yes, Но это возможно, и в этом случае этот env var будет проигнорирован.
Питер Кордес

6

Mathematica, Юнг Хван Мин

Unevaluated@Throw@"hammertime"

Понятия не имею, является ли это предполагаемым решением, но оно передает выражение, которое не оценивается, пока не будет указано как # внутри функции, что приведет к немедленному возвращению из функции без какой-либо дальнейшей оценки. Вы можете видеть, что функция на самом деле вызывается (вместо того, чтобы просто генерировать исключение, прежде чем даже вызывать функцию), изменив функцию на:

#0[Print@"stop";#;$IterationLimit=∞]&

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


Бинго! (Я действительно собирался Unevaluated[Abort[]], но то же самое.)
JungHwan Мин


5

Рубин

exit

без перевода строки. 3.send('exit')конечно, не равно 5, но он выполняетKernel#exit :

Инициирует завершение сценария Ruby, вызывая исключение SystemExit

Можно позвонить exitна 3 потому , что :

Модуль Kernel включен в класс Object, поэтому его методы доступны в каждом объекте Ruby [как частные методы].

abort также работает:

Немедленно прервите выполнение, фактически вызвав Kernel.exit (false). Если задано сообщение msg, оно записывается в STDERR до завершения.


5

JavaScript (Node.js) , программист 5000

Уже взломан, но мой немного отличается :) Не хватает представителя, чтобы комментировать в полицейских. Также не стесняйтесь редактировать, чтобы исправить форматирование, мой первый пост здесь.

В основном я устанавливаю __proto__равным функцию, которая бросает. Взятый от просмотра страницы Mozilla для прото. (Извините, низкая репутация, не могу опубликовать ссылку.)

x = {}
let No = function () { throw 'halted' }
x.__proto__ = new No()
f = x=>{while(x.__proto__);}

Попробуйте онлайн!

РЕДАКТИРОВАТЬ: Есть некоторые повторения, так что вот ссылка: Mozilla__proto__


Я прокомментировал полицейского для вас.
Стивен

1
Спасибо! Также спасибо всем за взлеты, думаю, я могу комментировать сейчас!
Хаумед Рахмани

1
Добро пожаловать в PPCG: D
Конор О'Брайен


5

R, Ярко Дуббельдам

function(x)if(is.list(x))return(1)

В первый раз вносите что-либо, так что называйте любые ошибки, которые я допустил в формате.

Уверен, это верно. Просто перемотка is.list (), верно?


Между прочим, у меня нет представителя, чтобы комментировать оригинал, поэтому рука будет оценена, если она действительна.
Преступно-

Комментарий для вас.
TheLethalCoder

Не предполагаемое решение, но работает. Отличная работа.
JAD

5

Javascript, программист 5000

Максимальная длина строки

Использует строку длиной на единицу меньше, чем поддерживает ваш движок. При добавлении "h"в эту строку выдается ошибка. Попробуйте онлайн!

function getAlmostMaxLenStr() {
  var prevBases = [];
  var base = "a";
  try {
    while(true) {
      prevBases.push(base);
      base += base;
    }
  } catch(e) {}
  for (var i = prevBases.length-1; i>=0; --i) {
    try {
      base += prevBases[i];
    } catch (e) {}
  }
  return base;
}
f(getAlmostMaxLenStr());

Блок перекрестного происхождения

Сильно вдохновлен ответом от @ jadkik94 , но работает везде. Создает перекрестный iframe, затем передает .contentWindowуказанный iframe. Это терпит неудачу, когда функция пытается использовать значение из-за безопасности перекрестного источника.

let f=x=>{
  try {
    console.log(x+"h"); // we don't want to lock up your browser, do we ;)
  } catch (e) { console.log("Halted!\n",e); }
}
let iframe=document.createElement("iframe");
const url = location.host.indexOf("google") === -1 ? "https://google.com" : "https://stackexchange.com";
iframe.src=url;
iframe.onload=a=>f(iframe.contentWindow);
document.body.appendChild(iframe);

Примитивная ценность

Вариант .toString()ответов - это просто использует toPrimitiveвместо этого. Он возвращает объект в качестве примитивного значения, которое Javascript не знает, как обрабатывать (поэтому выдает ошибку). Попробуйте онлайн!

f({
  [Symbol.toPrimitive](){return {}}
});

Хорошая работа, но все еще не предназначенное решение! Очень умно!
programmer5000

4

Node.js, Аднан

{}и {}или любые 2 объекта являются двумя входами. Я даже не понимаю, как это работает.

Вот удивительная логика сравнения объектов JS:

console.log({} == {});
console.log({} === {});
console.log({} > {});
console.log({} < {});
console.log(!!{});

console.log({} >= {});
console.log({} <= {});


Да, это было намеченное решение :)
Аднан

4

JavaScript (Вавилонский узел) , Конор О'Брайен

(Репост, случайно положил в полицию.) Не уверен, что предполагалось, но положительные десятичные числа, которые не являются огромными, похоже, работают.

Также я думаю, что я все еще не могу комментировать в Cops.

f(0.1)
console.log('done')

Попробуйте онлайн!


Забыл и об этом, хорошо.
Конор О'Брайен,

4

JavaScript (НЕ node.js) , программист 5000

Это не может быть добавлено, потому что это создает объект, у которого нет toString, потому что новый Setне присущ прототипы из from Object.

вход:

new Set()

Попробуйте онлайн!


Вероятно, это было намеченное решение, с этого момента я буду держать его в голове: P
Стивен,

Извините, это не похоже на работу для меня? Попробуйте онлайн!
Хаумед Рахмани

@HaumedRahmani добавил кнопку попробовать онлайн. Я использовал обезьяну-паука, а не бабел.
Грант Дэвис

Не намеченное решение, но хорошая работа!
programmer5000



4

Python 2, Foon

__import__("os")._exit(0)

То, что написано на банке, в основном.

Попробуйте онлайн.


Интересно, что на TIO это время для меня; под Windows (в частности, с winpty python inputbad.py и вставкой в ​​строку) он действительно завершает работу по желанию ... и да, неудивительно, что моя штиха эксплуатировала бит "input from Python 2 is eval under hood"
Foon

@ Фун Хм, он отлично работает на TIO для меня. Смотрите ссылку в ответе.
Veedrac

Странно ... Я должен был ударить игру , а затем напечатал ввод на моей TIO ссылке и не понял , что это
Foon

Я почти уверен, что это
взламывает

@enderland Только если они оценят ваш вклад, а большинство из них - нет.
Ведрак


4

Питон 3, Сифор

Это было весело Нам нужно type(x) != strпройти проверку, поэтому нам нужно контролировать возвращаемое значение type(). Мы должны переопределить __class__атрибут и заменить его настраиваемым объектом, который расширяется type, __ne__метод которого заменяется на метод, который всегда возвращает false. Это заставляет его пройти проверку типа, но поиск не удастся, потому что oэто не str.

class m(type):
    def __ne__(a,b):
        return False
class c:pass
o=c()
o.__class__=m("",(c,),{})
f(o)

Добро пожаловать на сайт! :)
DJMcMayhem

4

C #, TheLethalCoder

System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

Или любой другой обнуляемый класс.


3

Сетчатка

Новая строка, сопровождаемая 1работами. Я нашел это сразу.


1

Попробуйте онлайн


Ninja'd на минуту
Kritixi Lithos

@ Cowsquack Вопрос говорит, что несколько взломов для одного и того же поста полицейского допускаются.
mbomb007

Я знал, что в качестве первого шага я должен был удалить символы новой строки
PunPun1000

3

JS (ES6)

"   "

Любой символ с кодом меньше 10 должен работать; Я использовал tabсимвол выше, который SE преобразует в пробелы.



Извините :( плюс, я думаю, вам понадобятся кавычки, чтобы он был строкой
Стивен

@ programmer5000, вот и вижу :(
Лохматый

Нет проблем, @StepHen; Суть игры. Я взял цитаты, чтобы быть неявным, но я буду редактировать их.
Shaggy

@ Shaggy Я не знаю, что такое решение, но f(<tab>)правильный синтаксис (пустой ввод), и мы должны были бы различать f(1)и в f("1")любом случае
Стивен


3

cQuents, Step Hen

Все, что следует за пробелом и положительным целым числом. Пробел разделяет входные данные, а дополнительный входной номер становится номером терма для вывода.

Попробуйте онлайн!


Я как раз собирался написать a 1! Вы ниндзя меня: /
Мистер Xcoder

@ Mr.Xcoder Я набрал это на мобильном телефоне, надеясь, что никто не станет меня ниндзя: P
PurkkaKoodari

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.