Pull to refresh

Comments 28

Он, вроде, очевидным образом открывался.
По моему

$_GET[0]($_GET[1] )

получается всё же менее заметен. Или это такая фишка, зашифровать, чтобы не был понятен смысл кода, который всё равно удалят?
Статический анализ может заметить вызов функции из $_GET, что очевидно не безопасно. Обфускация выше это умело скрывает. Хотя, человек взглянув на подобный код, конечно задумается а зачем он тут. Зараза должна прятать себя достаточно глубоко, куда человек не полезет.
Этот эксплойт достоин почетного места в залах славы JAPH или IOCCC. А еще — отлично показывает, почему постепенно набирает популярность использование контрактов.
Кстати, ещё вот забавное про PHP:
$a = "2d9"; $a++; $a++; echo $a; → 3
$a = "2d9"; $a+=2; echo $a; → 4
$a = "2d9"; $a++; echo $a; → 2e0
Язык с динамической типизацией :)
UFO just landed and posted this here
www.php.net/manual/ru/language.operators.increment.php

PHP следует соглашениям Perl (в отличие от С) касательно выполнения арифметических операций с символьными переменными. Например, в PHP и Perl $a = 'Z'; $a++; присвоит $a значение 'AA', в то время как в C a = 'Z'; a++; присвоит a значение '[' (ASCII значение 'Z' равно 90, а ASCII значение '[' равно 91). Следует учесть, что к символьным переменным можно применять операцию инкремента, в то время как операцию декремента применять нельзя, кроме того, поддерживаются только ASCII символы (a-z и A-Z). Попытка инкремента/декремента других символьных переменных не будет иметь никакого эффекта, исходная строка останется неизменной.


После инкремента получаем 2e0, а это уже не строковый тип, а числовой (http://www.php.net/ru/language.types.float.php)
Инкремент числовых переменных уже действует по правилу:
$a++ Возвращает значение $a, затем увеличивает $a на единицу.

UFO just landed and posted this here
Как то слишком сложно расшифровываете. Проще же можно всегда.
Господа минусующие, если вы видите обфусцированный код, не нужно идти в лоб, начать надо с evalhook ( или искать конструкции похожие на eval, их видно на глаз, что то типа $dsdgdg($fsfdsfs) )
Если не как в данном примере не используется эта или похожая функция, можно запустить код в отладчике, и посмотреть значение каждой переменной, а не высчитывать все вручную.
пример
image
В данном случае всего 11 строк, но их может быть и 200 и 300.
Неоднократно на различных CTF подобный код деобфусцировал в обычном отладчике.
Вообще самый сложный и интересный кусок который мне приходилось деобфусцировать выглядел вот так.

function b($b) {return eval(Ü瑈©²ÓÒœÄ ¬žó¶é²îŒ–‰…ú í©¦Î²Œ×ª±§èù伦¡®Óð¿¿àšÒ ڊоßÁÜ•ï͵þë™Ä–þ¶±¤³ŒÀåòÈàÙ¡‰¿¸–¦õðö̼Š‰ßº‘ìØÚåàÇÐÑ‘ÊÛ‰âä þŠéÁÔÛ’ÈÕÑ Ï„ªüä±µÑÛÏÉ^®‚åýÛÜó¡è¶ÿÞûƒÓˆÆÆáò¼‰ÕÚÒ¼š´îûšŸÁÕÎÓć°•ÖÓȲ¡Ô¨æµÐ÷å¾¼ÂõœÑÚ¯í¿ ÆÐþÏ›®œÆð¼¡ÜΨúÊÚåÒ‡ØÒ®² ö);}
А тут точно кодировка правильная? Что-то не сильно похоже на валидный код.
Опкод внутри исходника, пока копировал само собой часть байтов потерялась. Да и запустится такое не везде.

Вот разбор задания одной из команд, для того чтобы понять, что находится конкретно в этой строке использовался Vulcan Logic Decompiler (php opcode disassembler)
codezen.fr/2012/10/19/hackyou-ctf-web-300-rng-of-ultimate-security-writeup/
довольно интересный материал.
Изначальная концепция (шаманство с преобразованиями) почему-то ассоциируется у меня с названием другого языка программирования — brainfuck :)
Автору статьи, браво! И плюс за пытливость и настойчивость :)
Следующая задача — написать транслятор нормального кода в такой, чтобы не обфусцировать руками.
Прошу прощения за невежество, а что должно получиться при вызове
$_GET[0]($_GET[1] );
?
example.com/script.php?0=function&1=argument

что-то вроде этого, я считаю

т. е. в первом аргументе передаём имя функции, во втором аргумент(ы), который(е) будет(ут) ей передан(ы).

а $_GET[0]($_GET[1] ); превращается в:

function( argument);
По идее тогда:
example.com/script.php?0=system&1=ls -la
Будет:
system(«ls -la»)

Поправьте, если что.
именно так

Хотя тут уместнее будет использовать eval, и аргументом ему можно передать что угодно.
Сработало! Спасибо, не знал, что в php и так можно функции вызывать
На самом деле недолго. Почти месяц искал свободное время, а в итоге около полутора часов.
Sign up to leave a comment.

Articles