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,只要知道末七位就好。
位运算
-
and运算(&)
二进制运算,只有11才为1,其他都是0
5 & 28
00101 & 11100 = 00100
结果为4
and 1 可以用于判断数字的奇偶性,最末尾位0则表示该数是偶数,为1则表示是奇数 -
or运算(|)
相同位只要有一个是1就是1
5 | 28
00101 | 11100 = 11101
结果是29
or 1 可以用于算出最接近的偶数 -
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
-
not运算(~)
将0和1全部反取,但是这个需要注意符号的问题 -
左移(<<)
a << b 就是将a二进制后左移b位u(在a后面添加b个0),实际上也就是a乘以2的b次方
100 << 2 = 1100100 00 = 400
一般认为a << 1 比 a * 2快,2的幂运算可以用左移来运算
- 右移(>>)
a >> b就是二进制右移b位(去掉未b位),相当于a除以2的b次方(向下取整)
100 >> 2 = 11001 = 25
25 >> 1 = 1100 = 12
二分法100 >> 1
、堆的插入
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 35岁程序员的中年求职记:四次碰壁后的深度反思
· 继承的思维:从思维模式到架构设计的深度解析
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 35岁程序员的中年求职记:四次碰壁后的深度反思
· 当职场成战场:降职、阴谋与一场硬碰硬的抗争
· ShadowSql之.net sql拼写神器
· Excel百万数据如何快速导入?
· 无需WebView,Vue也能开发跨平台桌面应用