• XSS.stack #1 – первый литературный журнал от юзеров форума

Крипт сплоитов\связок (js,php)

А реальноли закриптовать файл на лету, чтобы каждый раз выдавался новый файл, но с той же функциональностью, или все связки будут выдавать один и тот же файл?
реально конечно, перед выдачей сплоит просто криптуется рандомным ключем
 
Начал интересоваться альтернативами функции eval() при крипте JS. Нашел два метода:

Код:
<script>
var tmp = alert(); //код, который необходимо выполнить
window[tmp];
</script>
Код:
<script>
var tmp = alert(); //код, который необходимо выполнить
var tmpFnc = new Function(tmp);
tmpFunc();
</script>

Какие могут быть подводные камни с применением данных методик, например, при крипте выдачи сплойта? И какие ещё из них вам известны?
 
Код:
new window["Function"]("alert(123)")();
setTimeout("alert(123)",1);
проблемы могут быть с нарушением контекста, где то он глобальный(window), где-то локальный, решается использованием переменных через window["variableName"].
 
иногда в процессе требуется спрятать какие то отдельные небольшие строки, а всякие 'Str' + 'ing' уже давно не катят ( катят местами но делать в ручную уже ломает ), в итоге приходилось делать небольшие обфускаторы. если вначале это было что то совсем простое, типа

Код:
function get_sym(str, num) {
	return str[num];
}
function get_str_arr(str,arr) {
	var ret = '';
	for (var cnt = 0; cnt < arr.length; cnt ++ ) {
  ret += get_sym( str, arr[cnt] );
	}
	return ret;
}
var var_fromCharCode = get_str_arr('ohafkqErN8eiC1wmUzdJ97',[3,7,0,15,12,1,2,7,12,0,18,10]);

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

<?php

ini_set('max_execution_time',5);

echo '<pre>';
$str = $_GET['str'];
echo $str.'

';


// string array
$str = str2arr2($str);
echo 'str: '.implode(',', $str).'
';

// unique array
$uni = array_unique($str);
echo 'uni: '.implode(',', $uni).'
';

define(SINGLE_LET, 0);
define(IF_LET, 1);
define(STRING_LET, 2);

// letters array
$sux = "";
$let = array();
foreach($uni as $a) {
$let[$a]['single'] = is_single($a, $str);
$let[$a]['method'] = rnd(3);
if ($let[$a]['method'] == STRING_LET) $sux .= $a;
$let[$a]['push'] = -1;
}

// print_r($let);
// echo '
';

// for STRING_LET
// echo 'sux: '.$sux.'
';

// string len
$len = count($str);
echo 'len: '.$len.'
';

// return array
$ret = array();
// push index
$push = 1;


// block array
$block = array_fill(0, $len, 0);
$blocks = 1;

// echo implode(',', $str).'
';
// echo implode(',', $block).'
';
echo '
';

while(have_let($str)) {

// get this letter
$pos = get_rnd_pos($str);

// get next letter
$next = -1;
$l_r = 0;
$roll = roll();

// letter right
if ($pos == 0)
{
$next = $pos + 1;
$l_r = -1;
}
// letter left
elseif ($pos == ($len - 1))
{
$next = $pos - 1;
$l_r = 1;
}
// letter right
elseif ($roll)
{
$next = $pos + 1;
$l_r = -1;
}
// letter left
elseif (!$roll)
{
$next = $pos - 1;
$l_r = 1;
}
// letter pos error!!!
//else die('WTF!!!');

/*

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

надо

взять this если его нету в стеке, запушить его
взять next если это симовол и его нету в стеке запушить его
если это блок то получить его номер

к значение this cправа или с лева прибавить значение next ( или блока в котором он находится )
результат поместить либо в новую переменную блока ( если было две буквы )
и запушить её
либо в переменную блока где расспологалось next

в конце соединить все блоки

*/

echo '// this: ['.$pos.']='.$str[$pos].'
';
$t_p = gpush($pos);
if ($t_p == -1)
{
if (!let_single($pos) || roll())
{
// push letter
$t_p = spush($pos);
$ret[] = 'var '.gvar($t_p).' = '.obf_let($pos).';';

PRINT_LAST();
}
else
{
echo 'Not define
';
}
}

if (is_sym($next))
{
echo '// next: ['.$next.']='.$str[$next].'
';
// next is letter
$n_p = gpush($next);
if ($n_p == -1)
{
if (!let_single($pos) || roll())
{
// push letter
$n_p = spush($next);
$ret[] = 'var '.gvar($n_p).' = '.obf_let($next).';';

PRINT_LAST();
}
else
{
echo 'Not define
';
}
}

$b_p = ablock($pos, $next);

$t_v = ($t_p == -1 ? obf_let($pos) : gvar($t_p));
$n_v = ($n_p == -1 ? obf_let($next) : gvar($n_p));
// if next letter left
if ($l_r == 1)
{
$ret[] = 'var '.gbvar($b_p).' = '.$n_v.' + '.$t_v.';';
}
// if next letter right
elseif ($l_r == -1)
{
$ret[] = 'var '.gbvar($b_p).' = '.$t_v.' + '.$n_v.';';
}
// letter pos error!!!
//else die('WTF!!!');

PRINT_LAST();
PRINT_STR();
PRINT_BLOCK();
}
else
{
// next is block
$b_p = gblock($next);
echo '// next: ['.$next.']='.gbvar($b_p).'
';
ablock($pos, $next, $b_p);

$t_v = ($t_p == -1 ? obf_let($pos) : gvar($t_p));
// if next block left
if ($l_r == 1)
{
$ret[] = gbvar($b_p).' += '.$t_v.';';
}
// if next block right
elseif ($l_r == -1)
{
$ret[] = gbvar($b_p).' = '.$t_v.' + '.gbvar($b_p).';';
}
// letter pos error!!!
//else die('WTF!!!');

PRINT_LAST();
PRINT_STR();
PRINT_BLOCK();
}

echo '
';

shave($pos);
shave($next);
}

