欧几里得算法(Euclidean algorithm)
最大公约数两个正整数r0和r1的最大公约数表示为:\gcd(r_0, r_1)他指的是被r0和r1同时整除的最大正整数,例如:
\begin{align}
r_0 & = 84, r_1 = 30; \\ \\
r_0 & = 84 = 2*2*3*7 \\
r_1 & = 30 = 2*3*5 \\ \\
\gcd 是所有公共质因子&的乘积:\\
2*3 & = 6 = \gcd(r_0, r_1)
\end{align}欧几里得算法定义在数学中,辗转相除法,又称欧几里得算法(英语:Euclidean algorithm),是求最大公约数的算法。
假设r_0>r_1:\gcd(r_0, r_1) = \gcd(r_0-r_1, r_1)证明\begin{align}
假设 \ &\gcd(r_0, r_1) = g \\
\therefore \ &r_0 = g*x,\ r_1 = g*y \\
易证得 \ &x和y互素 \\
易证得 \ &x-y和y互素(x>y) \\
\therefore \ &\gcd(r_0-r_1, r_1) = \gcd(g(x-y), ...
NepCTF2023 RE(九龙拉棺)
九龙拉棺查壳
程序分析main函数分析程序首先获取了系统特权,然后执行了八个线程,然后读取输入并判断输入的字符长度是不是80,最后做了一堆赋值的操作。然后执行了WaitForMultipleObjects,等待所有线程运行结束,然后有个判断dword_409808的值,从if和else的语句中大概也能猜出一个是输出success,一个是输出no之类的语句。
八个线程分析再观察一下每个线程,除了第四个线程sub_4020B0以外,每个线程都是以如下代码的格式开头(有的不会执行sub_4015E0函数),可以看出这些线程都是由dword_409804变量来控制执行顺序的。也就是说虽然是八个线程,实际上就像是两个线程在执行一样:sub_4020B0线程一直会运行,其他七个线程都需要等待dword_409804变量的值,每个线程运行完都会给他赋值用以通知下个线程运行。从main函数可以看出执行WaitForMultipleObjects函数之前,先执行了dword_409804++,让他从1开始运行。
1234567sub_4015E0();while ( dword_409804 != 6 ...
NepCTF2023 RE(eeeeerte)
eeeeerte查壳
可以发现无壳,易语言逆向题
运行程序运行就是一只向你挑衅的大”鲨”鱼。并没有任何按钮或者其他反应。
ida 易语言E-Decompiler:E-Decompiler是ida识别易语言的插件,可以识别出易语言当中的控件事件和中文函数名称。效果如下:
程序分析
从函数名称也可以判断出该程序的控件事件就是鼠标点击事件(由于环境除了问题,伪代码中并没有函数的中文名称,但是汇编窗口有,交替着看也没问题)。
函数的核心逻辑在于下了断点的三次if判断,交叉应引用一下被判断的数组会发现整个鼠标点击事件结束他会自增一次,说明qword_57C620表示图片被鼠标点击了几次。
得到这个信息之后就直接下断点,开调试,鼠标点击图片,直接修改qword_57C620的值为0x272,,进入sub_402A13函数发现是异或(结合汇编看,有函数中文名),得到提示语句:”Please provide an encryption key:”,之后一个大函数是输出信息框,这时会提示我们输入key。
之后sub_402BAB会将我们的输入拷贝到另一块内存区域(加上长度信息),然后再 ...
