Python

IDA Python

顾名思义,在IDA中写python脚本,用来提取数据等

用到idc_bc695这个库

另见:

https://www.cnblogs.com/iBinary/p/14642662.html

https://blog.csdn.net/m0_52164435/article/details/124878537

数学库

z3库

安装

需要使用python3(python2已不再受支持,安装很可能出现问题)来安装

1
2
3
pip install z3
# 上面命令失败的话可以尝试
pip install z3-solver

声明求解范围

1
2
3
4
5
6
7
8
9
10
11
12
#Int()和Ints()函数用于申请整数解
a = Int('a')
a,b = Ints('a b')

# 有理数解
a = Real("a")
a, b = Reals("a b")

# 位向量,用于求解与/或/移位等位运算
# 第二个参数表示位数
a = BitVec("a", 8)
a, b = BitVecs("a b", 8)

增加方程约束

1
2
3
4
5
6
7
8
9
10
#建立求解器
S=Solver()
#添加约束
equs=[
a+b==10,
a-b==6
]
S.add(equs)
#也可以一个一个加
S.add(a+b==10)

求解

1
2
print(s.check())   # sat代表有解,unsat代表无解
print(s.model())

数据处理库

二进制-字符处理—binascii

参阅https://blog.csdn.net/asmartkiller/article/details/114704320

主要用于二进制和ASCII互相转换

image-20230922171158471

转为二进制数据bin_var后,如果进一步转为字符串,那么进行bin_var.decode()即可

例如(SUCTF2019)SignIn中使用binascii.unhexlify()方法将生成的十六进制字符串转为字符串

例题

见[SWPUCTF 2021 新生赛]简简单单的逻辑

使用int.from_bytes()方法进行字节流转为int的操作,同时需要指定大小端序

解密脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import binascii

flag = 'xxxxxxxxxxxxxxxxxx'
list = [47, 138, 127, 57, 117, 188, 51, 143, 17, 84, 42, 135, 76, 105, 28, 169, 25]
result = ''
# for i in range(len(list)):
# key = (list[i]>>4)+((list[i] & 0xf)<<4)
# result += str(hex(ord(flag[i])^key))[2:].zfill(2)
# print(result)
# result=bcfba4d0038d48bd4b00f82796d393dfec

# for i in range(len(list)):
# list[i] = (list[i] >> 4) + ((list[i] & 0xf) << 4)
# print(list)
list = [242, 168, 247, 147, 87, 203, 51, 248, 17, 69, 162, 120, 196, 150, 193, 154, 145]
result = 'bcfba4d0038d48bd4b00f82796d393dfec'
i = 0
while i < len(result):
# print(int.from_bytes(binascii.unhexlify((result[i] + result[i + 1])), byteorder='little'))
enc = int.from_bytes(binascii.unhexlify((result[i] + result[i + 1])), byteorder='little') # 这里用到了int.from_bytes方法
# print(binascii.unhexlify((result[i] + result[i + 1])))
print(chr(enc^list[i//2]),end='')
i += 2

C语言

高精度—GMP库

GMP(The GNU Multiple Precision Arithmetic Library)又叫GNU多精度算术库,是一个提供了很多操作高精度的大整数,浮点数的运算的算术库,几乎没有什么精度方面的限制,功能丰富。我刚接触到这个东西的时候是在学习PHP的过程中。GMP的主要目标应用领域是密码学的应用和研究、 互联网安全应用、 代数系统、 计算代数研究等。

__gmpz_init_set_str() 函数

1
int mpz_init_set_str (mpz_t rop, char *str, int base)

将str字符数组以 base 指定的进制解读成数值并写入 rop 所指向的内存

__gmpz_powm() 函数

1
void __gmpz_powm(mpz_t rop, const mpz_t base, const mpz_t exp, const mpz_t mod)

将base求exp次幂,然后对mod求模,最后把结果存到rop中(可以用于编写RSA)

其他函数见文档