闲记

记录某一时间的学习、心得及想法。

2021.8.8

今天想着整理一下之前博客的文章,收纳了一下。所以我对博客的改动,删除的东西比较多,但是在最后布署的时候,使用的通过对站点使用的静态资源进行压缩来优化网站的访问速度的gulp出问题了。。

image-20210808131835607

搜索了一番,网上并没有解决办法。是不是删除了什么东西呢,然后把之前删了的东西从回收站还原,问题依旧在。

仔细看了一下错误,我的猜测是不是那篇文章中出现了什么\x07字符导致压缩出现问题。但是我修改了这么多,不可能一篇一篇去找。。

然而我可以按照修改时间,把今天与最近修改过的文章都移出去,再次布署,成功了,那就是文章中出现了什么字符导致的问题了。

很快我定位到了出错的文章,并不是我今天修改的,而是前几天写的2021的巅峰极客的wp。。最后从文章中定位出问题字符:这里的红点就是一些不可打印字符,可能其中某个字符导致了gulp出错。

image-20210808132805886

解决办法:删除即可,hh

2021.8.11

来对今天才知道的一个python知识点进进行记录了。😅

先说说起因:

本来我想去看看0x2d对应的ascii字符是什么,就在python解释器窗口输入了chr(0x2d),反馈了‘-‘,但是这个在cmd窗口中没看出来是-还是_,所以我又输入ord(_),反馈了45,嗯那就是下划线字符了。等等!我输入这个_没带引号呀,然后又试了ord(a),果然报错name ‘a’ is not defined,那那个ord(_)是怎么回事。。

搜索一番,这个_在python中的用法还不少。

首先是在python交互解释器中,_符号是指交互解释器中最后一次执行语句的返回结果。这也就是我上面遇到的情况了。

然后_还用作被丢弃的名称,如下面举例的代码:就是我们在只要计数功能,但并不关心计数值的时候可以使用。

1
2
3
len = 42
for _ in range(len):
do()

最后_还可以用作函数名

综上,所以说,那个0x2d所对应的字符不是下划线,是-

2021.8.16

又是安装记录,hh。

安装gmpy2库,本来在linux是安装了的,但突然就是想在windows下安装下,感觉方便点。

但一开始就报错了:大概看了下应该是编译的时候出了问题,电脑中缺少了什么。

image-20210816003647937

但是我可以直接去下载.whl,然后通过wheel来安装嗯。

首先:

1
pip install wheel

然后到官方github下载对应的.whl文件:https://github.com/aleaxit/gmpy/releases/tag/gmpy2-2.1.0b6

