[SUCTF2018]babyre
[SUCTF2018]babyre知识点
爆破
找到关键代码
__int64 sub_140012460(){ char *v0; // rdi __int64 i; // rcx char v3[48]; // [rsp+0h] [rbp-20h] BYREF char v4[32]; // [rsp+30h] [rbp+10h] char v5[184]; // [rsp+50h] [rbp+30h] BYREF char flag[60]; // [rsp+108h] [rbp+E8h] BYREF unsigned int key[8]; // [rsp+144h] [rbp+124h] BYREF int j; // [rsp+164h] [rbp+144h] int v9; // [rsp+234h] [rbp+214h] int v10; // [rsp+238h] [rbp+218h] v0 = v3; for ( i = 150i64; i; --i ) { *(_DWORD *)v0 = -858993460; ...
[SCTF2019]creakme
[SCTF2019]creakme知识点
AES加密
反调试
看起来很麻烦,一步步慢慢看吧
主函数int __cdecl main(int argc, const char **argv, const char **envp){ HMODULE v3; // eax int v4; // eax _DWORD *v5; // eax unsigned int v6; // edx _DWORD *v7; // ecx unsigned int v8; // ebx char *v9; // edi unsigned int v10; // esi unsigned int v11; // esi bool v12; // cf unsigned __int8 v13; // al unsigned __int8 v14; // al unsigned __int8 v15; // al int v16; // esi void *v17; // ecx void *v18; // ecx const char *v19; // edx ...
RSA加密
RSA加密过程1.选一对不相等且足够大的质数,p,q
2.计算p,q的乘积,n=p*q
3.计算n的欧拉函数,φ(n)=(p-1)*(q-1)
φ(n)=n-1
若n=p*q,且p,q互质,则φ(n)=φ(p*q)=φ(p)*φ(q)
4.选一个与φ(n)互质的函数e,1<e<φ(n)
5.计算出e对于φ(n)的模反函数d,de mod φ(n)=1
e和φ(n)互质,那么一定可以找到一个整数d,使用ed-1被φ(n)整除,或者说ed除以φ(n)所得余数为1(ed-1==kφ(n) )
6.公钥,KU=(e,n)
7.私钥,KR=(d,n)
明文 M 加密 M^e mod n = C
密文 C 解密 C^d mod n =M
对称密码
对称密码密码编码学分为:对称密码学,非对称密码学,密码协议。
对称加密方案也称为对称密钥(Symmetric-key)、秘密密钥(secret-key)、和单密钥(Single-key)算法,对称加密分为:分组密码和序列密码
对称加密算法的加密密钥和解密密钥是完全相同的,第一,加密算法必须足够强,第二,加密的安全性依赖于密钥的秘密性,而非算法的保密性。
假设用对称加密算法检验注册码,正确的方法是吧用户输入的注册码作为加密算法或解密算法的密钥,这样,解密者想要找到一个正确的注册码,只能穷举。但如果在检查注册码是,将用户的输入的采用做算法的输入输出,则无论是使用加密算法还是解密,解密者都可以利用调试器在内存中找到所用的密钥中,从而将算法求逆,写出注册机。
常见的对称分组加密有DES,IDEA,AES,BlowFish,TowFish,TEA,RC4等等,以下介绍几例
分组加密分组加密叫块加密,
分组密码有五种工作体制:1.电码本模式(Electronic Codebook Book (ECB));2.密码分组链接模式(Cipher Block Chaining (CBC));3.计算器模式 ...
位操作的奇淫巧技
位操作的奇淫巧技在计算机中的数在内存中都是以二进制存储的,用位运算就是直接对内存中的二进制进行操作,因此其执行效率很高,在程序中尽量使用位运算进行操作,这会大大提高程序的性能。,而在逆向中会出现大量的二进制操作,在分析代码和写脚本方面都有帮助。
下面介绍位运算的操作符都有哪些
位运算操作符& 与运算 两个位都是 1 时,结果才为 1,否则为 0,如 1 0 0 1 1& 1 1 0 0 1------------------------------ 1 0 0 0 1
| 或运算 两个位都是 0 时,结果才为 0,否则为 1,如 1 0 0 1 1| 1 1 0 0 1------------------------------ 1 1 0 1 1
^ 异或运算,两个位相同则为 0,不同则为 1,如 1 0 0 1 1^ 1 1 0 0 1----------------------------- 0 1 0 1 0
~ 取反运算,0 则变为 1,1 则变为 0,如~ 1 0 0 1 1---------------------------- ...
[GWCTF 2019]xxor
[GWCTF 2019]xxorIDA分析
__int64 __fastcall main(int a1, char **a2, char **a3){ int i; // [rsp+8h] [rbp-68h] int j; // [rsp+Ch] [rbp-64h] __int64 v6[6]; // [rsp+10h] [rbp-60h] BYREF __int64 v7[6]; // [rsp+40h] [rbp-30h] BYREF v7[5] = __readfsqword(0x28u); puts("Let us play a game?"); puts("you have six chances to input"); puts("Come on!"); v6[0] = 0LL; v6[1] = 0LL; v6[2] = 0LL; v6[3] = 0LL; v6[4] = 0LL; for ( i = 0; i <= 5; ++i ) { printf ...
[SUCTF2019] SignIn
[SUCTF 2019] SignIn知识点
gmp库
RSA加密
用IDA打开
__int64 __fastcall main(int a1, char **a2, char **a3){ char v4[16]; // [rsp+0h] [rbp-4A0h] BYREF char v5[16]; // [rsp+10h] [rbp-490h] BYREF char v6[16]; // [rsp+20h] [rbp-480h] BYREF char v7[16]; // [rsp+30h] [rbp-470h] BYREF char flag[112]; // [rsp+40h] [rbp-460h] BYREF char v9[1000]; // [rsp+B0h] [rbp-3F0h] BYREF unsigned __int64 v10; // [rsp+498h] [rbp-8h] v10 = __readfsqword(0x28u); puts("[sign in]"); printf("[input your ...
Windows反调试总结
前言以下内容我也不知道写没写全就这样吧,主要是面试时候当时问我反调试都有啥,就说了个TLS,当时是一个都没想起来,这下得好好总结一下
内容参考
加密与解密 第18章 反跟踪技术
Windows下反反调试技术汇总
Windows平台常见反调试技术梳理(上)
Windows平台常见反调试技术梳理(下)
合理的分类有助于学习和理解各种反调试技术的原理
以下就分为静态反调试方法与动态反调试方法两大类:
其中静态反调试的分类原理为:程序启动时,系统会根据正常运行和调试运行分配不同的进程环境,通过检测进程环境来检测进程是否处于调试状态;根据逆向人员的工作环境和程序的正常运行环境不同,可以通过检测调试器或逆向分析工具实现反调试。
动态反调试技术的分类原理是:进程运行时的执行流程是否正常,执行状态是否正常。
本文测试环境:
测试代码: https://github.com/alphaSeclab/anti-debug
原版OD
测试环境,这有影响吗,win7和win10和win11都试试
PE编辑器:LordPE
静态反调试IsDebuggerPresent首先试了一下调试,有插件的根本 ...
[GXYCTF2019]simple CPP
[GXYCTF2019]simple CPP知识点
C++逆向
z3脚本
Debug绕过
解题首先F12+shift查看字符串, 找到关键代码,
if ( (v23 | v22 | v28 & v29) == (~*v18 & v29 | 864693332579200012i64) && v3 )// 判断flag { v32 = print(std::cout, (__int64)"Congratulations!flag is GXY{"); v33 = flag; if ( v41 >= 0x10 ) v33 = (void **)flag[0]; v34 = sub_140001FD0(v32, (__int64)v33, v40); print(v34, (__int64)"}"); j_j_free(v6); } else { print(std::cout, (__int64)&qu ...