C++(アセンブリ)わけわからん…2

32	int main(int argc, char * argv[])
33	{
34	  Employee *yamato;
35	  yamato  = new Employee;
36	
37	  printf("size: %lX\n",sizeof(Employee));
38	
39	  yamato->number = 0x1111;
40	  strcpy(yamato->name,"Ymamamoto");
41	  yamato->pay = 0x100;
42	
43	  yamato->ShowData();
44	
45	  delete yamato;
46	  return 0;
47	}

new演算子使って、

   0x00001e30 <+0>:	push   ebp
   0x00001e31 <+1>:	mov    ebp,esp
   0x00001e33 <+3>:	push   esi
   0x00001e34 <+4>:	sub    esp,0x34
   0x00001e37 <+7>:	call   0x1e3c <main(int, char**)+12>
   0x00001e3c <+12>:	pop    eax
   0x00001e3d <+13>:	mov    ecx,DWORD PTR [ebp+0xc]
   0x00001e40 <+16>:	mov    edx,DWORD PTR [ebp+0x8]
   0x00001e43 <+19>:	mov    esi,0x88
   0x00001e48 <+24>:	mov    DWORD PTR [ebp-0x8],0x0
   0x00001e4f <+31>:	mov    DWORD PTR [ebp-0xc],edx
   0x00001e52 <+34>:	mov    DWORD PTR [ebp-0x10],ecx
   0x00001e55 <+37>:	mov    DWORD PTR [esp],0x88
   0x00001e5c <+44>:	mov    DWORD PTR [ebp-0x18],eax
   0x00001e5f <+47>:	mov    DWORD PTR [ebp-0x1c],esi
   0x00001e62 <+50>:	call   0x1efe
   0x00001e67 <+55>:	mov    ecx,DWORD PTR [ebp-0x18]
   0x00001e6a <+58>:	lea    edx,[ecx+0x137]
   0x00001e70 <+64>:	mov    esi,0x88
   0x00001e75 <+69>:	mov    DWORD PTR [ebp-0x14],eax
   0x00001e78 <+72>:	mov    DWORD PTR [esp],edx
   0x00001e7b <+75>:	mov    DWORD PTR [esp+0x4],0x88
   0x00001e83 <+83>:	mov    DWORD PTR [ebp-0x20],esi
   0x00001e86 <+86>:	call   0x1f04
   0x00001e8b <+91>:	mov    ecx,DWORD PTR [ebp-0x18]
   0x00001e8e <+94>:	lea    edx,[ecx+0x142]
   0x00001e94 <+100>:	mov    esi,DWORD PTR [ebp-0x14]
   0x00001e97 <+103>:	mov    DWORD PTR [esi],0x1111
   0x00001e9d <+109>:	mov    esi,DWORD PTR [ebp-0x14]
   0x00001ea0 <+112>:	add    esi,0x4
   0x00001ea6 <+118>:	mov    DWORD PTR [esp],esi
   0x00001ea9 <+121>:	mov    DWORD PTR [esp+0x4],edx
   0x00001ead <+125>:	mov    DWORD PTR [ebp-0x24],eax
   0x00001eb0 <+128>:	call   0x1f0a
   0x00001eb5 <+133>:	mov    ecx,DWORD PTR [ebp-0x14]
   0x00001eb8 <+136>:	mov    DWORD PTR [ecx+0x84],0x100
   0x00001ec2 <+146>:	mov    ecx,DWORD PTR [ebp-0x14]
   0x00001ec5 <+149>:	mov    DWORD PTR [esp],ecx
   0x00001ec8 <+152>:	mov    DWORD PTR [ebp-0x28],eax
   0x00001ecb <+155>:	call   0x1d70 <Employee::ShowData()>
   0x00001ed0 <+160>:	mov    eax,DWORD PTR [ebp-0x14]
   0x00001ed3 <+163>:	cmp    eax,0x0
   0x00001ed8 <+168>:	mov    DWORD PTR [ebp-0x2c],eax
   0x00001edb <+171>:	je     0x1eec <main(int, char**)+188>
   0x00001ee1 <+177>:	mov    eax,DWORD PTR [ebp-0x2c]
   0x00001ee4 <+180>:	mov    DWORD PTR [esp],eax
   0x00001ee7 <+183>:	call   0x1ef8
   0x00001eec <+188>:	mov    eax,0x0
   0x00001ef1 <+193>:	add    esp,0x34
   0x00001ef4 <+196>:	pop    esi
   0x00001ef5 <+197>:	pop    ebp
   0x00001ef6 <+198>:	ret  


