CTF错误集合

PYTHON:

O 注意python给一个01串8位分组的方法

for i in range(len(s) // 8):

  a = s[i * 8: i * 8 + 8]

易错点1:乘8不要忘了

易错点2:右边是+8不是+7

O 注意区分list的切片和range的区间,-1在二者中的意义不一样

a = [i for i in range(64)]

for i in range(16):

  for j in a[i * 4 + 4 - 1: i * 4 - 1: -1]:

    print(j)

得到的结果是 7 6 5 4 11 10 9 8 ,而没有3 2 1 0

因为list里-1是最后一个数,所以i=0的时候发现右边大于左边,直接跳过去了

O 如果想把一个大于128的char编码成base64,切忌不能直接b64encoder(s.encode()),这样encoder()会自动当成utf8编码然后混进来奇怪的东西

应该s = s + int.to_bytes(1, byteorder='big')

通用:

O 如果写脚本爆破不出结果,有可能是有多解

O 打 ctf 一定注意,下标从 0 开始,这个错误常见于自己写的脚本中

例如手写队列,还按习惯先让 hd = hd + 1 再 q[hd] = x 就容易出错

CRYPTO:

O 判断是否是不可见字符的时候注意范围不仅是[32,128),还要再带上一个' '

例如用key循环xor一个诗歌,那么如果要枚举每一位,判断是有不可见字符来判断密钥可行性的话,把' '漏掉就找不到解了

这个特点其实也可以为我们所用,例如诗歌里边一般不会出现数字,那么就可以把0到9列为非法字符

O 题目中给的flag{xxxx}中的x的个数不一定是真实的长度

良心题目应该都是满足这个条件的,但是如果卡自闭了不妨试试枚举长度

O 如果rsa解出来的m不满足m^e1%n=c1,可能不是求解写错了

有可能是读入c1的时候读错了,注意如果读错了,那么就不满足c1=m^e1!

REVERSE:

O 如果出现 dword_123456==0x12345678 这种,注意并不是字符串比较,而是先翻转再比较

注意 dword 取内存的顺序和字符串不一样

O 如果发现形如(c[i]+66)^0xAA的代码,那么把加密后的bytes逐字节异或0xAA后出现小于66的数时不奇怪的

注意可以溢出,如果c[i]是char会自动溢出

O 遇到IDA伪代码是用一个变量给内存分配值,然后指针扫描取值的时候

注意不要偷懒直接copy伪代码到C运行,因为不同操作系统和不同语言的变量内存防止可能不一样

最好还是勤快点,写一个python,每次模并除256(一般取的都是char)

O 看内存的时候不要光找英文的地址索引,有时候会有这种情况

s 36h

abcd ...

题目中是从s开始寻址的,如果看成abcd就惨了……

O 用脚本处理数字的时候主义隐藏的0

比如下一条中的图,如果没有注意到2实际是02,python就会把1402处理成0142

O 看内存的时候一定不要轻易忽略地址索引名右边的那个值

这个值有时候会长得很奇怪,但是忽略的话就会很惨

比如这样

 读出来应该是1401 1402 1403,把1401丢了就错了

原文地址:https://www.cnblogs.com/cdcq/p/13510549.html