好友
阅读权限 10
听众
最后登录 1970-1-1
本帖最后由 QAQ~QL 于 2022-2-18 19:21 编辑
思路
UPX壳,使用ESP定律脱壳 ,不细讲,文末教程
脱后文件拖入IDA
得知sub_401520为比较函数,sub_401100和sub_401080和sub_401110为uid参数处理函数运行程序,确定两个变量uid和key,在三个入口函数下断调试+ida分析,发现输入字串经过处理后在sub_401520比较flag输出success遂打算直接还原代码进入uid处理的三个关键方法(sub_401100,sub_401080,sub_401110)这三个方法,生成两个参数,并传入sub_401520(1,2,3,4,uid_1,uid_2)进行判断,遂对三个方法进行步入跟踪sub_401100,sub_401080方法简单,实现过程如下[Python] 纯文本查看 复制代码
def sub_401100(uid): return uid % 25
def sub_401080(uid):
return list(range(1, 26, 2))[uid % 12] sub_401110过于繁琐,我还是太菜了,无法还原,无奈放弃还原思路,直接od动调hook算好的uid_1,uid_2便更换思路,从sub_401520判断函数下手在其领空内存发现疑似flag文本 -> flag{Happy_New_Year_52Pojie_2022}遂记录下字符串Happy_New_Year_52Pojie_2022输入测试数据(Happy_New_Year_52Pojie_2022),得出下标uid key 123456 Bujjs_Hyq_Syul_52Jidcy_2022 123 Utkkp_Gbl_Pbto_52Kvyjb_2022
测试数据,收集flag
发现该函数会处理输入字符,并和flag作比较返回int结果抄起py,输出发现文本处理并无明显规律,重新查看代码[Python] 纯文本查看 复制代码
str1 = 'Happy_New_Year_52Pojie_2022'# str2 = "Utkkp_Gbl_Pbto_52Kvyjb_2022"str2 = "Bujjs_Hyq_Syul_52Jidcy_2022"
for i in range(27):
if str1[i] == str2[i]:
continue
print("{:3d}-> {} <> {:3d} -> {} === {}".format(ord(str1[i]), str1[i], ord(str2[i]), str2[i], ord(str2[i]) - ord(str1[i])))
跟入sub_401520,发现内容颇长,动调查看有用部分,前面一大段对flag的处理忽略,后面的释放空间也忽略,得到关键函数sub_4011B0和sub_403ED0,祭出ida,想起刚刚的uid_1和uid_2,得出sub_4011B0为关键函数
sub_4011B0 在ida中分析得知 大小写分类型进行运算 chr(15 * (ord(i) - 20 - num) % 26 + num) num=大写:65 小写:97便使用逆推算法,推出本人uid正确的flag[Python] 纯文本查看 复制代码
def u1s1(pr): for i in string.ascii_letters:
num = 97 if i.islower() else 65
if chr(15 * (ord(i) - 20 - num) % 26 + num) == pr:
return i
str1 = 'Happy_New_Year_52Pojie_2022'
str2 = []
for i in str1:
print(u1s1(i) if i.isalpha() else i, end="")
代入算出结果发现答案错误,简直怀疑人生了................后抱着试一试的心态,测试
str1=flag{Happy_New_Year_52Pojie_2022}
结果答案正确,大写的无语..............
算了半个晚上用的都是 Happy_New_Year_52Pojie_2022 属实心态有点蹦了至此题三结束