逆向攻防世界CTF系列56-easy_Maze
逆向攻防世界CTF系列56-easy_Maze64位无壳,看题目就知道是迷宫问题了 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960int __fastcall main(int argc, const char **argv, const char **envp){ __int64 v3; // rax int v5[7][7]; // [rsp+0h] [rbp-270h] BYREF int v6[104]; // [rsp+D0h] [rbp-1A0h] BYREF v6[52] = 1; v6[53] = 1; v6[54] = -1; v6[55] = 1; v6[56] = -1; v6[57] = 1; v6[58] = -1; v6[59] = 0; v6[60] = 0; v6[61] = 0; v6[62] = 0; v6[63] = 1; ...
逆向攻防世界CTF系列55-Replace
逆向攻防世界CTF系列55-Replace32位,upx壳 1234567891011int __cdecl main(int argc, const char **argv, const char **envp){ char Buffer[40]; memset(Buffer, 0, sizeof(Buffer)); printf("Welcome The System\nPlease Input Key:"); gets_s(Buffer, 0x28u); if ( strlen(Buffer) - 35 <= 2 ){ if ( sub_401090(Buffer) == 1 ) printf("Well Done!\n"); else printf("Your Wrong!\n"); } return 0;} 跟进sub401090: 12345678910111213141516171819int __fastcall...
逆向攻防世界CTF系列54-crypt
逆向攻防世界CTF系列54-crypt64位无壳 123456789101112131415161718192021int __fastcall main(int argc, const char **argv, const char **envp){ strcpy(Str, "12345678abcdefghijklmnopqrspxyz"); memset(&Str[32], 0, 0x60ui64); memset(v10, 0, 0x17ui64); sub_1400054D0("%s", v10); v9 = malloc(0x408ui64); v3 = strlen(Str); sub_140001120(v9, Str, v3); v4 = strlen(v10); sub_140001240(v9, v10, v4); for ( i = 0; i < 22; ++i ){ if (((unsigned __int8)v10[i] ^ 0x22) !=...
逆向攻防世界CTF系列52-Newbie_calculations
逆向攻防世界CTF系列52-Newbie_calculations32位,无壳 我们得到的信息是,32位初始值赋为1,然后很多函数重复,这是一个生成flag的题型 1234567891011121314151617181920212223_DWORD *__cdecl sub_A31100(_DWORD *a1, int a2){ v4 = *a1;//1 v5 = a2;//1000000000 v3 = -1; v8 = 0; v7 = a2 * v4;//1000000000 while ( a2 ){//1000000000 v6 = v7 * v4; sub_A31000(&v8, *a1);//0,1 ++v7; --a2; v5 = v6 - 1; } while ( v3 ){ ++v7; ++*a1; --v3; --v5; } ++*a1; *a1 = v8; return...
逆向攻防世界CTF系列51-easyre-xctf
逆向攻防世界CTF系列51-easyre-xctfupx,64位,脱壳 XPU{galfd_0n3_4nd_tw0} 有点怪,提交错了 后来想起来是小端序 flag{UPXd_0n3_4nd_tw0}} 还是错了,发现还有一块 flag{UPX_4nd_0n3_4nd_tw0}
逆向攻防世界CTF系列50-testre
逆向攻防世界CTF系列50-testre定位 跟进400D00 逻辑:接收输入,长度17,最后附上一个0符号(可能代表结束符) 跟进sub_400700 复杂 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091__int64 __fastcall sub_400700(void *a1, _QWORD *a2, __int64 a3, size_t a4){ s = a1; v30 = a2; v29 = a3; v28 = a4; v27 = -559038737; v26 = malloc(0x100uLL); v25 = v29; v24 = v6; v22 = 0LL; v17 = 0LL; for ( i = 0LL; i < v28;...
逆向攻防世界CTF系列49-easyre-153
逆向攻防世界CTF系列49-easyre-153.mdupx壳,32位,脱壳 1234567891011121314151617181920212223242526272829int __cdecl main(int argc, const char **argv, const char **envp){ int pipedes[2]; // [esp+18h] [ebp-38h] BYREF __pid_t v5; // [esp+20h] [ebp-30h] int v6; // [esp+24h] [ebp-2Ch] BYREF char buf[30]; // [esp+2Eh] [ebp-22h] BYREF unsigned int v8; // [esp+4Ch] [ebp-4h] v8 = __readgsdword(0x14u); pipe(pipedes); v5 = fork(); if ( !v5 ){ puts("\nOMG!!!! I forgot kid's id"); ...
逆向攻防世界CTF系列48-Signin
逆向攻防世界CTF系列48-Signin.md直接定位 输入,然后跟踪96A 一个整数一个余数你会发现这是把输入字符变成两个分开的十六进制存储起来,比如输入字符 ‘1’ ,它的整数是49,49除16的整数是3,余数是1,在byte_202010下标中分别对应3和1,构成的31就是字符 ‘1’的ASCII的十六进制形式,只不过是分开的十六进制,3 1 共两个字节。 __gmpz_init_set_str猜测就是赋值,查了一下: 就是将字符串”ad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35” 看做是一个十六进制数,将其保存到v7中,v7中的值为数字类型的十六进制数ad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35 。 __gmpz_powm,查了一下: void mpz_powm (mpz_t rop, const mpz_t base, const mpz_t exp, const mpz_t mod)...
逆向攻防世界CTF系列47-crazy
逆向攻防世界CTF系列47-crazy64位无壳 丢入IDA并远程调试,随便输入,发现要32位长度,也跟踪到几个函数 校验函数: 判断长度和简单处理逻辑 主函数: 到这逻辑理顺了,其实这题的难点主要在眼花缭乱的C++代码 会头看这,应该是把输入赋值给a1+16和a1+48,然后把327a6c4304ad5938eaf0efb6cc3e53dc给了a1+80 12345678910111213141516unsigned __int64 __fastcall HighTemplar::HighTemplar(DarkTemplar *a1, __int64 a2){ char v3; // [rsp+17h] [rbp-19h] BYREF unsigned __int64 v4; // [rsp+18h] [rbp-18h] v4 = __readfsqword(0x28u); DarkTemplar::DarkTemplar(a1); *(_QWORD *)a1 = &off_401EA0; *((_DWORD *)a1 + 3) =...
逆向攻防世界CTF系列46-key
逆向攻防世界CTF系列46-key32位,无壳,跟踪 IDA动调,发现会一闪而过退出,OD调试 fiopen在401620中 congra在下面这里 到这其实我已经凌乱了,加上中午没休息,已经又困又累了 硬着头皮干吧 梳理下:我们已经知道这些字符串在哪输出的,最终目的是输出congrat…,中间肯定有个判断的过程,我们需要把在哪判断的地方找出来,那么之前有个wrong key,那里可能存在判断 彻底懵逼了,看大佬的wp,好像是需要创建一个flag文件的 建了一个,od测试了一下 如果没有这个文件的话,应该最后肯定会经过下面的exit 就是在那个插入口判断了,然后输出了wrongkey,我们把如何判断的逻辑搞清楚应该就可以找出flag 跟进 复杂,先放一放 还需要注意的是,之前文件写入的去哪了? 如果能跟踪到分析会更轻松 之前跟踪到是在sub_D01620(v2, v16, v17,...