0x01 dmd-50
输入字符串,md5后若为780438d5b6e29db0898bc4f0225935c0则输出正确
但是输入grape不对。
这是因为grape两次md5后才得到780438d5b6e29db0898bc4f0225935c0,而题目中要md5一次就得到780438d5b6e29db0898bc4f0225935c0。卡在这里了。
看了题解才醒悟,将grape md5一次后的得到的字符串,不就可以md5一次得到780438d5b6e29db0898bc4f0225935c0吗。
flag就是b781cbb29054db12f88f08c6e161c199,没有前缀。
比较简单,可惜我脑袋没转过弯来。
0x02 Shuffle
直接拿到flag。
这种题太浪费时间了。
(话不要说得太满。——《毛选》)
0x03 re2-cpp-is-awesome
题目描述:他们说c++是复杂的,证明他们说的是错的!
忍不住吐槽:其实他们说的是对的。。。
主函数:
看着花里胡巧的是吧。
其实那些很长的语句,大多是c++的STL,逆向的时候看着是长,但是正向编程的时候就是一个简单的函数或方法。
这道题比较基础,我没怎么看懂其中的STL,也能做出来
关键代码
char_2是char_1,而char_1
初步估计就是输入的字符串
判断输入字符串和off_6020A0[dword_6020C0[i_1]]是否相等。off_6020A0是字符型指针,指向
dword_6020C0是int数组。
所以就是从dword_6020C0中获取偏移量,再在字符串中获取字符,与输入字符串逐一比较。
获取dword_6020C0的IDC脚本
1 | static main() |
解密脚本
1 | s = r'''L3t_ME_T3ll_Y0u_S0m3th1ng_1mp0rtant_A_{FL4G}_W0nt_b3_3X4ctly_th4t_345y_t0_c4ptur3_H0wev3r_1T_w1ll_b3_C00l_1F_Y0u_g0t_1t''' |
ALEXCTF{W3_L0v3_C_W1th_CL45535}
是不是逻辑很简单?
0x04 crackme
见到了一个新壳,nsPack,网上找了个脱壳工具。
傻瓜式脱壳
不过好像脱的不是很干净,ida打开时弹出几个报错窗口
不过还是能正常加载出函数来的。
很简单的异或。
1 | a = [0x74] + [ord(i) for i in 'his_is_not_flag'] |
0x05 re-for-50-plz-50
本题考查mips架构下的逆向。
https://blog.csdn.net/yang_hong_/article/details/51016867
这种汇编我没接触过,肯定看不懂呀。
看了题解才发现,就是字符串异或0x37。
x86,x86-64都还没学好,这类型的题先放一放吧。
1 | s = 'cbtcqLUBChERV[[Nh@_X^D]X_YPV[CJ' |
Reversing-x64Elf-100
加密算法:移位后+1.
很简单的算法。
解密脚本:
1 | v3 = "Dufhbmf"+"pG`imos"+"ewUglpt" |
最初是用c++写的(就是把IDA中的代码改了改),但是不正确。原因在于v3,v4,v5的地址未必连续。
错误脚本:
1 |
|
IgniteMe
主函数:
看着花里胡巧的,其实关键代码不多。
sub_4011C0:
没啥可说的,直接放解密脚本:
1 | byte_4420B0 = [0x0d,0x13,0x17,0x11,0x2,0x1,0x20,0x1d,0x0c,0x2,0x19,0x2f,0x17,0x2b,0x24,0x1f,0x1e,0x16,0x9,0x0f,0x15,0x27,0x13,0x26,0x0a,0x2f,0x1e,0x1a,0x2d,0x0c,0x22,0x4] |
注意一点,异或的运算优先级低于减号。我被这一点坑了十分钟。
srm-50
简直就是明文存储的flag.
把上图中的字符读出来,就是flag.
Windows_Reverse1
加密后的字符串已知,加密如下:
很简单的替换,只是byte_402ff8无法看到数据。
动态轻松获取:
1 | s = ' '*32 + '~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(\'&%$#"!' |
拿到flag{ZZ[JX#,9(9,+9QY!}
后,我没敢提交,没见过这么怪的flag(swpuctf2019 mobile2除外)