Tag Archives: C

Androidの開発でC++のコードを使うには

最後の更新からずいぶんと日が空いてしまいました。久しぶりの更新です。 英語のアウトプットの方はMy Teacherが別のところでCheckしてくれることになったので、こっちは昔の感じで再構築していこうかと思います。 やっぱり英語+ITの話題となると、ちょっと敷居も高くなっちゃってなかなか手が動かなかなったんですが、ただの英語の日記だとわりとサクサクと書けますね。それに添削もしてくれるのでやりがいもあると。 閑話休題。 再構築の1発目はAndroid。 Androidでググっていると、ネイティブコードとかいう言葉をよく目にすることがあるかもしれません。 C/C++がそれにあたるそうです。 使い方ですが、Android StudioのSDKツールでLLDB、CMake、NDKという3個のコンポーネントを追加してください。 横着な人はプロジェクト作成のときにこの部分 Include C++ Suportにチェックを入れて作業を進めて行くと、〇〇がないからインストールしなよ! って出て来るので、それで入れて進めても大丈夫です。 さて、MinimumSDKとかどうしよかなーとか悩むとこですが、テストなのでそれは置いておいてドンドン進めて行くと、普段見ないファイルが少し増えているぞと。 cppディレクトリにnative-lib.cpp、External Build FilesにCmakeLists.txt というファイルがあるね。 C/C++を使う方法ですが、ndk-build(古い)を使う方法とCMake(新しい)を使う方法があるようで、今回はCMakeを使う方法です。 これらの具体的な仕組みは分かりませんが、これをつかって規則に沿って進めていけばうまくビルドしてくれるようです。 便利なもんだ。 プロジェクトが出来上がって何も手を加えずにビルドしてみてみると、native-lib.cppにあるString設定されている文字列がディスプレイに表示されていることでしょう。 いつものJavaのMainActivityを見ると というところがあります。nativeで宣言して、下の3行でCを呼んでる感じだね。 C++のコードはnative-lib.cppに書くとよさそうです。 では、ここで積み本になっていた技術評論社:C++クラスと継承完全制覇を取り出してC++のコードを書いてみよう。 と、その前にルールをチェックやで。 native-lib.cpp メソッドはこの形式で、第1引数、第2引数はこれで固定らしい。追加は第3から。 あとはDEMO?というか作りたてのコードにあったようにC++内部ではstd::stringで、返す時にはJstring。 これはStringだけども、このような感じのルールらしい。 プロジェクトを生成してできるコードを見るとそのようになっています。 では技術評論社:C++クラスと継承完全制覇のList1-1のコードから抜き出してビルドします。 こんな感じになっています。 ビルドすると 出たけどちょっと寂しい。 ではこの勢いでC++の勉強をしていこうと思います。 せっかく本買ったしなあ、とけっこう貧乏性なんだな。 参考にしたサイト させす技術メモ(自家用)Android Studio 2.2でC++のコードを使う hcreer’s diary Android Studio NDKを使う

人の造りしもの

大したネタではないのですが、Rubyには便利な標準ライブラリがあり、たくさんのメソッドがあります。 便利で良いのですが、Rubyでスクリプトを書いてるとこのメソッドはどんなコードだろう?という疑問に直面することが結構あります。 いまさら感はありますが、今回はその辺をざっくり探ってみます。 プログラミングの題材でSort関数を作ってみよう!ってのは最初の頃のネタとして良く取り上げられますが、今回このお題目にした原因になったのはDeleteメソッドからなので、Deleteメソッドを追いかけて行きませう ベーシックな3つのクラス。 a = [1, 2] a.class => Array b = {1 => “a”, 2 => “b”} b.class => Hash c = “hoge” c.class => String そこにDeleteはあるのかい? a.methods.grep(/delete$/) => [:delete] b.methods.grep(/delete$/) => [:delete] c.methods.grep(/delete$/) => [:delete] あるようです。ではソースコードを見るためにRubyのソースを用意しました。 古いですけどベーシックに使っている2.0系でし。 $ ls -d /tmp/ruby-2.0.0-p645 [/tmp] /tmp/ruby-2.0.0-p645 ソースなので、皆様こちらにご揃いにございます。 $ pwd /tmp/ruby-2.0.0-p645 $ ls string.c string.c $ ls hash.c hash.c $ ls array.c array.c Stringクラスで確認していきたいと思います。理由はStringクラスのDeleteを使ってたから! 5606行目に使い方のコメントを発見しました。これだよこれ! 5606 * “hello”.delete “l”,”lo” #=> “heo” 5607 * “hello”.delete “lo” #=> “he” 5608 * “hello”.delete “aeiou”, “^e” #=> “hell” 5609 * “hello”.delete “ej-m” #=> “ho” コードはこんな感じ。 5612 static VALUE 5613 rb_str_delete(int argc, VALUE *argv, VALUE str) 5614 { 5615 str = rb_str_dup(str); 5616 rb_str_delete_bang(argc, argv, […]

