なにも見ずに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

ポテチ先生に色々教えてもらいました。

問題点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サーバみたいなもの作ってみたいな−って思ったり…

DNSのRFC

僕が思うに、誰しもある程度はプログラミングもネットワーク、バイナリ.etcの力や知識
が付くと思います。けど、有る一線っていうものが存在してると思ってます。

その一線を越えるか越えないかでその人が一流になれるかなれないかってあると思います。
青二才が知ったことをいってるように思うかもですが、
なんとなーく、あるなーみたいな。

で、このDNSRFCを読むにあたって、色んなスライドを探ったりしてるんですが、
まー理解できないです。専門用語が頭に入ってないっていうのももちろんですが、
専門の方が書くスライドの書き方とか、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")


dport=domain |>>>


>>> 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のバグっていうのはどうやって見つけたんだろうか…。

>今悩んでる<

DNSポイゾニングの基礎


=====================

なんやかんやで話がそれて、Torの話になりました。

そのときに僕は初めて「Torってプロキシなんだ!」ってなりました。

匿名にするってことだけ知ってたんですけど、プロキシとどう関係しているか検討もつきませんでしたが、

家ー>Tor入り口(人)ー>何回ものTorネットワーク(人)ー>Tor出口のネットワーク(人)ー>とあるサーバ

とのことです。

端的に言えば、色んな通信経路が暗号化されてて色んな所を経由してるということらしいです。

足軽『じゃあさぁ、僕がとあるサーバをハッキング(笑)をしようとしたら、
   Tor使ったらばれないってこと?』

しゅーとさん『と思うやんか』

参考サイト

とのことです。

『あっけなくハッキングが出来て…』というのは嘘ですね。


しゅーとさんいわくアホなサーバリストを公開してるサイト
らしいっすね。
アホっていうか危ないやろ…。(端的に言えばアホ)


=======

プロキシを無断で利用すると不正アクセス禁止法に抵触するという話を聞いたのですが本当ですか?

FC2動画やYoutubeなど動画を高画質ダウンロード!動画保存ソフトの決定版『MPX』
それは間違いです。
不正アクセス行為の禁止等に関する法律」によって定義されている不正アクセス行為とは、アクセス制御機能を有するコンピュータ(つまりパスワード認証のあるコンピュータ)に他人の識別符号(つまりパスワード)や何らかの特殊なコマンドを入力して、それを不正に利用できる状態にすることです。したがって、一般の外部から自由に利用可能なプロキシはアクセス制御機能により利用を制限されているとはいえないため、それを無断で利用したとしても不正アクセス行為には該当しません。

これはインターネットの性質上当然のことだといえます。プロキシに対するアクセス方法が仕組み的にWWWサーバに対するそれと同じことから考えれば、外部から利用(閲覧)できるように設定されている以上無断で利用(閲覧)されるのが当たり前です。もしこれが違法行為とみなされるのであれば、他人のWebページを勝手に閲覧することも違法行為になってしまうでしょう。
また、もしプロキシの管理者が外部から無断で利用されることを好まないのであれば、認証機能を付けたりポートを閉じたりして対策を講じればよいだけの話です。ただ管理がずさんなために外部から自由にアクセスできるように設定されているプロキシも多いようですが…。


上述した通りプロキシを外部から無断利用すること自体は法律上問題ありませんが、あまりにも負荷が掛かるような使い方をすると業務妨害とみなされてしまう場合が考えられますので注意が必要です。

=====


という感じでTorの話も終わりました−


非常に面白かったですはい。

プログラムの高速化を図る

直接はネットワークには関係ないですが、
パケット投げる速度、全体的なプログラムの処理の速度を求めるなら
multiprocessing
を勉強する必要があるなと思いました。

Pythonについて教えてくれている方が、『multiprocessingはプロセス間でのデータ受け渡しがちょっと難しいんで、』
って言ってるので、がんばらんとイカンなと思いました。

dis/inspect
これもなんかに使えそうかと思いました。

最惡ノ貳週間

貳週間、定期テストが有るので全く本を読む時間が在りません。

勿論、學校ノ勉強をスッポがして、ネットワークバイブル読みたいんですが、
僕ノ高専では『留年』といふ怖ひ制度が有るので震えながら勉強しないといけません。
辛ひです。

構造体ぐぐるのめんどくさいねw っていうプログラム。

Linuxネットワークプログラミングバイブル

Linuxネットワークプログラミングバイブル

ゆういちろうとこの本を読んでいるとき、

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"]



〜終わり〜


今日撮ったイチ押し

f:id:reonreon3reon:20130902012759j:plain

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

をとるとる。

するとね、こういう画像が出てくるわけですよ。
f:id:reonreon3reon:20130901011725j:plain

〜終わり〜