神盾暗号解読教程(一)PHP変数使用可能文字


まずphp変数の命名規則について説明します。Baiduは次の大柄をつかみます。(1)PHPの変数名は大文字と小文字を区別します。(2)変数名はドル記号で始まる必要があります。3)変数名の先頭には、次の線があります。(4)変数名は、数字で始まることができません。
実はすべてのプログラムは似たようなネーミング仕様です。1.変数の最初の文字はアルファベットか_が一番いいです。数字で始まることはできません。2番目の文字から数字、アルファベット、_
はい、ほぼそうです。でも、これは私たちが話すポイントではありません。今日はPHP変数の利用可能な文字について話します。数字だけではなく、アルファベット、_はい。
先日QQで友達からshellをもらいました。暗号化されていて、文字化けしていますが、上にはコメントがあります。いくつかの比較的にまれな知識点を使っていますが、その中で一番明らかなのは変数名ですので、今日はまず変数から話します。
もちろんネットでも権威のある素料は見つけられませんでした。PHPの変数名は文字の情報が使えますので、自分でテストするしかないです。英語が下手で、Googleが有利な証拠に行けないです。まず私の使っている方法を見に来てください。

<?php
if ($_POST) {
    $chr = chr($_POST['chr']);
    eval('$'.$chr."=1;");
    echo 'ok';
    exit;
}
?>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.js"></script>
</head>
<body>
    <script>
    for(var i = 0x00; i <= 0xFF; i++) { // 0x00 - 0xFF  255
        $.ajaxSettings.async = false; // ,
        $.post( "?", {chr: i}, (function (data) { // post i php
            data === 'ok' && console.log( "\\x"+(i).toString(16) ); // ok ,
        });
    }
    </script>
</body>
</html>
コードはまだ簡単ですが、PHPの部分は変数名として各文字の実行結果を解析するだけでオーバーフローが発生しますか?たとえば文字aのように解析します。  eval('$a=1;')  このような結果は間違いなく大丈夫ですので、異常を出さずに返します。結果はok文字です。文字-なら解析します。  eval('^-=1;);  これは明らかに間違っていますので、投げ出します。  PHPパースerror:syntax error、unexpected'、expecting T_VALLIABLE or''  およびok文字。次のajax部分は、戻り結果が「ok」かどうかを利用して、有効な変数名かを判断します。実行後の結果を見てみましょう。

"\x41, \x42, \x43, \x44, \x45, \x46, \x47, \x48, \x49, \x4a, \x4b, \x4c, \x4d, \x4e, \x4f, \x50, \x51, \x52, \x53, \x54, \x55, \x56, \x57, \x58, \x59, \x5a, \x5f, \x61, \x62, \x63, \x64, \x65, \x66, \x67, \x68, \x69, \x6a, \x6b, \x6c, \x6d, \x6e, \x6f, \x70, \x71, \x72, \x73, \x74, \x75, \x76, \x77, \x78, \x79, \x7a, \x7f, \x80, \x81, \x82, \x83, \x84, \x85, \x86, \x87, \x88, \x89, \x8a, \x8b, \x8c, \x8d, \x8e, \x8f, \x90, \x91, \x92, \x93, \x94, \x95, \x96, \x97, \x98, \x99, \x9a, \x9b, \x9c, \x9d, \x9e, \x9f, \xa0, \xa1, \xa2, \xa3, \xa4, \xa5, \xa6, \xa7, \xa8, \xa9, \xaa, \xab, \xac, \xad, \xae, \xaf, \xb0, \xb1, \xb2, \xb3, \xb4, \xb5, \xb6, \xb7, \xb8, \xb9, \xba, \xbb, \xbc, \xbd, \xbe, \xbf, \xc0, \xc1, \xc2, \xc3, \xc4, \xc5, \xc6, \xc7, \xc8, \xc9, \xca, \xcb, \xcc, \xcd, \xce, \xcf, \xd0, \xd1, \xd2, \xd3, \xd4, \xd5, \xd6, \xd7, \xd8, \xd9, \xda, \xdb, \xdc, \xdd, \xde, \xdf, \xe0, \xe1, \xe2, \xe3, \xe4, \xe5, \xe6, \xe7, \xe8, \xe9, \xea, \xeb, \xec, \xed, \xee, \xef, \xf0, \xf1, \xf2, \xf3, \xf4, \xf5, \xf6, \xf7, \xf8, \xf9, \xfa, \xfb, \xfc, \xfd, \xfe, \xff"
整理してみたら、このような16進数のデータです。もちろん読めません。大丈夫です。転義後の結果を見てください。

"A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, _, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, , ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,  , ¡, ¢, £, ¤, ¥, ¦, §, ¨, ©, ª, «, ¬, ­, ®, ¯, °, ±, ², ³, ´, µ, ¶, ・, ¸, ¹, º, », ¼, ½, ¾, ¿, À, Á, Â, Ã, Ä, Å, Æ, Ç, È, É, Ê, Ë, Ì, Í, Î, Ï, Ð, Ñ, Ò, Ó, Ô, Õ, Ö, ×, Ø, Ù, Ú, Û, Ü, Ý, Þ, ß, à, á, â, ã, ä, å, æ, ç, è, é, ê, ë, ì, í, î, ï, ð, ñ, ò, ó, ô, õ, ö, ÷, ø, ù, ú, û, ü, ý, þ, ÿ"
前のA-Z_を除くa-zは私たちがよく知っています。後ろのめちゃくちゃなものが正常な変数名として使われています。不思議です。PHPだけが変数名の文字範囲を広げ、A-Z_a-z以上で、変数の使用可能文字の範囲を\x 7 f-\xffに広げました。ですから、最初の文字の範囲は[a-zA-Z_]であるべきです。x 7 f-\xffでは二番目の文字もこのようにできますか?引き続きテストします。上のphpコードの中のを  eval('$'.$chr.'=1;)  せいにする  eval('$a'.$chr.'=1;)  テストの保存、

"\x9, \xa, \xd, \x20, \x30, \x31, \x32, \x33, \x34, \x35, \x36, \x37, \x38, \x39, \x41, \x42, \x43, \x44, \x45, \x46, \x47, \x48, \x49, \x4a, \x4b, \x4c, \x4d, \x4e, \x4f, \x50, \x51, \x52, \x53, \x54, \x55, \x56, \x57, \x58, \x59, \x5a, \x5f, \x61, \x62, \x63, \x64, \x65, \x66, \x67, \x68, \x69, \x6a, \x6b, \x6c, \x6d, \x6e, \x6f, \x70, \x71, \x72, \x73, \x74, \x75, \x76, \x77, \x78, \x79, \x7a, \x7f, \x80, \x81, \x82, \x83, \x84, \x85, \x86, \x87, \x88, \x89, \x8a, \x8b, \x8c, \x8d, \x8e, \x8f, \x90, \x91, \x92, \x93, \x94, \x95, \x96, \x97, \x98, \x99, \x9a, \x9b, \x9c, \x9d, \x9e, \x9f, \xa0, \xa1, \xa2, \xa3, \xa4, \xa5, \xa6, \xa7, \xa8, \xa9, \xaa, \xab, \xac, \xad, \xae, \xaf, \xb0, \xb1, \xb2, \xb3, \xb4, \xb5, \xb6, \xb7, \xb8, \xb9, \xba, \xbb, \xbc, \xbd, \xbe, \xbf, \xc0, \xc1, \xc2, \xc3, \xc4, \xc5, \xc6, \xc7, \xc8, \xc9, \xca, \xcb, \xcc, \xcd, \xce, \xcf, \xd0, \xd1, \xd2, \xd3, \xd4, \xd5, \xd6, \xd7, \xd8, \xd9, \xda, \xdb, \xdc, \xdd, \xde, \xdf, \xe0, \xe1, \xe2, \xe3, \xe4, \xe5, \xe6, \xe7, \xe8, \xe9, \xea, \xeb, \xec, \xed, \xee, \xef, \xf0, \xf1, \xf2, \xf3, \xf4, \xf5, \xf6, \xf7, \xf8, \xf9, \xfa, \xfb, \xfc, \xfd, \xfe, \xff"
結果は多くの文字がありますが、実は一部は削除します。たとえば\x 20はスペースです。  eval('$a=1;')  もちろん正常に実行できます。スペース以外にも、\t\rは削除します。これらもPHP文法で許容されている\t=\x 9、=\xa、\r=\xdですので、結果の上位4つのデータ\x 9、\xa、\xd、\x 20を削除します。結果は多くなりました。  \x 30、\x 31、\x 32、\x 33、\x 34、\x 35、\x 36、\x 37、\x 38、\x 39  asciiに詳しい人は一目でわかるかもしれません。これは数字0-9ですから、最初の文字の範囲は「\w\x 7 f-\xff」です。正則に慣れていない人は、「0-9 a-zA-Z_」ではないと思うかもしれません。x 7 f-\xff、実は\wは0-9 a-zA-Z_です。
だれかが言うかもしれない  $$a;${$a}  このような変数は?これは変数名の範囲から外れていると思います。
はい、php変数の利用可能な文字についての知識点を共有しました。もし何か間違っているところがあれば、メッセージを残してください。
私の推測:asciiの範囲は0-127(\x 00-\x 7 f)、latin 1の範囲は0-255(\x 00-\xff)です。おそらくPHPはlatin 1文字の範囲を拡張しました。もちろんPHPのソースコードを見たことがありません。予想です。