int mprotect(void *addr, size_t len, int prot);
实现内存区域的动态权限控制:
addr
:要修改保护权限的内存区域的起始地址。len
:要修改保护权限的内存区域的长度(以字节为单位)。prot
:要设置的新的保护权限,通常使用以下常量之一:PROT_NONE
:禁止对内存区域的任何访问。PROT_READ
:允许读取内存区域的内容。PROT_WRITE
:允许向内存区域写入数据。PROT_EXEC
:允许执行内存区域中的指令.
嗯,然后先修改那段内存吧
https://www.cnblogs.com/LyShark/articles/13100048.html
[IDA]IDC脚本基础_idc的加法运算-CSDN博客
主要是sub开头那一点,不然好像不能P重定义
调用了很多函数,最后有一个比较。
然后再从main函数开始分析,看别人wp,有JUMPOUT(0x402123LL)
函数边界识别错误
或者是由于编译器某些原因会把某些代码分出来,不存放在连续区域,而是在其他位置,这些块有时ida能识别出来,被称为chunk,有些不能识别,此时就得自己手动设置。
如果是边界识别错误,那就alt+p,找到正确的末尾;
如果是后者,那就通过append_func_tail来将目标区域添加到本函数中,另外,得先undefine目标区域。
我可能先undefine了,所以没有爆红
sub_401CF9(const void *a1, size_t a2, __int64 a3)
问gpt是哈希md5加密,还有根据算法特征码
// 五个一样的函数,不一样的参数
v6 = __readfsqword(0x28u); // 访问 CPU 中的 FS 寄存器(在 x86 架构中用于存储线程局部存储器段描述符的基地址),并读取偏移地址为 0x28 的字节数据
sub_401CF9(&aAbcdefghijklmn, 64LL, v2); // base64表经过md5-->v2
sub_401CF9(&unk_603100, 20LL, &v3);
sub_401CF9(&unk_6030C0, 53LL, &v4);
sub_401CF9(&dword_4025C0, 256LL, &v5);
sub_401CF9(v2, 64LL, a1); // v2也经过md5-->a1,即base表经过两次md5
return __readfsqword(0x28u) ^ v6;
也用到了刚刚那个数组,所以应该就是AES的加密实现
所以应该就是base表两次md5加密得到unk_603170作为AES密钥,我们的输入是明文,加密后和byte比较。
所以就是先得到unk(可以动调也可以md5网站),然后再aes解密就行了
aes好像还有CBC模式与ECB模式,额。。。
总的来说,re题不太需要搞清楚每一步都在干什么,每个语句都是什么意思,搞清楚整体逻辑,就行了。