なにも見ずにserver_socket書こうとして…
何も見ずにserverをどこまで書けるか練習してみたら
#include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<netdb.h> #include< int server_socket(const char *portnm){ int sockfd,errcode; struct addrinfo hints,*res0; char hbuf[NI_MAXHOST],sbuf[NI_MAXSERV]; (void)memset(&hints,NULL,sizeof(hints)); hints.ai_family = AF_INET; hints.socktype = SOCK_STREAM; hints.flags = PASSIVE; if ((errcode = getnaddrinfo(0,0,&hints,&res0)) == -1){ fprintf(stderr,"getaddrinfo():%d\n",gai_strerror(errcode)); freeaddrinfo(res0); exit(0); } if ((errcode = getnameinfo(res0->ai_addr,res0->ai_addrlen, hbuf,sizeof(hbuf), sbuf,sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV) == 0) = -1){ fprintf(stderr,"getnameinfo():%d\n",gai_strerror(errcode)); freeaddrinfo(res0); exit(0); } if ((sockfd = socket(res0->ai_family,res0->ai_socktype,ai_protocol)) == -1){ fprintf(stderr,"socket():%d\n",gai_strerror(errcode)); freeaddrinfo(res0); (void)close(sockfd); exit(0); } if (( }
ぐらいまでしか書けませんでした…
もっとやらんと…。
〜メモ〜
struct sockaddr *res0; struct sockaddr_storage from; (res0->ai_sockaddr,res0->ai_addrlen) == ( (struct sockaddr *) &from ,len )
ッて言うことか…
Intel風
HACKINGのP.345の/bin/shを起動するために文字を16進数に直す必要があるそうで。
これから学校の授業でもアセンブリ書かないとダメだから、16進数に直すソース書いてみた。
Test:
$ python to_hex.py >>//sh 0x68732f2f >>/bin 0x6e69622f >>exit
結果はいい感じ
Source Code
while True: ex = raw_input(">>") if ex=="exit":break tmp,tmp2="","" result="" for i in ex: tmp += hex(ord(i)) else: tmp = tmp[2:].replace('x','') for i,tm in enumerate(tmp): if i%3==2: continue tmp2 += tm va1 = tmp2.replace('x','')[::-2] va2 = tmp2.replace('x','')[-2::-2] for i,re in enumerate(va2): result += re + va1[i] else: for s in range(0,len(result),8): print "0x{0}".format(result[s:s+8]);
最近、スクリプト書くのが早くなってきて楽しいです。
構文解析!part 3.2
> >= < <= 追加した、、
Test:
>>10 > 10 False >>10 >= 10 True >>10 < 10 False >>10 <= 10 True >>exit End...
Source Code:
def factor(begin): global SyntaxFlag global i val = 0 if begin[i] == "(": i+=1 val = expression(begin) i+=1 while begin[i].isdigit(): SyntaxFlag=0 val *= 10 val += int(begin[i]) i+=1 return val def mul(begin): global i val = factor(begin) while True: if begin[i] is "*": if begin[i+1] is "*": i += 2 val **= mul(begin)#factor(begin) else: return val else: break return val def term(begin): global i val = mul(begin) #factor(begin) while True: if begin[i] is "*": i += 1 val *= mul(begin) elif begin[i] is "/": i += 1 val2 = mul(begin) if val < 0 or val2 < 0: val = func1(str(abs2(val,val2))) else: val /= 1.0*val2 val = func1(str(val)) elif begin[i] is "%": i += 1 val %= mul(begin) else: break return val def expression(begin): global i val = term(begin) while True: if begin[i] is "+": i += 1 val += expression(begin) elif begin[i] is "-": i += 1 val -= expression(begin) else: break return val def judge(begin): global i stack =[] while begin[i] != "~": val = expression(begin) if begin[i] == "=": if begin[i+1] == "=": i+=2 stack.append(val) stack.append('=') elif begin[i] == "!": i+=2 stack.append(val) stack.append('!') elif begin[i] == ">": if begin[i+1] == "=": i+=2 stack.append(val) stack.append('>=') else: i+=1 stack.append(val) stack.append('>') elif begin[i] == "<": if begin[i+1] == "=": i+=2 stack.append(val) stack.append('<=') else: i+=1 stack.append(val) stack.append('<') else: stack.append(val) break if len(stack)==1: return val else: #return True if sum(stack)*1.0/len(stack)==stack[0] else False #[50, '=', 10, '!', 5] val = True for x,y in enumerate(stack): if x%2: #print("y:",y,stack[x-1],stack[x+1]) if y is "=": if (stack[x-1] == stack[x+1]) == False: val = False break elif y is "!": if (stack[x-1] != stack[x+1]) == False: val = False break elif ">" in y: if "=" in y: print y if (stack[x-1] >= stack[x+1]) == False: val = False break elif (stack[x-1] > stack[x+1]) == False: val =False break elif "<" in y: if "=" in y: print y if (stack[x-1] <= stack[x+1]) == False: val = False break elif (stack[x-1] < stack[x+1]) == False: val =False break return val #-3/2 == -2 abs2 = lambda x,y: int(x*1.0/y) func1 = lambda x: float(x[0:x.index('.')+3]) def main(): while True: try: ex="" global SyntaxFlag SyntaxFlag=1 tmp = (raw_input(">>")+"~").split() for j in tmp: ex+=j if True in [ex == x for x in ['exit~','quit~']]: print "End..." exit(0) elif ex=="~": continue global i i = 0 #print expression(ex) result= judge(ex) if SyntaxFlag: raise SyntaxError,'WTF are u "d"oin!!?' else: print(result) except EOFError: break if __name__ == '__main__': main()
愚直すぎて気持ちが悪い。
もっといい書き方ないですかねー
構文解析!part 3.1
昨日は”==”だけでしたが、今日は”!=”機能も付け加えました。
結構この書き方に満足してます。
あと、とある東大生にclassで書いたほうがいいって言われたのでpart4.0にはclassで書きます。
Test Case
10 == 10 != 5 10 != 5 == 5 10 != 10 == 10 exit
Response
>>True >>True >>False End...
Source Code:
def factor(begin): global SyntaxFlag global i val = 0 if begin[i] == "(": i+=1 val = expression(begin) i+=1 while begin[i].isdigit(): SyntaxFlag=0 val *= 10 val += int(begin[i]) i+=1 return val def mul(begin): global i val = factor(begin) while True: if begin[i] is "*": if begin[i+1] is "*": i += 2 val **= mul(begin)#factor(begin) else: return val else: break return val def term(begin): global i val = mul(begin) #factor(begin) while True: if begin[i] is "*": i += 1 val *= mul(begin) elif begin[i] is "/": i += 1 val2 = mul(begin) if val < 0 or val2 < 0: val = func1(str(abs2(val,val2))) else: val /= 1.0*val2 val = func1(str(val)) elif begin[i] is "%": i += 1 val %= mul(begin) else: break return val def expression(begin): global i val = term(begin) while True: if begin[i] is "+": i += 1 val += expression(begin) elif begin[i] is "-": i += 1 val -= expression(begin) else: break return val def judge(begin): global i stack =[] while begin[i] != "~": val = expression(begin) if begin[i] == "=": if begin[i+1] == "=": i+=2 stack.append(val) stack.append('=') elif begin[i] == "!": i+=2 stack.append(val) stack.append('!') else: stack.append(val) break if len(stack)==1: return val else: #return True if sum(stack)*1.0/len(stack)==stack[0] else False #[50, '=', 10, '!', 5] val = True for x,y in enumerate(stack): if x%2: #print("y:",y,stack[x-1],stack[x+1]) if y is "=": if (stack[x-1] == stack[x+1]) == False: val = False break else: if (stack[x-1] != stack[x+1]) == False: val = False break return val #-3/2 == -2 abs2 = lambda x,y: int(x*1.0/y) func1 = lambda x: float(x[0:x.index('.')+3]) def main(): while True: try: ex="" global SyntaxFlag SyntaxFlag=1 tmp = (raw_input(">>")+"~").split() for j in tmp: ex+=j if True in [ex == x for x in ['exit~','quit~']]: print "End..." exit(0) elif ex=="~": continue global i i = 0 #print expression(ex) result= judge(ex) if SyntaxFlag: raise SyntaxError,'WTF are u "d"oin!!?' else: print(result) except EOFError: break if __name__ == '__main__': main()
Test Case:
1+1 123+321 100-50 100-123 123*3 8/2 100/3 (10+5)*2 (5-10)*3 (100/2)+(100/3)-(11*3) 2**3 (10**3)/1000 10**3/10**3 2**3**3 (2**3)**3 ( 2 ** 3) ** 3 1 + 3 3 ** 3 16%16 16%15 10*3==30 3**2+4**2 == 5**2 23421%3==43*2 2**3/4 == 10/5%2 10 == 10 != 5 10 != 5 == 5 10 != 10 == 10 HOGEHOGEWORLD
Response
>>2 >>444 >>50 >>-23 >>369 >>4.0 >>33.33 >>30 >>-15 >>50.33 >>8 >>1.0 >>1.0 >>134217728 >>512 >>512 >>4 >>27 >>0 >>1 >>True >>True >>False >>False >>True >>True >>False >>>>Traceback (most recent call last): File "ex3.py", line 141, in <module> main() File "ex3.py", line 134, in main raise SyntaxError,'WTF are u "d"oin!!?' SyntaxError: WTF are u "d"oin!!?
もし何かこれ期待するアンサーと違うぞ?っていうのがあれば教えて下さい。
そろそろ真剣にプログラミング言語作ったりするのもいいかなーって。
もちろん毎日セキュリティの勉強もしてるので、大丈夫です。。
構文解析!part 3
新しく、True or False機能もつけました。
まだ”==”文しか対応してませんが、我ながらいい出来です。
Source Code:
def factor(begin): global SyntaxFlag global i val = 0 if begin[i] == "(": i+=1 val = expression(begin) i+=1 while begin[i].isdigit(): SyntaxFlag=0 val *= 10 val += int(begin[i]) i+=1 return val def mul(begin): global i val = factor(begin) while True: if begin[i] is "*": if begin[i+1] is "*": i += 2 val **= mul(begin)#factor(begin) else: return val else: break return val def term(begin): global i val = mul(begin) #factor(begin) while True: if begin[i] is "*": i += 1 val *= mul(begin) elif begin[i] is "/": i += 1 val2 = mul(begin) if val < 0 or val2 < 0: val = func1(str(abs2(val,val2))) else: val /= 1.0*val2 val = func1(str(val)) elif begin[i] is "%": i += 1 val %= mul(begin) else: break return val def expression(begin): global i val = term(begin) while True: if begin[i] is "+": i += 1 val += expression(begin) elif begin[i] is "-": i += 1 val -= expression(begin) else: break return val def judge(begin): global i stack =[] while begin[i] != "~": val = expression(begin) if begin[i] == "=": if begin[i+1] == "=": i+=2 stack.append(val) else: stack.append(val) break if len(stack)==1: return val else: return True if sum(stack)*1.0/len(stack)==stack[0] else False #-3/2 == -2 abs2 = lambda x,y: int(x*1.0/y) func1 = lambda x: float(x[0:x.index('.')+3]) def main(): while True: try: ex="" global SyntaxFlag SyntaxFlag=1 tmp = (raw_input(">>")+"~").split() for j in tmp: ex+=j if True in [ex == x for x in ['exit~','quit~']]: print "End..." exit(0) elif ex=="~": continue global i i = 0 #print expression(ex) result= judge(ex) if SyntaxFlag: raise SyntaxError,'WTF are u "d"oin!!?' else: print(result) except EOFError: break if __name__ == '__main__': main()
Test Case:
1+1 123+321 100-50 100-123 123*3 8/2 100/3 (10+5)*2 (5-10)*3 (100/2)+(100/3)-(11*3) 2**3 (10**3)/1000 10**3/10**3 2**3**3 (2**3)**3 ( 2 ** 3) ** 3 1 + 3 3 ** 3 16%16 16%15 10*3==30 3**2+4**2 == 5**2 23421%3==43*2 2**3/4 == 10/5%2 HOGEHOGEWORLD
Response:
>>2 >>444 >>50 >>-23 >>369 >>4.0 >>33.33 >>30 >>-15 >>50.33 >>8 >>1.0 >>1.0 >>134217728 >>512 >>512 >>4 >>27 >>0 >>1 >>True >>True >>False >>False >>Traceback (most recent call last): File "ex2.py", line 122, in <module> main() File "ex2.py", line 115, in main raise SyntaxError,'WTF are u "d"oin!!?' SyntaxError: WTF are u "d"oin!!?
ですねー。
次は"!="機能もつけます。はい。
構文解析!part2.2
ポテチ先生に色々教えてもらいました。
@ashigirl96 1個目:2**3**3が512に評価されるのはおかしい。 2個目:"it=quit"などでも終了してしまうので終了条件変えよう 3個目:iがglobal変数なのキモいので、iterator使うなどしよう 4個目:全体的に命名規則どうにかしよう
— 准将 (@potetisensei) October 12, 2013
問題点1が最もなおすべきなので、考えました。。
けどよくわからないからあとに回して、他を改善しました。
exitとquitをコマンドとしてそれ以外はSyntaxErrorを吐くようにしました。
問題点3ですが、先日もイテレータ使うって言ってましたが、変数に一回代入するほどかっこ悪いものはないのでクラスにまとめたいと思いますはい。
問題点4の命名ですが、ネーミングセンス?じゃないけど、どうにかしたい。
ちなみに、time関数をmulにして、number関数をfactorにしました。
自分でも機能を使いかを試みました。
1.改行できる
2.空白があっても無視する。
3.%剰余算も使えるようにしました。
だけ。
Source Code:
def factor(begin): global SyntaxFlag global i val = 0 if begin[i] == "(": i+=1 val = expression(begin) i+=1 while begin[i].isdigit(): SyntaxFlag=0 val *= 10 val += int(begin[i]) i+=1 return val def mul(begin): global i val = factor(begin) while True: if begin[i] is "*": if begin[i+1] is "*": i += 2 val **= mul(begin)#factor(begin) else: return val else: break return val def term(begin): global i val = mul(begin) #factor(begin) while True: if begin[i] is "*": i += 1 val *= mul(begin) elif begin[i] is "/": i += 1 val2 = mul(begin) if val < 0 or val2 < 0: val = func1(str(abs2(val,val2))) else: val /= 1.0*val2 val = func1(str(val)) elif begin[i] is "%": i += 1 val %= mul(begin) else: break return val def expression(begin): global i val = term(begin) while True: if begin[i] is "+": i += 1 val += expression(begin) elif begin[i] is "-": i += 1 val -= expression(begin) else: break return val #-3/2 == -2 abs2 = lambda x,y: int(x*1.0/y) func1 = lambda x: float(x[0:x.index('.')+3]) def main(): while True: try: ex="" global SyntaxFlag SyntaxFlag=1 tmp = (raw_input(">>")+"=").split() for j in tmp: ex+=j if True in [ex == x for x in ['exit=','quit=']]: print "End..." exit(0) elif ex=="=": continue global i i = 0 #print expression(ex) result= expression(ex) if SyntaxFlag: raise SyntaxError,'WTF are u "d"oin!!?' else: print(result) except EOFError: break if __name__ == '__main__': main()
Test Case:
1+1 123+321 100-50 100-123 123*3 8/2 100/3 (10+5)*2 (5-10)*3 (100/2)+(100/3)-(11*3) 2**3 (10**3)/1000 10**3/10**3 2**3**3 (2**3)**3 ( 2 ** 3) ** 3 1 + 3 3 ** 3 16%16 16%15 HOGEHOGEWORLD
Response:
>>2 >>444 >>50 >>-23 >>369 >>4.0 >>33.33 >>30 >>-15 >>50.33 >>8 >>1.0 >>1.0 >>134217728 >>512 >>512 >>4 >>27 >>0 >>1 >>Traceback (most recent call last): File "expression.py", line 99, in <module> main() File "expression.py", line 92, in main raise SyntaxError,'WTF are u "d"oin!!?' SyntaxError: WTF are u "d"oin!!?
まとめ:
1.ポテチ先生の洞察力やヴぁい
2.raiseとか初めて使ったけど何も見ずに書けてテンション上がった
3.構文解析たのしい。
構文解析!part2.1
さきほどの構文解析ではあるミスが有りました。
2**3/2**3
が1にならないということです。
2**3/2**3 -> 8/2**3 -> 4**3 -> 64という感じです。
だから、書き直しました。はい。
def number(begin): global i val = 0 if begin[i] == "(": i+=1 val = expression(begin) i+=1 while begin[i].isdigit(): val *= 10 val += int(begin[i]) i+=1 return val def time(begin): global i val = number(begin) while True: if begin[i] is "*": if begin[i+1] is "*": i += 2 val **= number(begin) else: return val else: break return val def term(begin): global i val = time(begin) #number(begin) while True: if begin[i] is "*": i += 1 val *= time(begin) elif begin[i] is "/": i += 1 val2 = time(begin) if val < 0 or val2 < 0: val = func1(str(abs2(val,val2))) else: val /= 1.0*val2 val = func1(str(val)) else: break return val def expression(begin): global i val = term(begin) while True: if begin[i] is "+": i += 1 val += expression(begin) elif begin[i] is "-": i += 1 val -= expression(begin) else: break return val #-3/2 == -2 abs2 = lambda x,y: int(x*1.0/y) func1 = lambda x: float(x[0:x.index('.')+3]) def main(): while True: try: ex = raw_input(">>")+"=" if ex in "exit=quit=": print "End..." ; exit(0) global i i = 0 print expression(ex) except EOFError: break if __name__ == '__main__': main()
あと+α機能として quitかexitという文字列を入れると終わります。
〜終わり〜
構文解析!part 2
http://reonreon3reon.hatenablog.com/entry/2012/11/27/020832
↑このときは構文解析じゃあありませんでした。愚直に実装したただの…うん。
(完成度は満足してるんだからいいだろ!いい加減にしろ!)
それから月日は壱年経ちまして、最近「構文解析かけるようになりたいなぁ」って思うようになって
ちゃんと勉強して書きました。
これもC言語を無理やりPythonに直して機能を増やしてる感じなので見た目は悪いです。
もちろん書き直します。
def number(begin): global i val = 0 if begin[i] == "(": i+=1 val = expression(begin) i+=1 while begin[i].isdigit(): val *= 10 val += int(begin[i]) i+=1 return val def term(begin): global i val = number(begin) while True: if begin[i] is "*": i += 1 if begin[i] is "*": i += 1 val **= number(begin) continue val *= number(begin) elif begin[i] is "/": i += 1 val2 = number(begin) if val < 0 or val2 < 0: val = func1(str(abs2(val,val2))) else: val /= 1.0*val2 val = func1(str(val)) else: break return val def expression(begin): global i val = term(begin) while True: if begin[i] is "+": i += 1 val += expression(begin) elif begin[i] is "-": i += 1 val -= expression(begin) else: break return val #-3/2 == -2 -> -1.5 abs2 = lambda x,y: int(x*1.0/y) func1 = lambda x: float(x[0:x.index('.')+3]) def main(): while True: try: ex = raw_input()+"=" global i i = 0 print expression(ex) except EOFError: break if __name__ == '__main__': main()
Test Case:
1+1 123+321 100-50 100-123 123*3 8/2 100/3 (10+5)*2 (5-10)*3 (100/2)+(100/3)-(11*3) 2**3 (10**3)/1000 -3/2
実行結果:
2 444 50 -23 369 4.0 33.33 30 -15 50.33 8 1.0 -1.5
僕は、小数点は第3桁までを出力するようにしました。
あと、Pythonって -3/2 を -2と出力するらしいです。だからそれも -3/2 = -1.5にするようにしました。
さきほどのテストケースをPythonで出力すると…
実行結果:
>>> 1+1 2 >>> 123+321 444 >>> 100-50 50 >>> 100-123 -23 >>> 123*3 369 >>> 8/2 4 >>> 100/3 33 >>> (10+5)*2 30 >>> (5-10)*3 -15 >>> (100/2)+(100/3)-(11*3) 50 >>> 2**3 8 >>> (10**3)/1000 1 >>> -3/2 -2
僕的に**というn乗できるようにしたのが面白いです。
まとめ:
もっとソース綺麗に書けるようにしたい。
具体的にglobal iをイテレータとしてやればもっと綺麗じゃないかって。
whileとかはyieldとかでもっと綺麗になるんじゃないかって。
終わり。
DNSRFC...
ファジングも大切ですが、やっぱり基礎的なプロトコルを理解することが大切と思いました…
自分でDNSサーバみたいなもの作ってみたいな−って思ったり…
僕が思うに、誰しもある程度はプログラミングもネットワーク、バイナリ.etcの力や知識
が付くと思います。けど、有る一線っていうものが存在してると思ってます。
その一線を越えるか越えないかでその人が一流になれるかなれないかってあると思います。
青二才が知ったことをいってるように思うかもですが、
なんとなーく、あるなーみたいな。
で、このDNSのRFCを読むにあたって、色んなスライドを探ったりしてるんですが、
まー理解できないです。専門用語が頭に入ってないっていうのももちろんですが、
専門の方が書くスライドの書き方とか、Paperの書き方とか…
なんでこう実装したらこうなるのか?アルゴリズム仕様?ファ?難しいです。
やっぱり今までがすべて初心者用なんだなーって痛感しました。
まとめ:
僕の中にある一線を超えない限り、ずっと初心者だと思うのでRFC読みます…
しゅーとくんが寝かせてくれない!2
我らが大先生Wakatono様が作ったDNS query blockerをしゅーとくんが作りたいとのこと。
しゅーと: 『サーバAにユーザa、bを配置して嘘の応答を答えるサーバBにaがgoogle.comのAレコードを問い合わせしてキャッシュしたあと、bがgoogle.comにアクセスしたときの挙動を知りたい
もしbが嘘のAレコードにアクセスしたら実装考えるわ』
足軽「すげぇ」
==20分後==
しゅーと:「そもそも権限ないユーザは好き勝手にDNSサーバを設定できないことに気づいて萎えた」
足軽「DNSポイゾニングも権限ないとできないのん?」
しゅーと: 『あれとは別やでーーー
俺がやりたかったのは、同じサーバに同居してる別のユーザへのキャッシュポイズニング』
足軽「ふぇえ、ちょっとまって」
うーんうーん、こういうことか?(Scapyでカキカキ)
>>>IP(dst="192.168.1.1")/UDP(dport="domain",sport=RandShort())/DNS(qdcount=1,opcode="QUERY")/DNSQR(qname="www.google.com",qtype="A",qclass="IN")
>>> a=_
>>> b = sr1( a )
Begin emission:
.Finished to send 1 packets.
Received 2 packets, got 1 answers, remaining 0 packets
>>> b
IP version=4L ihl=5L tos=0x0 len=140 id=0 flags=DF frag=0L ttl=64 proto=udp chksum=0xb6f1 src=192.168.1.1 dst=192.168.1.30 options='' |UDP sport=domain dport=1546 len=120 chksum=0x9544 |DNS id=0 qr=1L opcode=QUERY aa=0L tc=0L rd=0L ra=1L z=0L rcode=ok qdcount=1 ancount=5 nscount=0 arcount=0 qd=DNSQR qname='www.google.com.' qtype=A qclass=IN |> an=DNSRR rrname='www.google.com.' type=A rclass=IN ttl=163 rdata='74.125.235.144' |DNSRR rrname='www.google.com.' type=A rclass=IN ttl=163 rdata='74.125.235.148' |DNSRR rrname='www.google.com.' type=A rclass=IN ttl=163 rdata='74.125.235.146' |DNSRR rrname='www.google.com.' type=A rclass=IN ttl=163 rdata='74.125.235.145' |DNSRR rrname='www.google.com.' type=A rclass=IN ttl=163 rdata='74.125.235.147' |>>>>> ns=None ar=None |>>>
足軽「僕が思ったことが、 a パケットが 192.168.1.1(DNS)に送って、192.168.1.1が正規のパケットb を返すまでに、
ニセパケット C(まだ存在しないけど)を aのsource(192.168.1.30)に送るってことで合ってるよね?」
我ながら糞下手くそな説明に対して
しゅーと「そうやよ」
と理解してくれました。
わかったこと…
足軽: 相当早いですよねこれ・・・
しゅーと: 1msの世界
足軽: アセンブリ?(ゲラゲラ
しゅーと: アセンブリ(真顔)
Wakatono様はCらしいのでCで書くしか無いですけど、
相当処理早くしないとこれ追いつかないです。。キャッシュもポイゾニングもできないです…
======
DNSキャッシュポイゾニングは
ポート番号とトランザクションIDが一致しないといけない
それを一致させるためにランダムで送りまくる
さらに一回キャッシュするとTTL内は再問い合わせしなくなる
だから「普通」ならDNSキャッシュポイズニングは成功しにくい
でもサーバによってはポート番号固定(53番)にしてるうんこ設定があるから決め打ちすればエントロピーは2^16にグッと下がる
カミンスキー攻撃は、キャッシュをされないようにしてる=TTLが0になる
普通の攻撃ではキャッシュされたらTTL分(5−10分くらい)待たないといけないけど、 カミンスキー攻撃ならまた成功するまでずっと続けられる
っていうことですな。
けど、BINDのバグってもうほとんど無さそう
しゅーとくんが寝かせてくれない!
テスト一週間前なのに、やっぱりネットワークの勉強したい僕は
カミンスキー攻撃のこともう一回勉強したいなーーって思って、
色々調べてました。けど、根本的な理解ができてないので、
キャンプのNW on Skype(通称:進撃のNW)で質問したところ、
かの有名な「浸透言うな」でお馴染みの鈴木教授がいる大学にいるしゅーとくんに
色々DNSについて教えてもらうことが出来ました!!
実験資料?とりあえずこれを読みました。
よくわからなかったので、聞いたところ
しゅーとさん『カミンスキーは「DNSの仕様で毒が入る」って言ってたけど、教授は疑問を感じて実験したところ、「bindのバグでDNSの仕様の欠陥ではない」と結論づけた
つまりカミンスキーは間違ってたと』
とのことです。
うーんうーん、
このBINDのバグっていうのはどうやって見つけたんだろうか…。
>今悩んでる<
=====================
なんやかんやで話がそれて、Torの話になりました。
そのときに僕は初めて「Torってプロキシなんだ!」ってなりました。
匿名にするってことだけ知ってたんですけど、プロキシとどう関係しているか検討もつきませんでしたが、
家ー>Tor入り口(人)ー>何回ものTorネットワーク(人)ー>Tor出口のネットワーク(人)ー>とあるサーバ
とのことです。
端的に言えば、色んな通信経路が暗号化されてて色んな所を経由してるということらしいです。
足軽『じゃあさぁ、僕がとあるサーバをハッキング(笑)をしようとしたら、
Tor使ったらばれないってこと?』
しゅーとさん『と思うやんか』
とのことです。
『あっけなくハッキングが出来て…』というのは嘘ですね。
しゅーとさんいわくアホなサーバリストを公開してるサイト
らしいっすね。
アホっていうか危ないやろ…。(端的に言えばアホ)
=======
プロキシを無断で利用すると不正アクセス禁止法に抵触するという話を聞いたのですが本当ですか?
FC2動画やYoutubeなど動画を高画質ダウンロード!動画保存ソフトの決定版『MPX』
それは間違いです。
「不正アクセス行為の禁止等に関する法律」によって定義されている不正アクセス行為とは、アクセス制御機能を有するコンピュータ(つまりパスワード認証のあるコンピュータ)に他人の識別符号(つまりパスワード)や何らかの特殊なコマンドを入力して、それを不正に利用できる状態にすることです。したがって、一般の外部から自由に利用可能なプロキシはアクセス制御機能により利用を制限されているとはいえないため、それを無断で利用したとしても不正アクセス行為には該当しません。
これはインターネットの性質上当然のことだといえます。プロキシに対するアクセス方法が仕組み的にWWWサーバに対するそれと同じことから考えれば、外部から利用(閲覧)できるように設定されている以上無断で利用(閲覧)されるのが当たり前です。もしこれが違法行為とみなされるのであれば、他人のWebページを勝手に閲覧することも違法行為になってしまうでしょう。
また、もしプロキシの管理者が外部から無断で利用されることを好まないのであれば、認証機能を付けたりポートを閉じたりして対策を講じればよいだけの話です。ただ管理がずさんなために外部から自由にアクセスできるように設定されているプロキシも多いようですが…。
上述した通りプロキシを外部から無断利用すること自体は法律上問題ありませんが、あまりにも負荷が掛かるような使い方をすると業務妨害とみなされてしまう場合が考えられますので注意が必要です。
=====
という感じでTorの話も終わりました−
非常に面白かったですはい。
プログラムの高速化を図る
直接はネットワークには関係ないですが、
パケット投げる速度、全体的なプログラムの処理の速度を求めるなら
multiprocessing
を勉強する必要があるなと思いました。
Pythonについて教えてくれている方が、『multiprocessingはプロセス間でのデータ受け渡しがちょっと難しいんで、』
って言ってるので、がんばらんとイカンなと思いました。
dis/inspect
これもなんかに使えそうかと思いました。
構造体ぐぐるのめんどくさいねw っていうプログラム。
- 作者: 小俣光之,種田元樹
- 出版社/メーカー: 秀和システム
- 発売日: 2011/01
- メディア: 単行本
- 購入: 1人 クリック: 24回
- この商品を含むブログ (10件) を見る
ゆういちろうとこの本を読んでいるとき、
struct addrinfo *res0;
...
getnameinfo(res0->ai_addr,res0->ai_addrlen,....
「getnameinfoってなんだっけなー。manでも見ようー」
int getnameinfo(const struct sockaddr *sa, socklen_t salen,....
「あ? 第一引数の saはポインタを必要としてて、第二引数は普通のsocklen_t...
やのに、なんで『res0->』っていう形は一緒なんじゃよ!」
という感じで、ゆういちろうとブチギレてるときに、
ゆういちろう「あっ。それ構造体がそういう形だからじゃない?」
足軽「なるほどな。じゃあ見ようか。」
ゆういちろう「はぁ…またぐぐらな。」
足軽「構造体manないもんな。」
ゆういちろう「足軽作ってよ」
足軽「えー…わかった。」
で作ったのが
from sys import argv def AlPro(x=None): Arr = {} for j in ['/usr/include/netdb.h',"/usr/include/netinet/in.h"]: with file(j) as pc: struct = [] FLAG=0 for line in pc: if line.startswith('struct'): stname = line.split()[1] FLAG=1 elif FLAG: struct.append(line) if '};' in line.split(): Arr[stname] = struct if stname == x: break struct =[] FLAG=0 else: continue return Arr if x is None else Arr[x] if __name__ == '__main__': if '-a' in argv: for j in AlPro(): print j stru = raw_input('>>') for i in AlPro(stru): print i,
もっといい方法があれば教えてくださいな。
使い方
$ python test.py -a ←オプションaで構造体一覧 ipv6_mreq hostent addrinfo in_addr group_source_req protoent sockaddr_in servent group_filter group_req gaicb in6_pktinfo ip_mreq ip6_mtuinfo sockaddr_in6 ip_msfilter in6_addr ip_mreq_source >>addrinfo ←ここで入力 { int ai_flags; /* Input flags. */ int ai_family; /* Protocol family for socket. */ int ai_socktype; /* Socket type. */ int ai_protocol; /* Protocol for socket. */ socklen_t ai_addrlen; /* Length of socket address. */ struct sockaddr *ai_addr; /* Socket address for socket. */ char *ai_canonname; /* Canonical name for service location. */ struct addrinfo *ai_next; /* Pointer to next in list. */ };
構造体が出てきます。。
さっきの例で言うなれば、
ai_addr こいつは構造体として宣言されてるね。 ai_addrlen こいつは普通やね
ってなります。
あー、構造体が入ってるファイルは自分で追加できるようにしてね。
['/usr/include/netdb.h',"/usr/include/netinet/in.h"]
〜終わり〜
今日撮ったイチ押し
ASIS-CTFでspcapっていう問題ときました~
名前からしてパケットなので、
>>> a = rdpcap('spcap') >>> a <spcap: TCP:6302 UDP:12 ICMP:1784 Other:146> >>>
aに代入しました。
flag=...みたいなのあったらいいな~。
flag.htmlに書いてあったらいいな~。
って思って、
>>> b = a[Raw].filter(lambda x: True in [i in x[Raw].load for i in ['Flag','flag']]) >>> b <filtered Raw from spcap: TCP:1 UDP:0 ICMP:0 Other:0> >>>
ビンゴ!!
よぉ〜しいい子だ。
>>> print b[0][Raw].load GET /files/flag.jpg HTTP/1.1 Host: 172.16.133.149 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Firefox/17.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive Referer: http://172.16.133.149/ Pragma: no-cache Cache-Control: no-cache
flag.jpgに入ってるっぽいので、
File -> Export Object -> HTTP -> flag.jpg
をとるとる。
するとね、こういう画像が出てくるわけですよ。
〜終わり〜