強エンジニアになりたい大学生の日記

その日学んだことを日記程度に発信します。

G検定について

G検定とは - 一般社団法人日本ディープラーニング協会【公式】

はじめに

2020年第二回G検定(ジェネラリスト検定)の試験料が半額になっていたため受検したところ合格できたのでそれについて思ったことを書きます。

G検定とは

G検定(ジェネラリスト検定)とは、一般社団法人日本ディープラーニング協会が実施している資格試験です。ディープラーニングの基礎知識を有し、適切な活用方針を決定して、事業活用する能力や知識を有しているか検定します。

感想

もともと機械学習については少し勉強していたので、前日の夜から偉人の名前を詰め込み始め、テスト前には模擬試験で8割くらいとれるようにはなっていました。そして自信をもって本番に挑みましたが、、

?????????

法律問題多すぎね、、、??

今回のG検定では法律の問題が大量に出ました。もちろんつけ刃の僕がそんな問題解けるわけもなく結構長い時間鉛筆を転がしてました、、(笑)絶対落ちたと思って落ち込んでいたのですが、結果を見ると合格、、!

12552人中8656人が合格したようです。合格点低そう、、(笑)

受けて良かった点

  • 時事問題の勉強をすることでAIの歴史に少し詳しくなることができた
  • どんな場面で実際に機械学習が使われているのかを知ることができた
  • 機械学習アルゴリズムのロジックやそれぞれの問題点について確認することができた

おわりに

合格率が非常に高く、情報系の学生は持っていてもあまり自慢にならない感じがしたので、情報系で機械学習を学んでいる人にとっては別に受ける必要性はないと思いました。しかし、AIの歴史や機械学習の運用事例などを知ることができるため、機械学習、AIについて知りたいといった人にはおすすめの検定なのではないかと思いました。

今後の計画

コロナウイルスの影響で大学から大量の課題が出されています。まじで多すぎます。そして今はテスト期間、、。時間がないんです、、。

とか言ってられないので明日からは朝、このブログを執筆しようと思います。

今のところの記事に書くネタ(勉強したいこと)としては、

  • データサイエンスの勉強の課題が出ているため、それをまとめる。
  • CTFの勉強
  • まだDockerを理解できていないので、その勉強
  • ハッキングラボの本を読んでアウトプット
  • サークルで作っているwebアプリケーションの解説
  • ネスぺがとりたいのでその勉強

等です。

留年しない程度に、頑張って勉強していこうと思います。

ksnctf(2)

ksnctf今日も元気にやっていきましょう!

G00913 30点

円周率の中で最初に出てくる連続した10桁の素数を求める問題です。 競プロerには優しい問題でしたね!

import math

def is_prime(n):
    if n == 1: return False
    for k in range(2, int(math.sqrt(n)) + 1):
        if n % k == 0:
            return False
    return True

pi = "31415926535 8979323846 2643383279 5028841971 6939937510 5820974944 5923078164 0628620899 8628034825 3421170679 8214808651 3282306647 0938446095 5058223172 5359408128 4811174502 8410270193 8521105559 6446229489 5493038196 4428810975 6659334461 2847564823 3786783165 "
pi = pi.replace(" ", "")

index = 0
while True:
    s = pi[index:index+10]
    if(is_prime(int(s))):
        print(s)
        break
    index += 1

この素数判定のプログラムの計算量はO(√n)なので、10桁の数を判定するのには105回の計算が必要です。コンピュータは1秒で108回くらい計算できるので、十分余裕をもって計算できます。

Basic is secure? 50点

pcapの中身がブラウザで表示されてしまい、ダウンロードすらできない、、、。

結局右クリックから名前を付けて保存でダウンロードすることができました(笑)

いつも通りwiresharkで分析していきます!

f:id:burst_000:20200715124906p:plain

Basicf:id:burst_000:20200715135104p:plain

httpでフィルターをかけて、上から順番に、右クリック→追跡→HTTPストリームで見ていくと、No.13のところで、

Authorization: Basic ~

というのが書かれています。これはBasic64 で暗号化されているのですが、WiresharkにはデフォルトでBasic64の復号機能が付いています!AuthorizationをクリックするとCredentialsと出てきてFlagゲットです!

Basic認証は危険なんですね、、、。

Crawling Chaos 100点

一見何の変哲もないwebサイトですが、ページのソースを見ると、とんでもないスクリプトが書かれています。

(ᒧᆞωᆞ)=(/ᆞωᆞ/),(ᒧᆞωᆞ).ᒧうー=-!!....

