旧・技術者見習いが一人前の技術者を目指す

制御系エンジニア経験3年、webエンジニア1年目。技術まわりのことを書きます。

vim で挿入モードのときに hjkl でカーソルを移動する

vim でコードを書いているときに、() や [] を打つときに手間取ることが多かった。

flash[:success] = "Welcome to the Sample App!"

例えば↑のような文において[:success]の部分を書くとき、以下の手順で入力していた。
1. [] を書く
2. Esc を押して挿入モードからコマンドモードに戻る
3. h で左に移動する
4. i を押して挿入モードに戻る
5. :success を入力

面倒だったので、挿入モードの状態で hjkl でカーソル移動したかった。
~/.vimrc に以下を書いて解決。

inoremap ^H ^[ha
inoremap ^L ^[la

挿入モード時に ctrl+h で、左に移動、ctrl+l で右に移動することができる(上下は使うことが少ないので省略している)。
その結果、以下のように変わった。
1. [] を書く
2. ctrl + h で左に移動
3. :success を書く

大幅な改善!!
まぁ、[を書いたら]も書いてくれて、しかも[と]の間にカーソルが移動するようにもできるんだけど、そこまでやる気が起きなかったので。

inoremap とかの意味のまとめについては以下を参照。
http://vimblog.hatenablog.com/entry/vimrc_key_mapping

制御文字の入力方法に関しては以下を参照。
https://www.pistolfly.com/weblog/2011/11/post-134.html

ksnctf 35 Simple Auth II に挑戦

問題は以下
ksnctf - 35 Simple Auth II

とりあえず、SQL インジェクション(最近名前覚えたばかり)なのかなと思ってググってみるが、仮に実際 SQL インジェクションの問題だとしても、解き方が載っているサイトとか全然うまくみつけられない。。。

" とかそういう文字列とかを id/password に打ち込んでみても、ダメダメダメ・・・。

で、諦めて解答を調べてると以下の知恵袋が見つかった。
このCTF問題ლ(╹◡╹ლ)のヒントを教えてください。現在PHPについて勉強中で... - Yahoo!知恵袋
が、ダウンロード?どこから?という感じでさっぱりわからないでずっと悩んでいた・・・


f:id:longtime1116:20160710010347p:plain
さて解答方法ですが、↑(source から抜粋)の sqlite:database.db の database.db って、相対パスなんですね。
だから、source の url (http://ksnctf.sweetduet.info/q/35/auth.php) の auth.php の部分を database.db に変えたものが、database.db のパスになるってことです。
これでダウンロードができる!!!
ダウンロードして、ローカルに database.db という名前で置いておく。
あとは、sqlite3 とやらの使い方をネットでググり、ごにょごにゅすれば、FLAG ゲット!!

$sqlite3 database.db 
sqlite> select * from user;    // これは、source に書いてある命令を使っている

C言語ポインタ完全制覇、読了(ポインタの概念がわかる良著)

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

↑の本を読んだので感想等。

[なぜ読んだか]
体系的に一度もポインタについて学んでいなかったので、そろそろしっかり学んでおくかという気になった。

[私のポインタに対する理解(読む前)]
会社ではC言語を使って開発をしている。
さすがにもう2年以上C言語を使っているので、ポインタの使い方くらいは理解できている、という感じ。
(研修で初めてポインタに触れたときも、実はあんまりポインタに苦しめられた覚えはない。)

[本の感想]
だいたい知っていることが書かれていたが、C言語はメモリをどう確保するのか、という点については初めて知れたので良かった。
どのタイミングでどこに(スタック or ヒープ)メモリを確保して、いつまで保持しておくのかなど、普通に使っているだけではわからないことなので、テストコードと共に解説がしっかり書いてあるのは本当にありがたかった。
メモリ管理=内部で勝手に行われてること=ブラックボックス、みたいに捉えているのはもったいないので、この本を読んで克服しましょう。せっかくの C 言語なんだし。

この本を読むことで、自信を持って他人にポインタの使い方や仕組み?を教えてあげられるようになると思う。

なお、いろいろなところで書かれているが、初心者がいきなり読むにはきつい。
きついというか、つまらないと思う。


[面白かったこと]
以下のコードを見ていただきたい。

#include <stdio.h>

int main (void)
{
    int     array[4] = {0, 1, 2, 3}; 

    printf("array[3] = %d\n", array[3]);    // 当然 array[3] は 3
    printf("array[3] = %d\n", 3[array]);    // じゃあこれは???                                                                                          
    return 0;
}

どちらも同じ出力になるんですねこれが。
hoge[i] という書き方は、シンタックスシュガーと呼ばれ、コンパイラは *(hoge+i) に展開してしまうそう。
なので、一見意味不明な i[hoge] という書き方でも警告は出ないし、ましてやエラーにもならないんですね。
これは面白い。

完全初心者がCTFに挑戦(ksnctf 3 Crawling Chaos に苦戦)

CTF に初挑戦した。

最初に取り組んだ問題は、以下

ksnctf - 3 Crawling Chaos



が、全くの初心者なので、自力で解くことはもちろん、解説をいろいろと読んでみてもやり方がよくわからなかった。

結局数時間かけてクリアしたが、ここに解決法を詳細に記しておく。

なお、使用しているブラウザは chrome


①とりあえずリンク先に飛んでみる。

http://ksnctf.sweetduet.info/q/3/unya.html

にアクセスしてみる。

②画面にはボックスと送信のボタンしかないので、とりあえずソースを見る。

mac では option+command+i (windows では F12らしい)を押す。

すると、いかにもエンジニアっぽい画面が出てくる(google developer console)。

f:id:longtime1116:20160709132722p:plain

③怪しい箇所っぽいところに注目

12行目を見てみると、なにやら怪しい長ーい一行がある。

意味の無い文章がこんなところにあるはずがない&ところどころに","とか":"とかあって意味がありそう。

④console.log に出してみる。

ここが、初心者にはどうやっていいのか分からず困ったところだ。

まず、↑の画像の全行を、メモ帳に貼り付けて hoge.html といった名前で保存する。

次に、その hoge.html をchrome で開く。先ほどの方法で、developer console を呼び出す。

やってみればわかるのだが、今度はソースコードをいじれるようになっている(ローカルにコピーした、自分のファイルなので)。

ということで、ソースコードに修正を加え、この長い12行目の秘密を探ってみることにする。

↓の画像のように、console.log() で 12 行目をくくってしまってから、このページをリロードすると、console の部分に赤文字でぞろぞろと出てくる。

f:id:longtime1116:20160709133318p:plain

この下の方の部分を読みやすく整形すると以下みたいな感じに。

$(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;
        }); 
    }); 


