2013-05-01から1ヶ月間の記事一覧

逆アセンブルで遊んでみる(9)構造体変数の返却

構造体変数をreturnする関数の内部処理を解析する。です。 1 struct d { 2 int num1; 3 int num2; 4 int num3; 5 }; 6 7 struct d func() 8 { 9 struct d d1; 10 11 d1.num1 = 0x7FFFFFFF; 12 d1.num2 = 0x8FFFFFFF; 13 d1.num3 = 0x9FFFFFFF; 14 15 return …

逆アセンブルで遊んでみる(8)long long型の自動変数

スタック上に確保した自動変数領域に、long long型(16バイト)のデータを格納する。です(エピローグとプロローグ、SSPのスタック破壊検知コードについては省略しています)。 1 void func() 2 { 3 long long n = 0x1234567890ABCDEF; 4 char str[] = "0123…

逆アセンブルで遊んでみる(7)スタック破壊検出コードの自動生成

今回は、関数内で配列を確保する。です。 1 void func() 2 { 3 char array[] = "12345678"; 4 } 00000000 <func>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 ec 18 sub $0x18,%esp 6: 65 a1 14 00 00 00 mov %gs:0x14,%eax c: 89 45 f4 mov %eax,-0xc(%ebp) f</func>…

システムコールの発行について

アセンブリにおけるシステムコール発行は、プログラミング言語における関数呼出しと同じで、 ・関数呼出時の引数指定は、レジスタへの値セットに相当する。 ・使用するレジスタ(どのレジスタに何の値をセットするか)は固定。 ・EAXレジスタにセットする値…

逆アセンブルで遊んでみる(6)関数内の処理を追いかけてみた

今回は、関数呼出しにおけるスタックの実装について、逆アセンブルを執拗に解析していきます。スタックという概念については、「積み上げられた本を取り出す時、一番上にある本から優先して取り出しが行われる」というたとえ話で説明されることが多いですが…

逆アセンブルで遊んでみる(5)自動変数の領域を16バイトを超えて確保

「自動変数の領域を16バイトを超えて確保」です。 void func(void) { int i = 0x7F; int j = 0x8F; int k = 0x9F; int l = 0xAF; int m = 0xBF; } 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 ec 20 sub $0x20,%esp 6: c7 45 ec 7f 00 00 00 movl $0x7f,-…

逆アセンブルで遊んでみる(4)自動変数に値をセット

「自動変数に値をセット」です。 /* asm004.c */ void func(void) { int n = 0x7F; } 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 ec 10 sub $0x10,%esp 6: c7 45 fc 7f 00 00 00 movl $0x7f,-0x4(%ebp) d: c9 leave e: c3 ret3行目で、スタックポインタ…

逆アセンブルで遊んでみる(3)signed long longの最大値を返す関数

「signed long longの最大値を返す関数」です。 unsigned long long func(void) { return 0x7FFFFFFFFFFFFFFFLL; } 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: b8 ff ff ff ff mov $0xffffffff,%eax 8: ba ff ff ff 7f mov $0x7fffffff,%edx d: 5d pop %ebp…

逆アセンブルで遊んでみる(2)signed intの最大値を返す関数

「signed intの最大値(2,147,483,647)を返す関数」です。 int func(void) { return 0x7FFFFFFF; } 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: b8 ff ff ff 7f mov $0x7fffffff,%eax 8: 5d pop %ebp 9: c3 ret intの最大値は「0x7FFFFFFF」ですが、バイナ…

逆アセンブルで遊んでみる(1)0を返す関数

「定数0を返す関数」の逆アセンブルです。 /* asm001.c */ int func(void) { return 0; } 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: b8 00 00 00 00 mov $0x0,%eax 8: 5d pop %ebp 9: c3 ret asm000.oとの差分を拾ってみると… ・eaxレジスタに対するmov命…

逆アセンブルで遊んでみる(0)何もしない関数

「フィーリングで読むアセンブラ入門」の発売が待ち遠しくて、いかにも発狂しそうですが、発売日まで、自分の環境で逆アセンブルして我慢しようということで…。今回のソースコードは、こんな内容。内部で何も行わない関数の逆アセンブルを行ってみます。 /* …

2の冪乗

well-knownな2の冪乗は、丸暗記してしまいましょう。 毎日、呪文のように唱えていれば、自然に暗記します(^ ^;) intの最大値は、「ニジュウイチオクヨンセンナナヒャクヨンジュウハチマンサンゼンロッピャクヨンジュウナナ」とかね。 2の冪乗 10進数 2^0 1…

array、&array[0]、&arrayの違い

添字指定の無い配列名を参照すると、「配列の先頭要素へのポインタ」として参照されますが、&演算子がついた配列名とは、どう違うのでしょうか。[array.c] 1 #include <stdio.h> 2 3 int main(void) 4 { 5 int array[5]; 6 7 printf("%p -> %p\n", array, array+1);</stdio.h>…

広域変数が配置されるセクション

※この実験は、以下の環境で実施しました。 $ gcc -v gcc バージョン 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1) $ as -V GNU アセンブラ バージョン 2.23.2 (i686-linux-gnu)、BFD バージョン (GNU Binutils for Ubuntu) 2.23.2 を使用 $ ld -v GNU ld (GNU Binu…

ポインタ変数のconst指定

#include <stdio.h> char s1[] = "This is array."; char *s2 = "This is pointer."; int main() { return 0; } このプログラムについて、nmコマンドでシンボルテーブルをダンプしてみると、以下のようになります。2フィールド目の「D」とは、その変数が、.dataセクシ</stdio.h>…

配列とポインタの違い(p87)

変数名とは「変数名」とは、データの格納領域の先頭アドレスを、human-readableに置き換えたシンボル名を指します。IPアドレスとホスト名の関係ですね。シンボル名に対応する格納領域の先頭アドレスは、プログラム内では「&」演算子でアドレスを表示したり、…

SRM 567 DIV2 250

(問題文は省略) 1 #include <stdio.h> 2 3 int NinjaTurtles_countOpponents(int P, int K) 4 { 5 int N; 6 int total; 7 8 for(N=P; (total=3*(N/K)+(N/3))</stdio.h>

SRM 569 DIV2 250

(問題文は省略)students[i]、students[i+1]、students[sizeof(students)-1]の各部屋について、Yodaを割り当てた場合における、Jediの必要人数を算出し、そのうち最小のJedi数を求める…というシミュレーションを行います。TheJediTestDiv2_countSupervisors…

SRM 570 DIV2 250

Cat Carolは、友人たちを自宅での食事に招待したいと考えている。 ・Carolは何本かの箸を持っており、これは長さが異なるものも含みうる。 ・それぞれの箸の長さを要素に含む配列(int[])が与えられる。 ・招待される友人には、同じ長さをペアとする箸を使…

SRM 571 DIV2 250

(問題文は省略)強いてポイントを挙げるなら、 "o"は左詰めで置かれるので、starを前方からカウントする場合、"-"の出現時点で、そのステージのループは打ちきってよい。ぐらいでしょうか。 1 #include <stdio.h> 2 3 #define NUMOF(array) (sizeof(array)/sizeof(*a</stdio.h>…

TopCoderの過去問数

今は、SRM DIV2の過去問について、最低スコアの問題を片っ端から解きまくっていますが、これって全部で何問あるのか。SRMの過去問は、現時点でNo144〜578の435問ありますが、各問につき難易度が3段階あるので、合計で1305問になります。僕は、難しい問題はど…

SRM 572 DIV2 250

与えられた整数の集合の総乗について、 ・正数の場合、文字列"POSITIVE"を返せ。 ・負数の場合、文字列"NEGATIVE"を返せ。 ・0の場合、文字列"ZERO"を返せ。総乗とは「集合に含まれる要素をすべて乗算した数」です。 要素数が多い場合、何も考えずに乗算して…

SRM 573 DIV2 250

・FoxCielが経営するスキー場には、N個のPlaceが存在する。 ・各Placeには、0〜N-1の番号が付与されている。 ・各Placeの高度が、int[] altitudeで与えられる。 その配列要素番号は、Placeの各番号に対応している。 ・スキーヤーは、各Placeを、0→1→…→N-1の…

SRM 574 DIV2 250

・2次元配列で定義されたcityMapが与えられる。 各セルには、"."または[A-Z]のいずれかの文字が代入されている。 ・cityMap上に出現する文字(A-Z)の出現回数を示す配列(int POIs[])が与えられる。 POIsの各要素の値が、どの文字の出現回数を示すものであ…

SRM 575 DIV2 250

与えられた整数の数列について、任意の2要素を入れ替えた時にできるユニークな数列は、何通り考えられるか。 入れ替えた後にできる数列は、元の数列と同じになる場合もある。要素を入れ替えてできる数列が、元の数列と同じになる場合もカウントしますが、「…

SRM576 DIV2 256

[問題] (省略)任意の水滴(intensity[intensity_i])について、スポンジαが受け止めると、αより下方にあるすべてのスポンジには到達しないので、αに使用した水滴要素の値を0にします。こうすることで、αより下方にあるスポンジのintensityの合計をとる際…

SRM577 DIV2 250

[問題] ・連続する母音(a/e/i/o/u/y)は、1文字に圧縮する。 ・ある文字列が与えられた時、圧縮後の文字列長を返せ。 ・ある文字列は、英字小文字のみで構成される。 [例] ・"eagaeoppooaaa" ⇒ "ea-g-aeo-p-p-ooaaa" ⇒ 6#include <iostream> #include <string> using name</string></iostream>…

SRM 578 DIV2 250

[問題] ・ある動物園に、鹿がN匹いる。 ・鹿は1匹につき、最大で2本のツノを持つ。 ・N匹のうち何匹かの鹿は、片方または両方のツノを落としている。 ・公園に落ちているツノは、合計でK本である。 ・「ツノが2本とも残っている鹿」の数の、考えられうる最…

文字列巡回置換

こちらの問題に、チャレンジしてみました。m(_ _)m http://rina.jpn.ph/rance/[出力結果] anny bany chery domy --------------------------- A B C D D A B C C D A B B C D A A B C Dput_row()関数は、指定された配列とその分割位置について、 1.分割位…

市松模様

こちらの問題に、チャレンジしてみました。m(_ _)m http://rina.jpn.ph/rance/[出力結果] ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** *****…