何だこのスクリプトは、、、!と思いながらググると、console.logを使って複合できるそうなので、console.log((ᒧᆞωᆞ)=(/ᆞωᆞ/)........)のように書き換えてあげます。そしてhtmlファイルを開いて、DevToolsのconsoleを見ると、ちゃんと復号されています。

ここで最後のほうに注目すると、

ƒ Function() { [native code] } -0 "$(function(){$("form").submit(function(){var t=$('input[type="text"]').val();var p=Array(70,152,195,284,475,612,791,896,810,850,737,1332,1469,1120,1470,832,1785,2196,1520,1480,1449);var f=false;if(p.length==t.length){f=true;for(var i=0;i<p.length;i++)if(t.charCodeAt(i)*(i+1)!=p[i])f=false;if(f)alert("(」・ω・)」うー!(/・ω・)/にゃー!");}if(!f)alert("No");return false;});});

と書かれており、 平文のi文字目 × (i+1) = p[i] となるときに 絵文字が出力されていることがわかります。よってこれの逆の行動、つまりp[i] // (i+1) をすれば平文のi文字目がわかります。

p = [70, 152, 195, 284, 475, 612, 791, 896, 810, 850, 737, 1332, 1469, 1120, 1470, 832, 1785, 2196, 1520, 1480, 1449]
for i, c in enumerate(p):
    print(chr(c//(i+1)), end="")

Onion 70点

わかんなかったので調べました。Base64が16回施されているそうです、、。こんなのどうやったらわかるんだ、、。

まあとりあえずCyberChefを使って16回復号してみます。

すると意味のありそうな形になりました。調べてみると、uuencodeというものが施されているそうです。そうとわかれば、これをtxtファイルに保存して、pythonを使ってdecodeします。

import uu
uu.decode("a.txt","flag.txt")

これでカレントディレクトリにFlagが書かれたflag.txtが生成されて完了です!

VirtualBoxでWindowsからUbuntuをGUIでいじれるようにしたい

ctfをやっていると、いろんな環境が必要になります。

時にはwiresharkを使うためにWindowsを使ったり、また時にはlibureofficeを使うためにLinuxを使ったり、、、。

現在の僕の環境はデュアルブートでWindows10とUbuntu LTS20.04が入っているのですが、いちいち切り替えるのが面倒臭いんです、、、。

ということで

VirtuBoxを使ってWindowsからどっちもいじれるようにしよう!

となりました。

qiita.com

この記事を参考に進めていきました。

やってみた感想

重すぎて使えたもんじゃない!!!

設定をいろいろいじって少しは軽くなったものの、使うか悩むレベル。とりあえずこれについてはまた今度考えます。

ksnctf(1)

cpawctfが解き終わってしまったので今日からは

ksnctf

を解いていこうと思います。

36問もありますね!

Easy Cipher 50点

まずはいつものやつですね。

def encrypt(text, s):
    result = ""
    for char in text:
        if (char == " " or char == "."):
            result += char
        elif (char.isupper()):
            result += chr((ord(char) + s-65) % 26 + 65)
        else:
            result += chr((ord(char) + s - 97) % 26 + 97)
    return result
ENC = "EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT."
s = 13

print(encrypt(ENC,s))

もう書きなれたもんですね。

#! 20点

Unix系でコードを書きなれている人ならばみな知っているであろう、コードの最初に書くこいつ、、。意味は知っていても名前なんて知らねえよ、、(笑)

ということでググって完了。

Simple Auth II 20点

コードを読んでいくとsqliteにクエリを飛ばしているので、とりまSQLインジェクションをしてみるがうまくいかない。 結構考えてもわからなかったので調べると、database.dbが相対パスで指定されていることに気が付く。よってurlのauth.phpをdatabase.dbに変えてあげるとファイルをダウンロードできる。あとはDB Browser(SQLite)なりで開いてあげればFLAGをゲット!

Simple Auth 50点

とても単純なコードになっていて、明らかにstrcasecmpが何か問題を起こすだろうと予想した。調べるとどうやら脆弱性があるらしい。引数に配列を渡すとnull (0)を返すらしいので、今度はphpのinputに配列を投げる方法を調べる。inputタグのnameを配列の形にしてあげればいいらしいので、Chrome Dev Toolsからhtmlを書き換えて送信を押したらFlagをゲット。

これぞCTF!って感じの面白い問題でした。

今日はこの辺にして続きは次回やります!