这里注意要与本机安装python的版本一致,不然会出现下面的错误:(这里cp39是python3.9用的

image-20210816003959826

我是python3.8,安装cp38就行了。

最后:

1
pip install gmpy2-2.1.0b6-cp38-cp38-win_amd64.whl

image-20210816004124363

2021.8.17

今天看一个wp的时候突然想着去看看Crypto的,正好看见一个rsa的题,突然对一个问题一下子疑惑了:rsa中求解私钥d的时候是找的公钥e和φ(n)的逆元,为什么不是找公钥e和n的逆元呢。

接着,我又想到了仿射密码中求逆元的时候就是直接找的密钥k和模数的逆元,然后自己简单推导了下,这个倒很简单,确实是密钥k和模数的逆元。

然后rsa中的呢,我也顺着推了一下。

这个其实也简单,就是利用了一些同余的性质。https://www.zhihu.com/question/67393951

2021.8.18

python中的小知识点记录~

Reverse和Crypto中经常会用下面的方法进行一个数与bytes类型互换:

1
2
3
4
5
>>> from Crypto.Util.number import *
>>> long_to_bytes(100)
b'd'
>>> bytes_to_long(b'd')
100

然后struct模块中提供了的方法也可以实现上面的功能且扩展性很高,如我们还可以指定大小端模式等。下面列一些很简单的列子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import struct

def p_8(v):
return struct.pack( "!B", v )

def p_16(v):
return struct.pack( "!H", v )

def p_32(v):
return struct.pack( "!L", v )

def u_8(v):
return struct.unpack( "!B", v )[ 0 ]

def u_16(v):
return struct.unpack( "!H", v )[ 0 ]

def u_32(v):
return struct.unpack( "!L", v )[ 0 ]

另外是python的类中命名为__call__的方法。

__call__

存在call方法的类对象被称为可调用对象,它的作用可以总结为以下两点:

  • 简化了对象下方法的调用 (当某方法调用频率很高)
  • 模糊了对象和函数调用时的区别 (提高了代码的兼容性)

首先是简化了对象方法调用的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#coding=utf-8
class A():
def fun(self):
print("***A***")

a = A()
a.fun()


class B():
def __call__(self):
print("***B***")

b = B()
b() #这里就方法的调用进行了简化

然后是模糊对象与方法调用上的区别的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#coding=utf-8

def funA():
print("***A***")

class B():
def __call__(self):
print("***B***")

def c(fun):
fun()

c(funA)
c(B())

2021.8.26

惊了,每从主机向虚拟机拖拽文件时产生的备份缓存居然有700多M,,还不会自动删除。

以及为什么执行本目录下的文件要加上./

可以发现windows中的cmd下我们就不用加,这其实是因为windows的环境变量有当前目录下的路径,而linux中的环境变量并没有当前目录下的路径。

又是记录一下小知识。

还是再说说起因。

今天弄着备用的centos的python环境发现还不能通过python直接启动python3,想到去创建一个符号链接。用python执行python3。

1
sudo ln -s /usr/bin/python3 /usr/bin/python

然后突然我又想到我每次调试elf文件时,都在新创建的目录下拷贝了一份linux_server,真的是繁琐且占存储的行为,那这个我每次在新的目录也创建一个linux_server的符号链接就好了,这样解决了占存储,但还是很繁琐呀,每次还要去输入命令符号链接一下。

hh,其实根本不用这么麻烦,我直接把linux_server放到/usr/bin/,这样每次就都可以直接执行linux_server了。

接着就是去删除以前复制了的很多linux_server:注意要加上xargs

1
find /home/ -name linux_server* | xargs rm

删除过程发现了.cache/vmware/drag_and_drop还有linux_server。搜了一下这其实是每次从主机到虚拟机拖拽文件时产生的副本文件,不会自动删除。

image-20210826133028720

查看了一下这个目录下的大小:居然有760多M之大。。

1
du -sh /home/xxx/.cache/vmware/drag_and_drop

删除后,心情也感觉舒畅了很多。😂

2021.8.27

centos下安装gmpy2跟着错误把缺少的依赖都装好后,在导入时出现下面这个错误:也就是说这个libmpfr.so.6不存在。

image-20210826161415157

找了半天这个,根本找不到。

最后发现可以把libmpfr.so.4通过软链接过去当libmpfr.so.6用。

1
ln -s /usr/lib64/libmpfr.so.4 /usr/lib64/libmpfr.so.6

2021.8.28

今天写一个用于测试很简单的python脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
def funa():
a = 1
print(a)

class q():
a = 2

def funb():
b = 3
print(b)

funa()
q().funb()

出现了如下错误:

1
2
3
4
5
1
Traceback (most recent call last):
File "1.py", line 13, in <module>
q().funb()
TypeError: funb() takes no arguments (1 given)

看到上面的错误提示我funb这个函数是无参的,但是我给了它一个参数,所以导致了错误。

但是我写的q().funb(),这没有给参数的嗯。

其实这是:每个与类相关联的方法调用都自动传递实参self , 它是一个指向实例本身的引用,让实例能够访问类中的属性和方法

也就是调用funb这个函数的时候,隐式的自动的传递了self这个参数。

要解决这个问题,直接在定义funb函数的时候加上一个参数就好了。

很基础的一个问题,对于一些细节不清楚,这也是我没有系统学习过python导致的,慢慢积累,边用边学就好。

2021.12.5

今天做了一个简单的rsa题目,其中涉及了2个简单的rsa的知识点。

一,低加密指数攻击。

也就是选取的公钥e太小使加密结果小于n了,这样我直接对密文开三次方根就好。对于加密结果大于n的,有 enc = c+kn 我们爆破k,直到enc能开三次方根也就找到m了。

对于开三次方根使用gmpy2库的iroot方法。

如我对8开三次方根:

1
2
3
>>> import gmpy2
>>> gmpy2.iroot(8, 3)
(mpz(2), True)

二,共模攻击。

2022.1.14

对于在网上下载的ida7.6的cfg目录下是有Chinese.clt文件的但是不能显示中文的(扩展的asci),解决办法:

在它的配置文件ida.cfg的ENCODING_CULTURES下加上一个 GB2312: Chinese 就好了。

image-20220114220105970

-------------本文结束感谢您的阅读-------------