传送门:BUUCTF在线评测
先梳理一下这题要用到的知识点
1:upx的查壳与脱壳(老朋友了,就不多讲了,可以去下面看原理)
2:多线程和ida平衡堆栈 (第一次遇到有点难懂)
可以去看下面大佬的文章简单的了解一下其原理
upx壳:upx加壳原理-CSDN博客
线程:多线程原理及简单介绍-CSDN博客
线程基本原理_线程原理-CSDN博客多线程原理及简单介绍-CSDN博客
ida平衡堆栈:IDA F5堆栈不平衡的处理-CSDN博客
做题
将下载好的题目程序放入DE里查一下壳
32位upx的壳直接在Windows上脱壳(工具以前文章中有提到)
这样就脱好壳了,我们可以放入DE里在查一下
放入ida里看看找到主函数main
好空但看到一个main_0跟进看看
这里提示我们这题是线程题而且是多线程的
点开这两个线程看看
StartAddress函数:
sub_41119F函数:
跟进sub_411190看看
在跟进看看sub_411880
for循环?flag字符数有29个。跟进不了了shift+f12看看
看到两个特殊的字符串从上面得到的29个密文应该是第一个加上上面的分析flag有30个字符数
接下来就是找到加密过程了
汇编窗口找到text:00411A04
看到这个alt+k修改sp为-0x4
就可以看sub_411880函数了跟进
字符替换,将上面得到的两个特殊的字符串放入脚本
key = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'
enc = 'TOiZiZtOrYaToUwPnToBsOaOapsyS'
flag = ''
for i, char in enumerate(enc):
if i % 2 == 0:
flag += char # 偶数索引,直接添加
else:
# 奇数索引,根据字符是大写还是小写,分别解密
flag += chr(key.index(char) + (96 if char.isupper() else 38))
print(flag)
输出:ThisisthreadofwindowshahaIsES;flag有30个最后一个要么爆破要么一个个猜26个字母大小写都试一下猜出最后一个为E,所以最终的flag{ThisisthreadofwindowshahaIsESE}