わけわからん①

本なら、push 88hして、callしてるから、0x88バイト分の
領域を割り当ててるんだな。ってわかるけど、
pushもしてないし、callもしてないし、ワケガワカラナイヨ.

(o´・ω・`)

わけわからん②

ちょっとまって…このアセンブリmovばっかりで
pushなくね?どうやってメンバ変数やったり、関数の引数を表現してるの?

って書いてて思いついたんだけど、pushしないでもespに直接movすれば
同じことを表現できるってことか。憶測でしか無いけど.
(for example)

   0x00001e78 <+72>:	mov    DWORD PTR [esp],edx

push使おうや…


ucqさんやポテチ先生みたいな憶測パワー欲しい…

実を言うと、gdbが動的解析ツールなのに、まだdisassしてしか見てないとかいう
クソ人間です。使い方が「美しき策謀」あと2回ぐらい見ます…

C++(アセンブリ)わけわからん…

#include<stdio.h>
#include<iostream>
#include<string.h>

class Employee
{
  public:
    int number;
    char  name[128];
    long pay;
    void ShowData();
    void Test();
};

void Employee::ShowData()
{
  printf("number: %d\n",number);
  printf("name: %s\n",name);
  printf("pay: %ld\n",pay);

  Test();

  return;
}

void Employee::Test()
{
  printf("Test function\n");
  return;
}

int main(int argc, char * argv[])
{
  Employee yamato;

  printf("size: %lX\n",sizeof(Employee));

  yamato.number = 0x1111;
  strcpy(yamato.name,"Ymamamoto");
  yamato.pay = 0x100;

  yamato.ShowData();

  return 0;
}
g++ -m32 -g class.cpp

しました。
これをgdbでやると,

(gdb) disas main
Dump of assembler code for function main(int, char**):
   0x00001e40 <+0>:	push   ebp
   0x00001e41 <+1>:	mov    ebp,esp
   0x00001e43 <+3>:	push   edi
   0x00001e44 <+4>:	push   esi
   0x00001e45 <+5>:	sub    esp,0xb0
   0x00001e4b <+11>:	call   0x1e50 <main(int, char**)+16>
   0x00001e50 <+16>:	pop    eax
   0x00001e51 <+17>:	mov    ecx,DWORD PTR [ebp+0xc]
   0x00001e54 <+20>:	mov    edx,DWORD PTR [ebp+0x8]
   0x00001e57 <+23>:	mov    esi,DWORD PTR [eax+0x1b8]
   0x00001e5d <+29>:	mov    esi,DWORD PTR [esi]
   0x00001e5f <+31>:	mov    DWORD PTR [ebp-0xc],esi
   0x00001e62 <+34>:	lea    esi,[eax+0x12d]
   0x00001e68 <+40>:	mov    edi,0x88
   0x00001e6d <+45>:	mov    DWORD PTR [ebp-0x10],0x0
   0x00001e74 <+52>:	mov    DWORD PTR [ebp-0x14],edx
   0x00001e77 <+55>:	mov    DWORD PTR [ebp-0x18],ecx
   0x00001e7a <+58>:	mov    DWORD PTR [esp],esi
   0x00001e7d <+61>:	mov    DWORD PTR [esp+0x4],0x88
   0x00001e85 <+69>:	mov    DWORD PTR [ebp-0xa4],eax
   0x00001e8b <+75>:	mov    DWORD PTR [ebp-0xa8],edi
   0x00001e91 <+81>:	call   0x1f18
   0x00001e96 <+86>:	mov    ecx,DWORD PTR [ebp-0xa4]
   0x00001e9c <+92>:	lea    edx,[ecx+0x138]
   0x00001ea2 <+98>:	lea    esi,[ebp-0xa0]
   0x00001ea8 <+104>:	mov    DWORD PTR [ebp-0xa0],0x1111
   0x00001eb2 <+114>:	add    esi,0x4
   0x00001eb8 <+120>:	mov    DWORD PTR [esp],esi
   0x00001ebb <+123>:	mov    DWORD PTR [esp+0x4],edx
   0x00001ebf <+127>:	mov    DWORD PTR [ebp-0xac],eax
   0x00001ec5 <+133>:	call   0x1f1e
   0x00001eca <+138>:	lea    ecx,[ebp-0xa0]
   0x00001ed0 <+144>:	mov    DWORD PTR [ebp-0x1c],0x100
   0x00001ed7 <+151>:	mov    DWORD PTR [esp],ecx
   0x00001eda <+154>:	mov    DWORD PTR [ebp-0xb0],eax
   0x00001ee0 <+160>:	call   0x1d80 <Employee::ShowData()>
   0x00001ee5 <+165>:	mov    eax,DWORD PTR [ebp-0xa4]
   0x00001eeb <+171>:	mov    ecx,DWORD PTR [eax+0x1b8]
   0x00001ef1 <+177>:	mov    ecx,DWORD PTR [ecx]
   0x00001ef3 <+179>:	mov    edx,DWORD PTR [ebp-0xc]
   0x00001ef6 <+182>:	cmp    ecx,edx
   0x00001ef8 <+184>:	jne    0x1f0d <main(int, char**)+205>
   0x00001efe <+190>:	mov    eax,0x0
   0x00001f03 <+195>:	add    esp,0xb0
   0x00001f09 <+201>:	pop    esi
   0x00001f0a <+202>:	pop    edi
   0x00001f0b <+203>:	pop    ebp
   0x00001f0c <+204>:	ret    
   0x00001f0d <+205>:	call   0x1f12


わけわからん①

   0x00001e40 <+0>:	push   ebp
   0x00001e41 <+1>:	mov    ebp,esp
   0x00001e43 <+3>:	push   edi
   0x00001e44 <+4>:	push   esi
   0x00001e45 <+5>:	sub    esp,0xb0

edi/esiをスタックにプッシュするの初めて見る。どの規約なんだろうか?
retnの後ろにスタックを調整するものもないし、__cdeclかな。多分.


わけわからん②

   0x00001e4b <+11>:	call   0x1e50 <main(int, char**)+16>
   0x00001e50 <+16>:	pop    eax

なんか只々、次の行に進んでるだけにも見える。
その次、popしてる意味がわからん。
callしたら、自ずとretnの時点でeaxには関数の返り値は入ってるはず。
それをなぜあえて、スタックにpushされてた値をeaxに入れるのか。
それじゃあなんのためにcallしたのか。わからん。


わけわからん③

   0x00001e51 <+17>:	mov    ecx,DWORD PTR [ebp+0xc]
   0x00001e54 <+20>:	mov    edx,DWORD PTR [ebp+0x8]

(gdb) print 0xc
$1 = 12
多分、第2引数の値をecxに
第1引数の値をedxに代入…
ってmain関数に引数もなんもないやろ!
ってなってる。

わけわからん④

   0x00001e57 <+23>:	mov    esi,DWORD PTR [eax+0x1b8]
   0x00001e5d <+29>:	mov    esi,DWORD PTR [esi]

↑これ(eax)、なんのオフセットですか?

わけわからん⑤
>>> 0xb0
176
でしょ。

   0x00001e6d <+45>:	mov    DWORD PTR [ebp-0x10],0x0
   0x00001e74 <+52>:	mov    DWORD PTR [ebp-0x14],edx
   0x00001e77 <+55>:	mov    DWORD PTR [ebp-0x18],ecx
   0x00001e7a <+58>:	mov    DWORD PTR [esp],esi
   0x00001e7d <+61>:	mov    DWORD PTR [esp+0x4],0x88
   0x00001e85 <+69>:	mov    DWORD PTR [ebp-0xa4],eax
   0x00001e8b <+75>:	mov    DWORD PTR [ebp-0xa8],edi

見る限り、ローカル変数の、第3、第2、第1順に考えて、
0x0,edx,ecxが代入されてる状態やね。

 a = ecx;
 b = edx;
 c = 0x0;


ダメだ…途中で断念…
ここまで分かる人いますか?

【追記】

↑のまんまですね。
なんでわかるのかがわからない。
③のint main(... ちょっとぐらい察してはいたけど
②とか理解できる意味がわからない…w

追々頑張っていきます…

人生 は 技術

このキャンプ

?いきます
ついでに筑波の見学に...
いや、メインは筑波の見学で、
こっちがサブ。

あと上のLife is Techとは別で、
春キャンプがあるんですが、
「そんなんに金払ってられるか!無料で行かせろ!」

って思ったら、
奨学金制度がある...
奨学金制度だと!とりま受けるか!」

って受けて、

一次審査の報告日…来ない!堕ちたか。

って思ったら、
mail < 【Life is Tech!Scholarship】第一次審査結果発表延期のお願い
なんか人数が多いらしくて、遅れると…


じゃあ今日…
mail < 【Life is Tech!Scholarship】第一次審査通過のお知らせ

1次審査通ったので、2次審査がんばります!

無理な気がしてきた…

学校に慣れてきて…

最近、ようやく学校にも慣れてきました.
慣れるのに2年かかりました.
あと、プロセッサ面白い。

~おすすめ~

午夜の待ち合わせ

午夜の待ち合わせ

プロセッサを支える技術  ??果てしなくスピードを追求する世界 (WEB+DB PRESS plus)

プロセッサを支える技術  ??果てしなくスピードを追求する世界 (WEB+DB PRESS plus)

カッコイイです。

銀河街の悪夢

SEKAI NO OWARIの「銀河街の悪夢」を聴いてから

希望を捨てることが出来て,気持ちがスゴイ楽になりました.

Boo始めました

Booの良い資料もないし、
どっかのサイト見ても英語ばっかりだし
本もないし、って感じでやろうかやらないか
ずっと考えてたら良いサイトあったのでやりました。

今日は匿名関数っていうのに感動しました。

//Boo
>>>def f(s as string):
...    return def(q as string):
...        return s+q
...    
>>>f("Hello, ")
Input15Module+$f$closure$1.Invoke
>>>a=_
Input15Module+$f$closure$1.Invoke
>>>a("World")
'Hello, World'

>>>def make_i(n as int):
...    return {x as int|x + n}
...    
...    
>>>make_i(10)
Input2Module+$make_i$closure$1.Invoke
>>>a=_
Input2Module+$make_i$closure$1.Invoke
>>>a(20)
30
//こういうことも...

というものです。
匿名関数はPythonに入ってないんじゃないかって思ったけど、
lambdaとは別なのかな〜って思ったり。

#Python
>>> def f(s):
...  return lambda q: s+q
... 
>>> f("Hello, ")("World")
'Hello, World'

正直lambdaとか一行関数のときにしかつかったことなくて
今初めてこんな使い方しました。なんか自分でも驚いた。

他に似てる所はぁ…

//Boo
>>>[1,"2",3.0,"FOUR"]
[1, '2', 3, 'FOUR']
>>>c=_
[1, '2', 3, 'FOUR']
>>>c[1]
'2'
>>>c[-1]
'FOUR'

//Pythonならappendとかremoveだけど
//Booなら
>>>c.Add("HOGEHOGE")
[1, '2', 3, 'FOUR', 'HOGEHOGE']
>>>c
[1, '2', 3, 'FOUR', 'HOGEHOGE']
>>>c.Remove("2")
[1, 3, 'FOUR', 'HOGEHOGE']
>>>c.RemoveAt(2)  
[1, 3, 'HOGEHOGE']
>>>c.Clear()
>>>c
[]

//Pythonより豊富だと…?

>>>for i in range(10):
...    print(i)
...    
...    
0
1
2
3
4
5
6
7
8
9
>>>{"a":10,"b":20}
{'a': 10, 'b': 20}
>>>a=_
{'a': 10, 'b': 20}
>>>a["a"]
10
>>>a["b"]
20

>>>l = [i for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>l.Collect({x as int | x%2==0})
[0, 2, 4, 6, 8]
//これはPythonでいう
/*
>>> [i for i in range(10) if i%2==0]
[0, 2, 4, 6, 8]
な、はず。
*/

##結論##
PythonとBooは似た兄弟のようです。

Pygameたのしぃ

最終的にはマリオ&ルイージRPG的なものを作りたいなと思って
ゲームを作りたいと思い始めたわけなんですが、
どうすりゃあゲーム作れるとか考えたこと(Unityは違う)もないので、
どりまPygameさわろうと思って、適当に触ってたら
「これたのしい」ってなって、土曜日にオセロつくろうと思って
作ったら、あっさり出来ました☆

f:id:reonreon3reon:20140121214110p:plain

こんな感じ。

f:id:reonreon3reon:20140121214126p:plain

まぁこんな感じ。

思いの外簡単です。Pygameいいっす。

次はRPGに行こうかと思うけど、PygameRPGとか無理有るだろw
って感じなのでUnityでBoo使ってつくろうかと思ってます。
けど、資料少なすぎて死にそう。

田園

年が明けて、クソみたいな生活してたときに、
ずっとyoutubeセカオワlocksを聴いてたわけですよ。
すると、愛しの深瀬くんが「H ZETT M」さんの「田園(でいえん)」が
すごく良いって言ってて、田園聴きながら「銀の月」を書いてたそうです。
ので、すぐにAmazonで買いました。

5+2=11

5+2=11

えっとですね…。
めっっっっちゃいいです。
ていうか、ここ2日これしか聴いてないです。
田園聴きながら、中学校までの道のりを歩いたりしてたんですけど、
すっごく気持ちよかったです。はい。
是非、試して下さい。

Fuzzing->Pygame鬱

最近、新年も明けてクソ(コンピュータに関係ない)生活を送ってましたー
マンガ読んで、アニメ見て、麻雀して、ギターとかピアノ弾いて、
物語書く猿真似して、セカオワlocks見まくって、
カラオケして、髪の毛染めて、酒のんで、タバコ吸って、マリファナ吸って…
とまぁ最後辺りは嘘ですが、相変わらずのクズっぷりを発揮しました。

前までは低レイヤかっこいいばっかりだったけど、実は僕高レイヤのほうが好きなんじゃないか
って思えてきたので、思い切ってPythonで出来そうなGUIのモジュール探しました。
じゃあ、PySideとかPygameとか良さそうなのが出てきたので、
とりあえず両方入れました。

正直、PySideはPyQtベースなんですが、チュートリアルとか少なくて死にそう。
だから、Pygameやることにしました(↓の本読んでます)

Making Games With Python & Pygame

Making Games With Python & Pygame

で、マジFxxkin'難しいFuzzing(洋書)とかいう本より断然読みやすくて、
1,2時間でChapter3まで読みました。

SurfaceオブジェクトとRectオブジェクトの違いとかのわかりやすい説明もありました
なぜ、pygame.time.clockオブジェクトを使う必要があるのかとかもありました。

この本によく FPS と出てきますが、
〖 first person shooting 〗
操作する人の視点で場面が表示され 3 次元シューティング-ゲーム(標的を打ち落とすゲーム)の総称。

ではありません。
Frames Per Second
の略です。
pygame.fontオブジェクトで特定のフォントで字がかけまーす。
環境はBackTrack5なんですけど、pygame.mixerが入ってなくて死にそう。
せっかく音楽流そうと思ったのに。なんでなんだろう。


f:id:reonreon3reon:20140112053823p:plain
個人的に、Macはこういうことが簡単にできるので好きです。

あと、「え?なんのための関数?」という場合には
sylvan5先生のブログとかドキュメント
があるので安心してかけます。

以上。今日適当に始めたPygameの話でしたー。
引き続き読んでは、更新したいと思います。

年末。最近の僕。

ファジングツール作るぞ!などと言って、
ファジングの本読んで、
「これはもっと根本的にネットワークの知識がいるぞ」と思って
ネットワークバイブル読んで、ある程度理解出来たけど
第6,7章までのところで難しくなって挫折しそうになって、
心が折れる前にやめて、
ファジングのフェーズに攻撃可能か判定のために
リバース・エンジニアリングしないといけないと思って
楽しいバイナリの歩き方読んで、楽しくなったけど…
…。次にGray Python読もうかアナライジングマルウェア読むか悩んで。
悩んだけど、「お前(自分)はファズツール作りたいって言ったんじゃないか」
ってまた葛藤に苦しんで…辛くなって…
両立できるほど自分が器用でないことも知ってるし
片方を超頑張ってたら、もう片方出来ないようになってるんじゃないかって
怖くなることも知ってるし
もうどうでもよくなれと感じた。
それに追い打ちを掛けるように、
筑波大学に編入したいために學校の勉強とかTOEIC対策とかがんばったり、
面接の時のためにセキュスペいるんじゃないかと悩んだり
気持ち悪くなった。

けど、すてるっさんに本を送ってもらったり両親にiPadAir買ってもらったりして
心が軽くなったです。

こんなことで悩んでるようでは未熟だと実感する一方で
去年コンピュータに出会ってこういうことで悩めるようになったのだと思うと
また、心が軽くなった気もした。

DNSのメモ

>>> dnsquery
<IP  frag=0 proto=udp |<UDP  sport=<RandShort> dport=domain |<DNS  opcode=QUERY qdcount=1 |<DNSQR  qname='www.facebook.com' qtype=A qclass=IN |>>>>
>>> dnsquery.dst='129.250.35.250'
>>> dnsquery1=_
>>> sr1(dnsquery1)
Begin emission:
.Finished to send 1 packets.
*
Received 2 packets, got 1 answers, remaining 0 packets
<IP  version=4L ihl=5L tos=0x0 len=102 id=39600 flags=DF frag=0L ttl=244 proto=udp chksum=0x8419 src=129.250.35.250 dst=192.168.1.32 options='' |<UDP  sport=domain dport=33745 len=82 chksum=0x680d |<DNS  id=0 qr=1L opcode=QUERY aa=0L tc=0L rd=0L ra=1L z=0L rcode=ok qdcount=1 ancount=2 nscount=0 arcount=0 qd=<DNSQR  qname='www.facebook.com.' qtype=A qclass=IN |> an=<DNSRR  rrname='www.facebook.com.' type=CNAME rclass=IN ttl=1473 rdata='star.c10r.facebook.com.' |<DNSRR  rrname='star.c10r.facebook.com.' type=A rclass=IN ttl=55 rdata='31.13.82.17' |>> ns=None ar=None |>>>
>>> dnsres=_
>>> dnsres.show()
###[ IP ]###
  version= 4L
  ihl= 5L
  tos= 0x0
  len= 102
  id= 39600
  flags= DF
  frag= 0L
  ttl= 244
  proto= udp
  chksum= 0x8419
  src= 129.250.35.250
  dst= 192.168.1.32
  options= ''
###[ UDP ]###
     sport= domain
     dport= 33745
     len= 82
     chksum= 0x680d
###[ DNS ]###
        id= 0
        qr= 1L
        opcode= QUERY
        aa= 0L
        tc= 0L
        rd= 0L
        ra= 1L
        z= 0L
        rcode= ok
        qdcount= 1
        ancount= 2
        nscount= 0
        arcount= 0
        \qd\
         |###[ DNS Question Record ]###
         |  qname= 'www.facebook.com.'
         |  qtype= A
         |  qclass= IN
        \an\
         |###[ DNS Resource Record ]###
         |  rrname= 'www.facebook.com.'
         |  type= CNAME
         |  rclass= IN
         |  ttl= 1473
         |  rdlen= 24
         |  rdata= 'star.c10r.facebook.com.'
         |###[ DNS Resource Record ]###
         |  rrname= 'star.c10r.facebook.com.'
         |  type= A
         |  rclass= IN
         |  ttl= 55
         |  rdlen= 4
         |  rdata= '31.13.82.17'
        ns= None
        ar= None
>>> 

>>> dnsquery.dst='8.8.8.8'
>>> sr1(dnsquery)
Begin emission:
Finished to send 1 packets.
*
Received 1 packets, got 1 answers, remaining 0 packets
<IP  version=4L ihl=5L tos=0x0 len=102 id=54023 flags= frag=0L ttl=44 proto=udp chksum=0xe9a7 src=8.8.8.8 dst=192.168.1.32 options='' |<UDP  sport=domain dport=46948 len=82 chksum=0xd7bc |<DNS  id=0 qr=1L opcode=QUERY aa=0L tc=0L rd=0L ra=1L z=0L rcode=ok qdcount=1 ancount=2 nscount=0 arcount=0 qd=<DNSQR  qname='www.facebook.com.' qtype=A qclass=IN |> an=<DNSRR  rrname='www.facebook.com.' type=CNAME rclass=IN ttl=1688 rdata='star.c10r.facebook.com.' |<DNSRR  rrname='star.c10r.facebook.com.' type=A rclass=IN ttl=3 rdata='31.13.68.16' |>> ns=None ar=None |>>>
>>> dnsres=_
>>> dnsres.show()
###[ IP ]###
  version= 4L
  ihl= 5L
  tos= 0x0
  len= 102
  id= 54023
  flags= 
  frag= 0L
  ttl= 44
  proto= udp
  chksum= 0xe9a7
  src= 8.8.8.8
  dst= 192.168.1.32
  options= ''
###[ UDP ]###
     sport= domain
     dport= 46948
     len= 82
     chksum= 0xd7bc
###[ DNS ]###
        id= 0
        qr= 1L
        opcode= QUERY
        aa= 0L
        tc= 0L
        rd= 0L
        ra= 1L
        z= 0L
        rcode= ok
        qdcount= 1
        ancount= 2
        nscount= 0
        arcount= 0
        \qd\
         |###[ DNS Question Record ]###
         |  qname= 'www.facebook.com.'
         |  qtype= A
         |  qclass= IN
        \an\
         |###[ DNS Resource Record ]###
         |  rrname= 'www.facebook.com.'
         |  type= CNAME
         |  rclass= IN
         |  ttl= 1688
         |  rdlen= 24
         |  rdata= 'star.c10r.facebook.com.'
         |###[ DNS Resource Record ]###
         |  rrname= 'star.c10r.facebook.com.'
         |  type= A
         |  rclass= IN
         |  ttl= 3
         |  rdlen= 4
         |  rdata= '31.13.68.16'
        ns= None
        ar= None


>>> dnsquery.dst='8.8.4.4'
>>> sr1(dnsquery)
Begin emission:
.Finished to send 1 packets.
*
Received 2 packets, got 1 answers, remaining 0 packets
<IP  version=4L ihl=5L tos=0x0 len=102 id=42349 flags= frag=0L ttl=44 proto=udp chksum=0x1b46 src=8.8.4.4 dst=192.168.1.32 options='' |<UDP  sport=domain dport=59755 len=82 chksum=0xa3a0 |<DNS  id=0 qr=1L opcode=QUERY aa=0L tc=0L rd=0L ra=1L z=0L rcode=ok qdcount=1 ancount=2 nscount=0 arcount=0 qd=<DNSQR  qname='www.facebook.com.' qtype=A qclass=IN |> an=<DNSRR  rrname='www.facebook.com.' type=CNAME rclass=IN ttl=3198 rdata='star.c10r.facebook.com.' |<DNSRR  rrname='star.c10r.facebook.com.' type=A rclass=IN ttl=21 rdata='31.13.68.49' |>> ns=None ar=None |>>>
>>> dnsres=_
>>> dnsres.show()
###[ IP ]###
  version= 4L
  ihl= 5L
  tos= 0x0
  len= 102
  id= 42349
  flags= 
  frag= 0L
  ttl= 44
  proto= udp
  chksum= 0x1b46
  src= 8.8.4.4
  dst= 192.168.1.32
  options= ''
###[ UDP ]###
     sport= domain
     dport= 59755
     len= 82
     chksum= 0xa3a0
###[ DNS ]###
        id= 0
        qr= 1L
        opcode= QUERY
        aa= 0L
        tc= 0L
        rd= 0L
        ra= 1L
        z= 0L
        rcode= ok
        qdcount= 1
        ancount= 2
        nscount= 0
        arcount= 0
        \qd\
         |###[ DNS Question Record ]###
         |  qname= 'www.facebook.com.'
         |  qtype= A
         |  qclass= IN
        \an\
         |###[ DNS Resource Record ]###
         |  rrname= 'www.facebook.com.'
         |  type= CNAME
         |  rclass= IN
         |  ttl= 3198
         |  rdlen= 24
         |  rdata= 'star.c10r.facebook.com.'
         |###[ DNS Resource Record ]###
         |  rrname= 'star.c10r.facebook.com.'
         |  type= A
         |  rclass= IN
         |  ttl= 21
         |  rdlen= 4
         |  rdata= '31.13.68.49'
        ns= None
        ar= None

ふぅーん

プロセスあたりで躓く…(テスト一週間前

#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>

int main(void)
{
  int a = 0;
  pid_t pid;

  if((pid = fork()) == 0){
    puts("Child PID");
    a++;
    printf("a = %d\n&a = %p\n",a,&a);
    printf("getpid():%d\n",getpid());
    _exit(0);
  }else if(pid > 0){
    a=10;
    puts("Parent PID");
    printf("a = %d\n&a = %p\n",a,&a);
    printf("getpid():%d\n\n",getpid());
    _exit(0);
  }else{
    _exit(0);
  }
  return(0);
}
Parent PID
a = 10
&a = 0xbfe0d65c
getpid():27634

Child PID                                                                                                                                                    
a = 1
&a = 0xbfe0d65c
getpid():27635

なんのへんてつもないように見えるけど、
親プロセスが、&a = 0xbfe0d65cでさきに実行してるなら、
&aは10が代入されてます。
それから、子プロセスが1を出力しているからローカル変数だけど、
違うアドレス(よは0xbfe0d65cでないアドレス)が使われていると思ってました。
しかし、子プロセスの&a = 0xbfe0d65cという全く同じアドレスの変数をインクリメントしたら
ローカル変数a=0 + 1した形になってる。
(もし、同じアドレスでかつさきにaが代入されているならa=10 + 1だと思う…)

なんでなんでしょうか…。

gdb使って、検証しようと思ったけど、
普通に実行すると、子プロセスでのブレイクポイント無視されるし、
set follow-fork-modeにすると
親プロセスでのブレイクポイント無視されるし、
端的に言えば、慣れてないだけなんだけど嫌になったので、、
ぽてちせんせいとかじりずせんせいとかに聞こうっと、、

Server_socket()【復習編】

今日はここまで本もサイトも見ずに書くことができましたー。

#include<stdio.h>
#include<stdlib.h>

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>


void fatal(int errcode,char *errname,struct addrinfo *res){
  fprintf(stderr,"%s():%s\n",errname,gai_strerror(errcode));
  freeaddrinfo(res);
  return(-1);
  
}

void fatal2(int sockfd,char *errname,struct addrinfo *res){
  perror(errname);
  freeaddrinfo(res);
  (void)close(sockfd);
  return(-1);

}

int server_socket(const char *hostnm,const char *portnm)
{
  int sockfd,errcode;
  struct addrinfo hints,*res0;
  char hbuf[NI_MAXHOST];
  char sbuf[NI_MAXSERV];

  (void)memset(&hints,0,sizeof(hints));
  hints.ai_family     = AF_INET;
  hints.ai_socktype   = SOCK_STREAM;
  hints.ai_flags      = AI_PASSIVE;

  if ((errcode = getaddrinfo(hostnm,portnm,&hints,&res0)) != 0)
    return(fatal(errcode,"getaddrinfo",res0));

  if ((errcode = getnameinfo(res0->ai_addr,res0->ai_addrlen,
                              hbuf,sizeof(hbuf),
                              sbuf,sizeof(sbuf),
                              NI_NUMERICHOST | NI_NUMERICSR)) != 0)
    return(fatal(errcode,"getnameinfo",res0));
  fprintf(stderr,"host = %s \nserv = %s\n",hbuf,sbuf);

  if((sockfd = socket(res0->ai_family,res0->ai_socktype,res0->ai_protocol)) == -1){
    perror("socket");
    freeaddrinfo(res0);
    return(-1);
  }

  int opt = 1;
  socklen_t opt_len = sizeof(opt);
  if((setsockopt(sockfd,SOL_SOCKET,SO_REUSERADDR,&opt,opt_len)) == -1)
  //void fatal2(int sockfd,char *errname,struct addrinfo *res)
    return(fatal2(sockfd,"socket",res0));

  if((bind(sockfd,res0->ai_addr,res0->ai_addrlen)) == -1)
    return(fatal2(sockfd,"bind",res0));

  if((listen(sockfd,SOMAXCONN) == -1))
    return(fatal2(sockfd,"listen",res0));

  freeaddrinfo(res0);
  return(sockfd);

結構時間かかるけど面白い。
さー、どんどんacceptとかsend_recvとかも書けるようになろう。

(もはや記憶力の問題かよ。)

インラインアセンブリ

〜メモ〜

int main(void)
{
 asm(“.intel_syntax noprefix;”
  “call hello;”
  “.ascii \"Hello World\12\0\”;“
  "hello:”
  //write(1,“Hello world\n”,13)
  “pop ecx;” 
  “mov eax,4;”
  “mov ebx,1;”
  “mov edx,13;”
  “int 0x80;”
  //exit(0)
  “mov eax,0;”
  “mov ebx,0;”
  “int 0x80;”
  “.att_syntax;”
 );
 return(0);
}