$ret[] = MERGE_BLOCKS();

echo "function get_".$_GET['str']."() {
";
echo implode("
",$ret);
echo "
}
";

echo "<script>";
echo "function get_".$_GET['str']."() {\n";
echo implode("\n",$ret);
echo "}\n";
echo "alert(get_".$_GET['str']."());\n";
echo "</script>";

function MERGE_BLOCKS()
{
global $block;
$ret = 'return ';
$prev = 0;
$first = true;
foreach ($block as $b)
{
if ($b != $prev)
{
$prev = $b;
$ret .= ($first ? 'bl_'.$b : ' + bl_'.$b);
$first = false;
}
}
$ret .= ';';
return $ret;
}

function let_single($a)
{
global $let, $push;
return ($let[glet($a)]['single'] == 1 ? 1 : 0);
}

function obf_let($p)
{
global $str, $push;

if ($push == 1) return "'".$str[$p]."'";
switch (rnd(3))
{
// '' + 'e' / 'e' + ''
case 0:
return "'".$str[$p]."'";

case 1:
return "(".gvar(mt_rand(1, $push - 1))." == ".mt_rand(1,10)." ? ".mt_rand(1,10)." : '".$str[$p]."')";

case 2:
return "(".gvar(mt_rand(1, $push - 1))." != ".mt_rand(1,10)." ? '".$str[$p]."' : ".mt_rand(1,10).")";

}
}

function PRINT_STR()
{
global $str;
echo '// '.implode(',', $str).'
';
}

function PRINT_LAST()
{
global $ret;
echo $ret[count($ret) - 1].'
';
}

function PRINT_BLOCK()
{
global $block;
echo '// '.implode(',', $block).'
';
}

function gblock($a)
{
global $block;
return $block[$a];
}

function ablock($f, $s, $b = 0)
{
global $block, $blocks;
if ($b == 0)
{
$b = $blocks;
$blocks ++;
}
$ret = $b;
$block[$f] = $b;
$block[$s] = $b;
return $ret;
}

function is_sym($a)
{
global $str;
return $str[$a] != '~';
}

function shave($a) {
global $str;
$str[$a] = '~';
}

function have_let($arr)
{
foreach($arr as $a) {
if ($a != '~') return true;
}
return false;
}

function gbvar($a)
{
return 'bl_'.$a;
}

function gvar($a)
{
return 'va_'.$a;
}

function glet($pos) {
global $str;
return $str[$pos];
}

function spush($a)
{
global $let, $push;
$ret = $push;
$let[glet($a)]['push'] = $push;
$push ++;
return $ret;
}

function gpush($pos) {
global $let;
return $let[glet($pos)]['push'];
}

function rnd($num) {
return mt_rand() % $num;
}

function roll() {
return rnd(2);
}

function get_rnd_pos($arr) {
while(true)
{
$pos = array_rand($arr);
if ($arr[$pos] == '~') continue;
if (roll()) return $pos;
}
}

function str2arr2($str) {
preg_match_all("/./s",$str,$arr);
return $arr[0];
}

function is_single($let, $arr) {
$ret = 0;
for ($i = 0;$i < count($arr);$i++) {
if ($arr[$i] == $let) $ret ++;
}
return $ret;
}

function get_rnd_str($let, $len, &$idx)
{
$sux = "0123456789abcdefghijklmnopqrstuvwxyz";
if ($no_let) $sux = preg_replace('['.$let.']','',$sux);
$ret = substr(str_shuffle($sux),0,$len);
$ret = str_shuffle($ret.$let);
$idx = strpos($ret, $let);
return $ret;
}

