CTFの自分用メモ

  • 5
    Like
  • 0
    Comment

はじめに

ここに色々なメモを残す
本当に自分用なので乱雑
最近始めたばっかだからわかんないことしかない

写真のコメントを見る

$ identify -verbose decrypted.png 
Image: decrypted.png
  Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: DirectClass

〜〜〜〜〜〜略〜〜〜〜〜〜

  Properties:
    Comment: This is コメント

〜〜〜〜〜〜略〜〜〜〜〜〜

TypeError: Unicode-objects must be encoded before hashing

Python3系でこうなる

hash=hashlib.sha256("AAAAAAABBBBBBB").hexdigest()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Unicode-objects must be encoded before hashing

Python3系では変数に文字列を代入する際にUnicode型のものが入るが、hashlibではこれに対応していないので、エラーの言うとおりencodeしてやる

hash=hashlib.sha256("AAAAAAABBBBBBB".encode('utf-8')).hexdigest()
print(hash)
eec1fa5f1af83a56fe49b550ff052373581076fb4f1972f16f18760e23c11fbe

AESのデコード With Python

decode_aes.py
secret_key = "0123456789abcdef"
iv = "0123456789abcdef"
aes = AES.new(secret_key, AES.MODE_CBC, iv)

decrypt_data = aes.decrypt(encrypt_data)

keyは16, 24, 32のいずれかのバイト長でなければならない

ValueError: AES key must be either 16, 24, or 32 bytes long

uuencodeうまくいかなかった

デコードがうまくいかなかったからどうやるかわからなかった

$ cat uue.txt | uuencode 
usage: uuencode [-m] [-o outfile] [infile] remotefile

$ uuencode < uue.txt 
usage: uuencode [-m] [-o outfile] [infile] remotefile

結局わからなかったのでPythonのuuをつかった

import uu
uu.decode("uue.txt", "dec.txt")

追記(2016/11/11)

Python2系だとこうできる

3は無理

>>> print "test".encode("uu")
begin 666 <data>
$=&5S=   

end

>>> print "test".encode("uu").decode("uu")
test

複数のファイルが結合されたファイルの情報を見る

fileは3種類のテストをやってくれるけど、最初にテストが成功した時点で実行結果を出力してしまう。

そのため、CTFでしばしば見られる、複数の形式のファイルが1つのファイルに結合されてるやつの情報がうまくつかめなかったりする。

よくしらんけどbinwalkはファイルのどこからどういうフォーマットのファイルがあるかを出してくれる。

$ binwalk test.png

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             PNG image, 1024 x 32, 8-bit/color RGB, non-interlaced
41            0x29            Zlib compressed data, default compression

こんな感じの拡張子を変えると別の形式のファイルになるとかそういうのはこれ使ったら判断できるんじゃないかな

$ binwalk gazou.png

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             PNG image, 640 x 480, 8-bit/color RGBA, non-interlaced
41            0x29            Zlib compressed data, default compression
95256         0x17418         Zip archive data, at least v2.0 to extract, compressed size: 93428, uncompressed size: 94601, name: share1.png
188724        0x2E134         Zip archive data, at least v2.0 to extract, compressed size: 93663, uncompressed size: 94902, name: share2.png
282539        0x44FAB         End of Zip archive

pkcrack

$ pkcrack -C test.zip -c plaintext.txt -p plaintext.txt -P plaintext.zip -d target.zip

コマンドラインの意味は
-C 暗号化ZIPファイル名
-c 暗号化ZIPファイル内にある平文が分かっているファイル名
-P 平文が分かっているファイルのZIP圧縮したファイル名(暗号化されていないZIP)
-p 平文のファイル
-d 出力するZIPファイル名

-Pは単純に平文のファイルを$ zip -0 [平文]すればいい (?)
ここよくわからんのでちゃんと調べること
コマンドのヘルプ曰く、-c、-pと他のオプションが1つ以上必要ということらしい

Usage: pkcrack -c <crypted_file> -p <plaintext_file> [other_options],
where [other_options] may be one or more of
 -o <offset>    for an offset of the plaintext into the ciphertext,
            (may be negative)
 -C <c-ZIP> where c-ZIP is a ZIP-archive containing <crypted_file>
 -P <p-ZIP> where p-ZIP is a ZIP-archive containing <plaintext_file>
 -d <d-file>    where d-file is the name of the decrypted archive which
        will be created by this program if the correct keys are found
        (can only be used in conjunction with the -C option)
 -i switch off case-insensitive filename matching in ZIP-archives
 -a abort keys searching after first success
 -n no progress indicator

最初のもこれでいい

$ pkcrack -C test.zip -c plaintext.txt -p plaintext.txt -d target.zip

Standard-lock-key.jpg

これまじなの?

apkから読めるjavaファイルができるまで

参考: apkファイルからjavaソースコードを見られるようになるまで

必要物

手順

  1. apk -> リソース
  2. apk -> dex
  3. dex -> jar
  4. jar -> class
  5. class -> java

apk -> リソース

$ apktool d target.apk

リソースがいらないならこのステップはいらない

apk -> dex

$ unzip target.apk

でてくるclasses.dexがそれ

dex -> jar

$ sh dex2jar-2.0/d2j-dex2jar.sh target.apk

jar -> class

$ unzip さっきできた.jar

class -> java

JD-GUIだとかJD-Eclipseだとか好きな方法で見ればいい

apk2dex

apk2jar.rb

必要物をそろえたらいい感じに自動でやってくれるやつ?

RSAに向けた攻撃方法

全て

Common Moduls Attack

Common Modulus Attack

コード GOTO Laboratory様のコードをPython3向けに修正

def gcd(a,b):
    while b != 0:
        a,b = b, a % b
    return a

# Extended Greatest Common Divisor
def egcd(a, b):
    if (a == 0):
        return [b, 0, 1]
    else:
        g, y, x = egcd(b % a, a)
        return [g, x - (b // a) * y, y]

# Modular multiplicative inverse
def modInv(a, m):
    g, x, y = egcd(a, m)
    if (g != 1):
        raise Exception("[-]No modular multiplicative inverse of %d under modulus %d" % (a, m))
    else:
        return x % m

def common_modulus_attack(c, e, n):
    # c = [c1,c2,c3, ... ,cn]
    # e = [e1,e2,e3, ... ,en]
    assert len(c) > 1
    assert len(e) > 1
    assert len(c) == len(e)

    for i,e_a in enumerate(e):
        for j,e_b in enumerate(e[i:]):
            if gcd(e_a,e_b) == 1:
                break
        else:
            continue
        break

    a = egcd(e_a,e_b)
    c1 = c[i]
    c2 = c[j]

    if a[1] < 0:
        m = (pow(modInv(c1,n),a[1]*-1,n) * pow(c2,a[2],n)) % n
    elif a[2] < 0:
        m = (pow(c1,a[1],n) * pow(modInv(c2,n),a[2]*-1,n)) % n

    return m

print(common_modulus_attack([c,C], [e,E], n))

様々なツールの紹介、使い方を教えてくれたページ

CTFに用意するツール