今すぐ zlibc

  wow wow ではなくアップデートしましょう。 参考サイト glibc の脆弱性 CVE-2015-0235(通称:GHOST)についてまとめてみた – piyolog: 今日は1日外に出ていたので確認が遅れてしまいましたが、Glibcに脆弱性があり、getbyhostnameやらを悪用するとバッファオーバーフローの脆弱性があるということらしいが、かなり限定される条件下で、ということも書いてありました。 放置しておけないエマージェンシーモードということで、libcが使われているらしきソフトウェアの確認はさておいて、とりいそぎ yum update とリブートしました。 yum update とリブートだよ。 サクッと調べた感じだと、去年のHeartbleedよりも危険性は少ないということだが、Heartbleedはメモリの中身が見れちゃう脆弱性で、バッファオーバーフローとは異なりんぐ。 条件がかなり限られるので、そんなに簡単に使いこなせるものではないみたいだけれど、バッファオーバーフローは脅威だ。 万が一やられていた場合は、すでに起こった事はどうしようもないのでまずは落ち着いて対処するのがいいざんす。 何をするかというと yum update とリブート。 人によっては、apt-get update apt-get upgrade とリブート。 ちっとだけうちのサーバーを調べてみます。 まず可能性の問題として考えて、glibcを使っていたのは以下のもの。 Passenger mysqld named ruby Zabbix-server Zabbix-client 運が悪ければやられていた可能性はあるのかね。 あるとすればかなり影響ありありなメンツです。 公開される前から開発されていると思いますが、すでにパッチは出ています。 CentOS6 の対策済のバージョン CentOS 6 (glibc-2.12-1.149.el6_6.5) チェックスクリプトが配布されていますので確認すべし。 安全を確認するまでが遠足アップデートですぞ。 てことで、確認してみましょうか。 チェックスクリプト配布元 https://www.qualys.com/research/security-advisories/GHOST-CVE-2015-0235.txt コンパイルして実行だ。 OKっす。 コンパイルとか訳わかんねーな人はオンラインでも確認できるようです。 手順はトップで紹介している参考サイトにどうぞ。 あとは、深夜になればTripwireのスクリプトが走るのですが、念のため現時点でのTripwireでのチェックもやっときます。 Logwatchと改ざんチェックとグラフの確認は毎日確認しているので、おそらく大丈夫なはずです。 何か変化があれば何かしらの変化はどこかに見えるはずなのだ。 そして今後はこの件について問題が起こることはなくなったってことだ。 情報拡散も大事ですが、今回の件から得るべき教訓は、日々のチェックが重要でっせという事だ。  

OS作成その4 崩壊

