🙌

ieraeCTF writeup rev rev revだけ

に公開

ieraeCTFに参加してきました
簡単な問題一問しか解けなかったけどとりあえずwriteupをかく
初心者+初投稿なので、ものすごく丁寧に書いてるのは許してください

rev rev rev

stringsで確認したところ

flag = open('flag.txt', 'r').read()
x = [ord(c) for c in flag]
x.reverse()
y = [i^0xff for i in x]
z = [~i for i in y]
open('output.txt', 'w').write(str(z))

まず

flag = open('flag.txt', 'r').read()
x = [ord(c) for c in flag]

はflag.txt から文字列を読み込んで('r'で読み込みモード)、文字ごとに ord() で Unicodeのコード値に変換し、リスト x に格納している。この時flagにはflag.txtにある文字すべてが入り、それをxに一文字ずつ入れている形になる。

x.reverse()

は順番を逆に並びなおすということ

y = [i^0xff for i in x]

i^0xffをするとiのビットが逆転することは覚えておきましょう
XOR は可逆なので、2回 XOR すると元に戻ることも覚える

z = [~i for i in y]

これはビット反転で補数まで変わる違いがあります

ソルバー

z = [-246, -131, -204, -199, -159, -203, -201, -207, -199, -159,
     -204, -158, -155, -205, -211, -206, -201, -206, -205, -211,
     -158, -159, -207, -202, -211, -199, -206, -155, -206, -211,
     -204, -200, -200, -200, -203, -208, -159, -199, -133, -187,
     -191, -174, -187, -183]

y = [~i for i in z]

x = [i ^ 0xff for i in y]

x.reverse()

flag = ''.join(chr(i) for i in x)

print(flag)
IERAE{9a058884-2e29-61ab-3272-3eb4a9175a94}

次回はrev問題最後まで解けるようになるぞ!

Discussion