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;
ダメだ…途中で断念…
ここまで分かる人いますか?
【追記】
@ashigirl96 ①ただのレジスタをスタックに退避してるだけ。②mov eax,eipと等価。③int main(int argc, char**argv, char**env)
— 勇士Q (@ucq) 2014, 3月 7
↑のまんまですね。
なんでわかるのかがわからない。
③のint main(... ちょっとぐらい察してはいたけど
②とか理解できる意味がわからない…w
追々頑張っていきます…
人生 は 技術
このキャンプ
?いきます
ついでに筑波の見学に...
いや、メインは筑波の見学で、
こっちがサブ。
あと上のLife is Techとは別で、
春キャンプがあるんですが、
「そんなんに金払ってられるか!無料で行かせろ!」
って思ったら、
奨学金制度がある...
「奨学金制度だと!とりま受けるか!」
って受けて、
一次審査の報告日…来ない!堕ちたか。
って思ったら、
mail < 【Life is Tech!Scholarship】第一次審査結果発表延期のお願い
なんか人数が多いらしくて、遅れると…
じゃあ今日…
mail < 【Life is Tech!Scholarship】第一次審査通過のお知らせ
1次審査通ったので、2次審査がんばります!
無理な気がしてきた…
学校に慣れてきて…
最近、ようやく学校にも慣れてきました.
慣れるのに2年かかりました.
あと、プロセッサ面白い。
~おすすめ~
- アーティスト: Hello Sleepwalkers
- 出版社/メーカー: A-Sketch
- 発売日: 2014/01/29
- メディア: CD
- この商品を含むブログ (5件) を見る
プロセッサを支える技術 ??果てしなくスピードを追求する世界 (WEB+DB PRESS plus)
- 作者: Hisa Ando
- 出版社/メーカー: 技術評論社
- 発売日: 2011/01/06
- メディア: 単行本(ソフトカバー)
- 購入: 22人 クリック: 250回
- この商品を含むブログ (46件) を見る
カッコイイです。
銀河街の悪夢
SEKAI NO OWARIの「銀河街の悪夢」を聴いてから
希望を捨てることが出来て,気持ちがスゴイ楽になりました.
- アーティスト: SEKAI NO OWARI
- 出版社/メーカー: トイズファクトリー
- 発売日: 2014/01/22
- メディア: CD
- この商品を含むブログ (1件) を見る
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は似た兄弟のようです。
田園
年が明けて、クソみたいな生活してたときに、
ずっとyoutubeでセカオワlocksを聴いてたわけですよ。
すると、愛しの深瀬くんが「H ZETT M」さんの「田園(でいえん)」が
すごく良いって言ってて、田園聴きながら「銀の月」を書いてたそうです。
ので、すぐにAmazonで買いました。
- アーティスト: H ZETT M
- 出版社/メーカー: BMG JAPAN
- 発売日: 2007/01/10
- メディア: CD
- クリック: 8回
- この商品を含むブログ (26件) を見る
えっとですね…。
めっっっっちゃいいです。
ていうか、ここ2日これしか聴いてないです。
田園聴きながら、中学校までの道のりを歩いたりしてたんですけど、
すっごく気持ちよかったです。はい。
是非、試して下さい。
Fuzzing->Pygame鬱
最近、新年も明けてクソ(コンピュータに関係ない)生活を送ってましたー
マンガ読んで、アニメ見て、麻雀して、ギターとかピアノ弾いて、
物語書く猿真似して、セカオワlocks見まくって、
カラオケして、髪の毛染めて、酒のんで、タバコ吸って、マリファナ吸って…
とまぁ最後辺りは嘘ですが、相変わらずのクズっぷりを発揮しました。
前までは低レイヤかっこいいばっかりだったけど、実は僕高レイヤのほうが好きなんじゃないか
って思えてきたので、思い切ってPythonで出来そうなGUIのモジュール探しました。
じゃあ、PySideとかPygameとか良さそうなのが出てきたので、
とりあえず両方入れました。
正直、PySideはPyQtベースなんですが、チュートリアルとか少なくて死にそう。
だから、Pygameやることにしました(↓の本読んでます)
Making Games With Python & Pygame
- 作者: Al Sweigart
- 出版社/メーカー: Createspace
- 発売日: 2012/01/12
- メディア: ペーパーバック
- この商品を含むブログを見る
で、マジFxxkin'難しいFuzzing(洋書)とかいう本より断然読みやすくて、
1,2時間でChapter3まで読みました。
SurfaceオブジェクトとRectオブジェクトの違いとかのわかりやすい説明もありました
なぜ、pygame.time.clockオブジェクトを使う必要があるのかとかもありました。
この本によく FPS と出てきますが、
〖 first person shooting 〗
操作する人の視点で場面が表示され 3 次元シューティング-ゲーム(標的を打ち落とすゲーム)の総称。
ではありません。
Frames Per Second
の略です。
pygame.fontオブジェクトで特定のフォントで字がかけまーす。
環境はBackTrack5なんですけど、pygame.mixerが入ってなくて死にそう。
せっかく音楽流そうと思ったのに。なんでなんだろう。
個人的に、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); }