RAS加密
原理的话:http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.htm
这里主要是解密就好了。
我们要找到N 密文 e
N 是一个很大的数 用yufa 将他转成2个很大的素数
就能用脚本将他解开16进制
123456789101112import gmpy2p = 366669102002966856876605669837014229419#N分解出来的pq = 282164587459512124844245113950593348271#N分解出来的qN = 103461035900816914121390101299049044413950405173712170434161686539878160984549#很大的整数c = 0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35#密文e = 65537#这个是d = gmpy2.invert(e,(p-1)*(q-1))m = gmpy2.powmod(c,d,p*q)prin ...
signin
进来搜索字符串,然后找到:
看到sub_96A(input, (__int64)v9);对输入的字符串进行了操作
sub_96A
我们知道input[v3] >> 4 这个是取出高四位
input[v3++] & 0xF是取出第四位
去看一眼byte_202010可知道:这个就是将输入的字符串转化成16进制的样子。
最后放在v9里面。
_gmpz_powm我们来百度一下,这个函数的作用
mpz_powm(result, a, b, m);
resule = a^b mod m
1234567891011121314151617181920212223242526272829303132#include <stdio.h>#include <gmp.h>int main() { mpz_t a, b, m, result; // 初始化大整数 mpz_init(a); mpz_init(b); mpz_init(m); mpz_init(result); // 设置大整数的 ...
tt3441810
这个题,没懂啥意思
WP:
https://blog.csdn.net/p_bloomberg/article/details/119580396
crazy
main进来后首先看main 函数。大致看一下。就差不多可以开始分析了。
HighTemplar::HighTemplar
这个是一个copy
将input的字符串。copy到 a1 + 16 和 a1 + 48 的位置,
然后再a1 + 80 的位置 copy : 327a6c4304ad5938eaf0efb6cc3e53dc
fun 1 2 3这里我没先看。因为第一眼没看懂,然后我们就来看看判断的地方。
HighTemplar::getSerial
首先是:v1 = *(_BYTE *)std::string::operator[]((char *)this + 80, (int)i);
v1 就是 327a6c4304ad5938eaf0efb6cc3e53dc
然后要让flag == 327a6c4304ad5938eaf0efb6cc3e53dc
因为之前有一个 + 16 , + 48 ,+ 80 所以这里可以猜到。
ok 我们来看看if 上面的那个函数【这个函数估计就是给flag进行加密的函数】
HighTemplar::calculate
它首先是 (xor 8 ...
answer_to_everything
这个题感觉作用就是让我了解到了有sha1 加密的方式
flag{80ee2a3fe31da904c596d993f7f1de4827c1450a}
Mine-
我第一次写C++的题,还有点不习惯。还好这个题比较简答。我也不知道他是咋写的。但是最后就是莫名奇妙的写出来了
进去没有思路,就看看字符串
看到这里有一个奇奇怪怪的字符串。
点过去后。感觉这里是copy字符串到ans里面。
然后来看看ans
找到这里。然后就是写脚本:
12345678a = b"*ur)O}t@r{u!c&|}d\9m>M4NtsrjL"a_len = len(a)flag = ""for i in range(len(a)): temp = (a_len - i) ^ a[i] flag += chr(temp)print(flag)#7ii3VecVgof3r6ssiP2g7E3HqwqhM
我第一次是用base64解码。不对
然后尝试了base58
解开了
BABYRE
一个比较简单的常规的题
首先看main 函数 ,简单的输入flag 然后将flag传入一个函数进行判断。
第一次点进去后发现函数是数据类型…【猜测是加密了】回到main函数,看上面有没有加密的函数。
返回去后就看到一个for 循环将judge里面的数据进行了一次xor 。
感觉可以把这段直接nop掉的。但是我还是用的idapython来解的密。
123for i in range(0x600B00,0x600BB6): patch_byte(i,get_wide_byte(i)^0xC)print("ok")
然后点击judge,过去后将它转化成代码段,然后再打包成函数。【“c” 后 “p”】
看到真正的函数。这里我们知道v2 和 v3 是连接再一起的。所以就比较简单的写了一个解密的脚本
123456789a = b"fmcd\x7Fk7d;V`;np"flag = ""c = 0for i in a: flag += chr((i) ^ c) c = c+1print(flag)#flag{n1c3 ...
IgniteMe
这里主要是flag的第二段:
正向:大写转成小写,然后进行加密操作。小写的转化成大写进行加密操作。
最后加密后和已知道的字符串进行比较。
逆向:首先逆向加密操作,然后将大小写互相转化就可以了吧。
12345678910111213141516171819a = [ 0x0D, 0x13, 0x17, 0x11, 0x02, 0x01, 0x20, 0x1D, 0x0C, 0x02, 0x19, 0x2F, 0x17, 0x2B, 0x24, 0x1F, 0x1E, 0x16, 0x09, 0x0F, 0x15, 0x27, 0x13, 0x26, 0x0A, 0x2F, 0x1E, 0x1A, 0x2D, 0x0C, 0x22, 0x04]b = b"GONDPHyGjPEKruv{{pj]X@rF"#print(len(b)) 24flag = ""for i in range(24): temp =(((b[i]) ^ a[i]) - 72) ^ 0x55 flag += chr(temp)print(fla ...
修复pyc文件头
文件头如果pyc是python3.9以上的就需要用pycdc
python3.9一下的用unocompyle6
不同版本的python有不同的:magic number
可以用指定版本的python执行代码来获取:
123456789#需要的时候需要切换python的版本:设置->python解释器import importlib.util# 获取当前 Python 版本的 magic number,并输出为十六进制#big 是大端序 little 是小端序magic_number = int.from_bytes(importlib.util.MAGIC_NUMBER, byteorder='big')hex_magic_number = hex(magic_number)print(hex_magic_number)
这里是3.6的:
把文件头修改如下,第一行。
python 3.11