⑤ FLAGを見つける
↑のコードを見ると、array の要素一つ一つに対して、正解の文字コードが存在するみたいだ。

なので、C言語でそれを解くコードを書いてみた。

#include <stdio.h> 

int
main (void)
{
#include <stdio.h>                                                                                                                                                  

int
main (void)
{
    int i;
    int array[] = {70,152,195,284,475,612,791,896,810,850,737,1332,1469,1120,
                   1470,832,1785,2196,1520,1480,1449};
    for ( i = 0; i < sizeof(array) / sizeof(int); i++ )
    {   
        char c;
        c = array[i] / ( i + 1); 
        printf("%c", c); 
    }   
    printf("\n");

    return 0;
}
||>

Mac に VirtualBox と Ubuntu を導入

本日行ったこと

  1. VirtualBox インストール
  2. VirtualBox 上で Ubuntu 起動
  3. Ubuntu かるーくいじってみた

 

1. VirtualBox インストール

2. VirtualBox 上で Ubuntu 起動

以下の 2 つを参考に、導入。

MacのVirtualBoxにLinuxのUbuntuをインストールする方法 / Inforati

Linuxmania: VirtualBoxを使おう (Ubuntu)

家の通信速度のせいか、iso イメージをダウンロードするのに20分くらいかかった気がする。

特に問題なく導入完了。

 

3. Ubuntu かるーくいじってみた

感想としては、思ったよりいろいろ最初から入っているなーという感じ。

firefox, LibreOffice(無料版 Office ソフト), GUIVim などなど。

とりあえず、端末の起動方法が分からなかったので、調べて起動してみた。

Ubuntu 14.04:「端末(ターミナル)」を起動する方法

 

とりあえず初日はここまで。

たいしたことしてないのに、わりと時間がかかってしまった・・・。

 

技術者として勉強を始めることにした。

文系国立大学を卒業してはや 2 年。

もうプログラマとして働き出して 3 年目になる。

 

しかし、ほとんど技術力が身に付いている気がしない。

このままだと、市場価値のない、学歴だけが取り柄の人材ができあがってしまう。

それはまずい。

自主的に勉強していかなければならない。

 

入社 3 年目でようやくこのような意識を持てた。

スタートダッシュはできなかったが、これから少しでも遅れを取り戻して成長していこう。

 

このブログでは、取り組んだことを備忘録的にまとめていく。

技術以外のことも書くかもしれないが、それは気分次第で。