Slow Flag Printer

#pupupupu

https://alpacahack.com/ctfs/seccon-13-finals-booth/challenges/slow-flag-printer

フラグの出力がだんだん遅くなる

デバッガでsleepを飛ばすとフラグが崩れる

公式writeupでは気合で静的解析しろとのこと

個人的に面白かったのは÷1000を高速化するために掛け算を使っているところ

image.png

https://gist.github.com/shuax/14819c243c9df152569b8553b9f44f53

srand(0xdeadbeef)固定なのでseed値を出して頑張って復号する

いろいろ見ながら書いたsolver

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string>
#include <iostream>
#include <unistd.h>
using namespace std;
int main() {
    srand(0xdeadbeef);
    std::string secretStr = "@msgmsm\\021\\021\\027Xb\\177\\061z\\f~~Qv\\025RzvuZy\\002w\\025kNH[4H\\r^\\026\\020PP\\345\\367\\377\\177";
    const int vecSize = 42;
    long long sleep_max = 1;
    for (int i = 0; i < vecSize; i++) {
        int sleep_time = rand() % sleep_max + 1;
        long long sleep_time_ms = static_cast<long long>(sleep_time) * 1000;
        int mask = ((sleep_time_ms + 100) / 1000) % 128;
        sleep_max <<= 1;
        cout << (char)(secretStr[i] ^ mask);
    }
    cout << endl;
}