30日でできる予定のOS自作入門ですが、やっと4日目が終わった・・、正確には読み終わった、だけど、理解度は3日目だ。 自慢じゃないが、30日で終わらない自信がたっぷりある。 そんな訳ですが、まずは アセンブラの関数で遊んでみる 著者の川合さんが作ったアドレスを指定する関数を使ってちょっと遊んでみる。 遊んでみるというよりも、ちょっと動作確認みたいな感じです。 ソース 実行結果 0x80496e8 10 20 30 思った動作をしてくれました。   では続いていきましょうか。 p[i] と *(p + i)の話って出てくるの3回目だっけ?? いつもぼけーっとしながら本を読みながらも、p[i] i[p] *(p + i) の話は毎回の教本に出てきていると思うんだ。 だが、今回のOS自作入門についてはちょっと違っていた。 じゃなくて、違っていたんじゃなくて、やっとたけけんが考えられる知識が備わったのかもしれない。 では配列と言えば領域違反なので、違反するプログラムを実行して*(p + i)に書き直してみる 元ソース 書き直したソース ループの範囲が違うのは途中のポインタで止まるからだす。 実行結果 うん、うまく動作しているんだけど、この結果を見てたけけんの頭が崩壊した。 分かったようで、分かってなかったんだなぁとバグった頭で頑張って考えた。 サブタイトルにもしたんだけど、この話が出てくるのは3回目だと思うんだ。 なので前回でてきたポインタ完全制覇を取り出して、ササっと読み返したぞ。 宣言の[]と式中の[]は違う、ついでに宣言の*と式中の*も違う これってCを宣言を分かりにくくしているYO という事だった。なるほど! っていうか違うということにすら気づいてなかった。 CのAも分かってなかったんだなぁ。。 どういう事かというと日本語は難しいという事だ。   ここでちょっとテストしてみる。 うむ、満足した。 それと、今まで何の気もなしに見ていたエラーメッセージで 「error: 添字をつけられた値が配列でもポインタでもありません」 ってのがあるんだが、これはつまりどっちでも一緒という事だったんだろう。   では、この辺でOS自作入門に戻ろうとしよう。 おそらく著者は式中の[]について述べているのだな。 ちょっと引用すると p[i]はPという配列のi番目という説明はごまかし うん、なるほど。こんどは分かったよ。 じゃあ、アセンブラの配列はどうなるなるの?と単細胞なたけけんは思っちゃうのだが、配列といえば、同じ型のデータがメモリに並んで入るものだったはずなので、ようするにつまりはそういう事なのだね。 今までの勉強内容がいろいろ交差してきてなかなか楽しいもんだ。 運命の交差点だ。 それから2ページほど読み進めたら、さっきの配列がどうのこうのという部分の答えが こっちにも書いてあった。 疑問に思ったらそこで立ち止まって考えてしまうのは自分の悪い癖でござるでござる。 書かれていたのがどういうものだったかと言うと char num[3]; というのを例として、CでいうとChar型の宣言で文字列を入れるもん。 となるけれど、アセンブラだとBYTE用の番地だよと。 という事のようだ。なるる。 続いて、numは定数。アセンブラでいうラベル。 ラベルの値は、もちのろんで番地を意味している。 JMPとかCALLでジャンプしている先頭のアドレスだ。 ってことはポインタでもある。 混乱していた頭もだいぶ落ち着いてきた。 うしろの3はRESB 3 となる。 訳すると、3byteの初期化されないデータ領域で、最後のBはByteを意味している。 やっぱりC言語やってよかったよ!ロベルト! 驚きなのは著者の川合さんは関数を全部アセンブラで作ってしまうので 何もincludeしないのだよね。 何もincludeしないCのプログラムは新鮮だ。 たけけんの脳味噌ではこの本だけでアセンブラを勉強するのはちょっと厳しいので、アセンブラの勉強にもう1個だけ本でもウェブでもどっちかで別のもので勉強をしようと思います。 ちょっと読んだだけだけど、VRAMは相当難しそうだなぁ。 でも多分ナウい言語だったらその辺の関数がきっと用意されているはずだ。 ・・と予想してみる。 当たったらなんかほしいものでも買うか。  

リターンアドレスから関数を実行してみる

