8bit右位移盲注


字节

1byte(字节)=8bits(位)
两个字节 = 一个汉字


利用右位移进行mysql盲注

select (ascii((substr(user(),1,1))) >> 7)=0;

r的ascii是114,二进制是01110010,右移7位就是0,然后0=0,mysql会输出1(表示是正确的)

select (ascii((substr(user(),1,1))) >> 6)=0;

这个mysql会输出0,因为01 != 0
然后就是猜第三位了,前三位可能是010、011
010的10进制是2,011是3

select (ascii((substr(user(),1,1))) >> 5)=2;

这个mysql会输出0,所以是011
这样循环到最后就可以得到全部的二进制01110010


延伸

在t00ls看到anlfi大牛有延伸性的总结:
1.是HEX的的方式取值 从原来的8次请求 减为了6次请求
具体是a>97>7F>111101>
2.是HEX判断位的取值方式 从原来的6次请求 减为了最少3次请求
具体是a>61>(1-F(16位的哪一位))>6,1=110,1(0=30=11,0)

虽然没太看懂,但是感觉大致应该是缩短了2进制的位数,就像我们其实不用去要二进制的第八位,因为可显字符的最大ascii是01111111,只要知道末七位就好。


位运算

参考文献

  1. and运算(&)
    二进制运算,只有11才为1,其他都是0
    5 & 28
    00101 & 11100 = 00100
    结果为4
    and 1 可以用于判断数字的奇偶性,最末尾位0则表示该数是偶数,为1则表示是奇数

  2. or运算(|)
    相同位只要有一个是1就是1
    5 | 28
    00101 | 11100 = 11101
    结果是29
    or 1 可以用于算出最接近的偶数

  3. xor运算(^)
    相同位的数字如果相同则为0,不同则为1
    00101 ^ 11100 = 11001
    这样的话(a xor b) xor b = a,其中b常用于密钥
    还可以用于交换两个变量的值(不需要用temp变量)

a=a ^ b
b=a ^ b
a=a ^ b

解析:第二步的b=(a ^ b) ^ b=a,第三步的a=(a ^ b) ^ a=b
但是这样的交换有一个缺陷就是一个数的交换结果为0

  1. not运算(~)
    将0和1全部反取,但是这个需要注意符号的问题

  2. 左移(<<)
    a << b 就是将a二进制后左移b位u(在a后面添加b个0),实际上也就是a乘以2的b次方

100 << 2 = 1100100 00 = 400

一般认为a << 1 比 a * 2快,2的幂运算可以用左移来运算

  1. 右移(>>)
    a >> b就是二进制右移b位(去掉未b位),相当于a除以2的b次方(向下取整)
100 >> 2 = 11001 = 25
25 >> 1 = 1100 = 12

二分法100 >> 1、堆的插入

posted @ 2015-09-01 19:47  l3m0n  阅读(834)  评论(4编辑  收藏  举报