目录
入门逆向
Easy_Re
游戏过关
sign_in
Easy_vb
Next
入门逆向
题目链接。丢入DIE、PEID看过,没有壳,32位,直接IDA,汇编代码直接看到 flag{Re_1s_S0_C0OL}。
Easy_Re
题目链接。描述: flag格式:DUTCTF{xxxx}。丢入PDID、DIE,得到信息Microsoft Visual C++ 8,没有壳,32位。丢入IDA,找到v5变量初始化值,按 r 和 shift+e 提取到 DUTCTF{We1c0met0DUTCTF}
游戏过关
题目链接。描述: zsctf{}。丢入DEID、DIE得到Microsoft Visual C++ 8.0,没有壳,32位。丢入IDA,发现玩游戏过关不太可能。shift+F12找flag有关字符串,双击进去,ctrl+x 找到字符串调用位置,是sub_45E940函数
sub_45E940函数中 v3、v4、v5、v6变量内存地址是连续的。
核心算法是以v3和v6地址的字符串,逐个异或再和0x13异或,得到flag。
提取v3、v4、v5、v6的值,如果是字符串就用s3、s4、s5、s6,其中v3、v4、v5组成长度56的字符串,v6自己长度足够。找flag的python代码如下。
# v3 数组
v3 = [123, 32, 18, 98, 119, 108, 65, 41, 124, 80, 125,
38, 124, 111, 74, 49, 83, 108, 94, 108, 84, 6, ]
# qmemcpy(v4, "`S,yhn _uec{", 12);
s4 = '`S,yhn _uec{'
# v4 数组下标12以后的赋值情况
v4 = [127, 119, 96, 48, 107, 71, 92, 29, 81,
107, 90, 85, 64, 12, 43, 76, 86, 13, 114, 1, ]
# strcpy(v5, "u~");
s5 = 'u~'
# v3 v4 v5地址连续,直接拼接出来s3
s3 = ''
for i in v3:
s3 += chr(i)
s3 += s4
for i in v4:
s3 += chr(i)
s3 += s5
# v6数组
v6 = [18, 64, 98, 5, 2, 4, 6, 3, 6, 48, 49, 65, 32, 12,
48, 65, 31, 78, 62, 32, 49, 32, 1, 57, 96, 3, 21, 9, 4,
62, 3, 5, 4, 1, 2, 3, 44, 65, 78, 32, 16, 97, 54, 16, 44,
52, 32, 64, 89, 45, 32, 65, 15, 34, 18, 16, 0, ]
# s6字符串
s6 = ''
for i in v6:
s6 += chr(i)
# 核心算法
flag = ''
for i in range(56):
temp = ord(s3[i]) ^ ord(s6[i])
temp = temp ^ 0x13
flag += chr(temp)
print(flag)
得到 zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}
sign_in
题目链接。提示:君远至此,辛苦至甚。 窃谓欲状,亦合依例,并赐此题。附件是apk,在安卓模拟器里跑一下,猜测password就是flag。
使用工具jadx,打开这个apk文件,找到MainActivity,checkPassword方法 ,先getFlag得到一个名为toString的字符串,反转一下,再base64。Android 里面资源参考这篇字符串资源 | Android 开发者 | Android Developers。我们找R.string.toString,去 res/values/filename.xml 里面找。
在 res/values/filename.xml 里面找到 991YiZWOz81ZhFjZfJXdwk3X1k2XzIXZIt3ZhxmZ,翻转得到 ZmxhZ3tIZXIzX2k1X3kwdXJfZjFhZ18zOWZiY199,base64解密得到 flag{Her3_i5_y0ur_f1ag_39fbc_}
Easy_vb
题目链接。描述: flag{xxxx}。丢进PEID、DIE得到Microsoft Visual Basic v5.0/v6.0,没有壳,32位。
丢入IDA后,直接看到MCTF{_N3t_Rev_1s_E4ay_},根据藐视是 flag{_N3t_Rev_1s_E4ay_}
Next
题目链接