ボンジョルノー、たけけんです。 やっていて思うところ、まだまだスキル不足感が否めませんが、リターンアドレスから関数を実行するという事をやってみました。 参考サイト IPA http://www.ipa.go.jp/ OSSSME システム奮闘記:その44 プログラム内のお話ですが、リターンアドレスというのは、呼びだし側の処理を再開するアドレスのことを指します。 リターンアドレスを書き換えるという事は、通常の領域を超えた先へ書きこみを行う事になりますが、手順については多々あるようです。 IPAさんで紹介しているのは、バイナリエディタを使って、アドレスを書き換えたテキストファイルを読んでコマンドを実行させるものです。 前々回やったのが、Kenjiさんのサイトを参考に、Kernel再構築の際に初期化をおこなう関数の中に脆弱性のある関数を実行するように改ざんし、その関数を利用してバッファオーバーフローを起こしてLinuxをフリーズさせました。 前回やったのは、アドレスを書き換える事とは違うけど、改ざんという事では仲間のような感じなので一緒にしちゃいますが、IPAさんのサイトを参考にsetuidとcreateの脆弱性を利用してroot所有ファイルを書き換えました。 でもって、リターンアドレスの探し方ですが、IPAさんではプログラムとバイナリエディタを使ってリターンアドレスを調べるという高度なことをやってますが、こちらは一番原始的な方法でやってみました。 とても簡単な方法ですが、これでもオーバーフローを利用した実験は可能なので、ぜひ見ていただきたいと思います。 一番原始的な方法とは何か・・・ 0から順に試していくのです! 順番にやっていくだけなので、メモリーの使われ方にそれほど詳しくなくても十分です。 ただ、もちろん詳しい方が良いと思います。 今回参考にさせて頂いたOSSSMEの菅さんのウェブサイトですが、こちらのサイトでは、プログラムを交えてメモリーに関する考察をされてますので、自分でプログラムも動かしてヒープ領域やスタックについて知識を深めることを是非ともおすすめします。 自分も何回も読んで、プログラムを実行しました。 日本語の説明を繰り返し読むよりも、実際にプログラムを読んで書いて動かした方がよっぽど頭に入るのはなにか不思議に感じますが、それが事実なのだね。 リターンアドレスを探すソース   1 #include <stdio.h>   2   3 void messages(void)   4 {   5     printf(“hello flow\n”);   6 }   7   8 void func(void)   9 {  10 int a[1];  11  12 a[0] = 5;  13 a[1] = 4;  14 a[2] = 3;  15 a[3] = 2;  16 a[4] = 1;  17 a[5] = 0;  18 a[6] = (int)messages;  19  20  21 }  22  23 int main(void)  24 {  25  26 func();  27  28  29 return(0);  30  31 } 実行結果 # ./a.out                                                         [/root/C] hello flow zsh: […]

カーネルモードとユーザーモード

ニーハオ、たけけんです。 今日も日本からお届けするよ。 今回からの参考書籍は基礎からわかるTCP/IPネットワーク実践プログラミングです。 だがしかし、前書きあたりにソースの再配布は禁止!と明確に書いてあるので、いつものようなソースを引用してのプログラム作成とかそのプログラムを公開とかするのはやめとこうと思います。 ほな、どないしはるんですか~? ってところだが、本文中で気になったり、引っかかったキーワードをメモっといて、かたっぱしから調べたり、実際にテストして試したりしていこうと思います。 これなら引用でもなんでもないし、かなり勉強になるでしょう。 書籍はあくまでヒントとして使えるのだね。 いい考えだが、読み終わるまでどのくらいかかるのやらだ。 という事で始めの一歩っていうことでカーネルモードです。 カーネルモードとユーザモードの違いを簡単に説明する。 カーネルはカーネルモードで動作、アプリケーションプログラムはユーザモードで動作する。 非常にざっくりな説明だけど、十分な説明でもあります。 どう違うのかをこれから試していきます。 一番簡単な方法というと、ユーザモードではメモリ保護機能があるので、変なところに書き込みをしようとするとセグメントエラー!というのをプログラムを書く方はよく見かけるかと思いますが、それです。 一応検証したんですが、カーネルモードの検証がすごく長くなってしまったので、ユーザモードは端折ります。 ではでは、カーネルをさわるのでソースコードを取ってきましょう。 The Linux Kernel Archives https://www.kernel.org/ こいつらに決めた!(古い) https://www.kernel.org/pub/linux/kernel/v2.6/longterm/v2.6.32/linux-2.6.32.61.tar.xz https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.2.59.tar.xz ・・・すったもんだで、カーネルの再構築もやり方も忘れちまいました。 なんとカーネル再構築 CentOSでググったらうちのブログがトップに出てくるよΣd(゚∀゚d) だけど出てくるページはKVMの日記なので、検索語句とちょっと内容が合ってないのでは・・・ だけどGoogleにこれ違うんでない?なんてことは言わないよ。 本文に カーネル再構築 CentOSという検索で来ている人がいらっしゃったら こちらにどうぞ Linuxのカーネルの再構築をやってみた という一文を追加しておいた。ふふふ。 なんだか不思議な感じだけど、自分のサイトを参考に作業をしていく。 なにがあってもいいように、VMwareを使ってCentOSを1から構築。 1からといっても、minimalでインスコしてwget vim zsh gcc make xzを入れただけなので、ほんの数分の作業です。 # cd /usr/local/src                                                         [/root] #                                                                  [/usr/local/src] # wget https://www.kernel.org/pub/linux/kernel/v2.6/longterm/v2.6.32/linux-2.6.32.61.tar.xz 以前はtar.gzだったのが、xzになっていた。 2段階解凍をするよ。 # xz -dv linux-2.6.32.61.tar.xz                                    [/usr/local/src] # ll                                                               [/usr/local/src] 合計 373924 -rw-r–r–. 1 root root 382894080  6月 10 23:13 2013 linux-2.6.32.61.tar # tar -xvf linux-2.6.32.61.tar # cd linux-2.6.32.61                                               [/usr/local/src] # pwd                                              [/usr/local/src/linux-2.6.32.61] /usr/local/src/linux-2.6.32.61 おまけ make menuconfig するならこいつが必要。 *** Install ncurses (ncurses-devel) and try again. 同じ轍は踏まないぞと、昔の自分のサイトで注意点を調べると ・容量が足りなくてmakeできなかった。 ・makeで1時間くらいかかった。 ってとこぐらいかな。 まだまだ夜は長友な事だしゆっくりしとこう。 と思っていたが、長友が始まる前に寝てしまった。 起きたらエラーだった。orz   ところでコマンドのソースを探す方法だけど、こんな方法でもOKだ。 # grep -R […]