?>

в итоге получаются вот такие вот штуки

Код:
var va_1 = (va_1 == 9 ? 10 : 'o');
var va_2 = (va_1 != 4 ? 'm' : 8);
var bl_1 = va_1 + va_2;
var va_3 = (va_1 != 10 ? 'C' : 6);
var va_4 = 'h';
var bl_2 = va_3 + va_4;
var va_5 = 'r';
var va_6 = 'f';
var bl_3 = va_6 + va_5;
var bl_4 = va_1 + 'd';
var va_7 = (va_5 == 1 ? 7 : 'a');
var bl_5 = va_7 + va_5;
bl_4 += (va_7 != 9 ? 'e' : 10);
bl_4 = va_3 + bl_4;
return bl_3 + bl_1 + bl_2 + bl_5 + bl_4;

Код:
var va_1 = 'o';
var va_2 = (va_1 == 1 ? 9 : 'd');
var bl_1 = va_1 + va_2;
var bl_2 = 'h' + (va_1 == 5 ? 6 : 'a');
var va_3 = (va_3 == 9 ? 10 : 'r');
var bl_3 = va_3 + va_1;
bl_3 = (va_1 == 10 ? 10 : 'f') + bl_3;
bl_3 += (va_1 == 2 ? 10 : 'm');
var va_4 = (va_3 != 4 ? 'C' : 8);
bl_3 += va_4;
bl_1 = va_4 + bl_1;
bl_1 = va_3 + bl_1;
bl_1 += (va_4 != 5 ? 'e' : 1);
return bl_3 + bl_2 + bl_1;
 
el-
Ну вот... все же мой пост начал приносить свои плоды:)

в итоге это конечно тоже перестало помогать
Вы имеете ввиду что это палят?
По такому сигнатуру точно не составить... там эмуляция и\или эвристика срабатывает.

p.s. Очень даже нормальный код на выходе из под офбускатора вашего, особенно если еще между строк произвольного кол-ва мусор генерить...
 
demien, оно помогает но от генерации к генерации все чаще попадаются какие то маски которые не нравятся АВ, уже не помню точно какие и каким АВ, т.к. не юзаю уже. в принципе правьте функу obf_let добавляйте туда разные варианты обфускации букв, можно и мусор конечно ( но это я как то не любитель ), главное только дергать такие функи один раз, все такие их работа занимает какое то время и если их юзать в цикле при расшифровке то это может сказаться и на пробиве.

Ну вот... все же мой пост начал приносить свои плоды
пока что не видно этих самых плодов от вас ):
 
ммм, я не имею большого опыта да и код не вижу под хайдом, но мне казалось, что большинство АВ обзавелись эмуляторами js и такие фишки уже не спасают?
 
ммм, я не имею большого опыта да и код не вижу под хайдом, но мне казалось, что большинство АВ обзавелись эмуляторами js и такие фишки уже не спасают?

эмуляция одно, сигнатурный детект и эвристика другое:)
т.е. если биться, то по всем пунктам и направлениям...
самое тру, о чем уже писали выше хукается eval.. т.е. нужно искать обходные пути + припятствие эмуляции.
 
на данный момент эмуль есть у кис и вроде как у софос, причем у кис вообще мощный эмуль а у софоса все что касается строк, т.е. конструкцию типа var v = 'r'; z= 'St' + v +''+'ing'; он сможет собрать, и если эта строка ему не нравится при прочих фактора ( например внутри пдф ) он легко это дело спалит.

то что хукается евал я не вкурсе, т.к. с самого начала старался его не юзать ( ну кроме скажем eval('String') ), как то не очень если заменить евал на алерт и получить чистую выдачу при анализе.

эмуль за частую легко обламывался, у того же киса была целая история с пдфками, когда сначала юзали данные из полей Info, потом из xml, потом через event.target, в мейне ( js выдача непосредственно в браузер ) юзались невалидные методы this.blahblah с try catch. в общем то даже кис не сможет раскрутить весь файл, а делает это только скорее всего какое то время либо до набора балов ( после которых выдает алерт ), т.е. если постараться не давать ему в начале масок для детекта, типа не вызывать выше приведенные функи в начале выдачи ( согласитесь подозрительно что функция возвращает строку 'fromCharCode' ), тогда он может и заткнуться по дороге пока вы подготовите. проблема только что как раз fromCharCode чуть ли одна из самых основных функций при расшифровке ):
 
Пожалуйста, обратите внимание, что пользователь заблокирован
стучи crypton@xmpp.jp (jabber)
уже тогда всем понятно было какой протокол для общения юзаем
Крипт эксплоитов
js/vbs/pdf/swf/java
20$ (за связку)
эх теплые ламповые деньки. и ведь оплату скорее всего на вебмани принимал.
сори за некро. ностальгия чет накатила
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх