第一次写逆向题,不会的先码着,留着以后写
ascll码转字符串
Description
无
Solution
ida32位打开,直接看汇编,不要F5
Flag
linux可执行文件 异或
Description
无
Solution
IDA64位
main:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| void __fastcall __noreturn main(__int64 a1, char **a2, char **a3) { size_t v3; int i; char s[36]; int v6; __int64 v7; char v8[8]; int v9;
v9 = 0; strcpy(v8, ":\"AL_RT^L*.?+6/46"); v7 = 28537194573619560LL; v6 = 7; printf("Welcome to the RC3 secure password guesser.\n", a2, a3); printf("To continue, you must enter the correct password.\n"); printf("Enter your guess: "); __isoc99_scanf("%32s", s); v3 = strlen(s); if ( v3 < strlen(v8) ) sub_4007C0(); for ( i = 0; i < strlen(s); ++i ) { if ( i >= strlen(v8) ) sub_4007C0(); if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) ) sub_4007C0(); } sub_4007F0(); }
|
sub_4007C0();
1 2 3 4 5
| void __noreturn sub_4007C0() { printf("Incorrect password!\n"); exit(0); }
|
sub_4007F0():
1 2 3 4 5
| void __noreturn sub_4007F0() { printf("You entered the correct password!\nGreat job!\n"); exit(0); }
|
主要逻辑就是将字符串:\"AL_RT^L*.?+6/46
复制给V8
,如果输入的字符串长度大于v8
则进入下面的循环
if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) )
是得flag的关键
exp:
1 2 3 4 5 6 7 8
| v8 = ":\"AL_RT^L*.?+6/46" v7 = "28537194573619560" v6 = 7 flag = ""
for i in range(0,len(v8)): flag += chr(ord(v8[i])^ord(v7[i%v6])) print (flag)
|
Flag
猜猜哪个是flag
Description
这题程序打不开,提示丢失什么文件,ida里面也有问题 不能F5 也没有main函数 不过给了一个c程序 差不多能猜出来题目是啥
Solution
这题目还挺良心,脚本都给了
这个flag的长度是大于25的,flag{WWtFal9kamtmM19qRWpfZVVu}
可以看出是base64编码过的
Flag
1
| flag{YkEj_djkf3_jEj_eUn}
|
简单的算法
Description
第二个密码不会了…
Solution
shift+f12
查看到password
然后跟进
更到sub_401627
看函数
发现第一个密码就是进行字符串的对比 r0b0RUlez!
再跟进到sub_4015EA(0)
,发现是一个异或
Flag
你能看懂C语言吗
Description
看不懂,指针没学好
Solution
Flag
你算什么
Description
无
Solution
发现一个假的flagnctf{this_is_a_fake_flag}
进入IDA 先看main
函数
跟进hereisyourflag
函数,发现又是ASII码转字符串
Flag
1
| nctf{Welocome_to_binary\s_world}
|
字符串对比
Description
无
Solution
IDA打开,主函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| int __cdecl main(int argc, const char **argv, const char **envp) { signed int v3; char v4; int result; int v6; int v7; char v8; char v9[20]; char v10; __int16 v11; char v12; char v13;
qmemcpy(&v13, a437261636b4d65, '#'); while ( 1 ) { memset(&v10, 0, 0x20u); v11 = 0; v12 = 0; sub_40134B((int)aPleaseInputYou, v6); scanf(aS, v9); if ( strlen(v9) > '\x11' ) break; v3 = 0; do { v4 = v9[v3]; if ( !v4 ) break; sprintf(&v8, asc_408044, v4); strcat(&v10, &v8); ++v3; } while ( v3 < 17 ); if ( !strcmp(&v10, &v13) ) sub_40134B((int)aSuccess, v7); else sub_40134B((int)aWrong, v7); } sub_40134B((int)aWrong, v7); result = stru_408090._cnt-- - 1; if ( stru_408090._cnt < 0 ) result = _filbuf(&stru_408090); else ++stru_408090._ptr; return result; }
|
大概意思就是将我们输入的字符串和v13
进行比较
strcmp
比较的是字符串的十六进制,所以直接将v13:437261636b4d654a757374466f7246756e
十六进制数转化为字符串即可
Flag
做不出来就破解它
Description
无
Solution
Flag
逆向思路
peid打开看什么类型的文件,查壳
进行静态或者动态分析,用ida,od,gdb等工具
可能会涉及到一些c语言的算法
感觉主要就是读代码,然后找代码