TCP/IPソケットプログラミングC言語篇がひと通り終わったよ~

とりあえず目標は達成しました。 明解C言語の入門~中級、ポインタ完全制覇と読み進めてきてのやっとこさですけど、単語と文法の辞書を片手にやっと簡単な会話ができるようになったかなぁという感じです。 ぺらぺーらにはまだまだ時間かかるだろうね。 いまちょこっとPerlも初めてるんだけど、Perlでは主にファイルの操作、ログの解析、正規表現、ハッシュっていうラインナップなので今までやってきたものとは一味違っと~る。 たとえば、Iplay baseballが分かったらJe joue au baseball.はすぐにわかるよね。 過去にC言語でやった練習台をPerlでやってみたらさくっとできるんよね。 ただ、やろうとしていることがなかなかできないので多少へこみぎみ。   まあ近況はそんな感じです。 ひとまず・・・ まとめってものでもないけど、ちょこっと試してみたことがあるのでそれを書きます。 UDPでIP Spoofing やってみた。 さらっと書いてますけど、いわゆる偽装です。 チェックはconntrack-toolsだけで今回はTCPdumpは使ってません。 前回ではっきりと気づいてなくて今回では気づいたんだけど、conntrack-toolsではアプリケーション層しか分からないので、iptablesでポートをふさいでると検知しないのだね。 ってことでUDPは全開です。 [NEW] udp      17 30 src=192.168.24.162 dst=192.168.24.69 sport=10000 c=192.168.24.69 dst=192.168.24.162 sport=10000 dport=10000 [NEW] udp      17 30 src=192.168.24.163 dst=192.168.24.69 sport=10000 c=192.168.24.69 dst=192.168.24.163 sport=10000 dport=10000 [NEW] udp      17 30 src=192.168.24.164 dst=192.168.24.69 sport=10000 c=192.168.24.69 dst=192.168.24.164 sport=10000 dport=10000 [NEW] udp      17 30 src=192.168.24.165 dst=192.168.24.69 sport=10000 c=192.168.24.69 dst=192.168.24.165 sport=10000 dport=10000 [NEW] udp      17 30 src=192.168.24.166 dst=192.168.24.69 sport=10000 c=192.168.24.69 dst=192.168.24.166 sport=10000 dport=10000 [NEW] udp      17 30 src=192.168.24.167 dst=192.168.24.69 sport=10000 c=192.168.24.69 dst=192.168.24.167 sport=10000 dport=10000 [NEW] udp      17 30 src=192.168.24.168 dst=192.168.24.69 sport=10000 c=192.168.24.69 dst=192.168.24.168 sport=10000 dport=10000 [NEW] udp      17 30 src=192.168.24.169 dst=192.168.24.69 sport=10000 c=192.168.24.69 dst=192.168.24.169 sport=10000 dport=10000 [NEW] […]