文件有壳 先用upx脱壳
upx -d 文件地址
把文件拖入IDA shift+F12查看可疑字符串 发现有flag的信息 继续跟进
跟进函数 F5查看伪c代码
这里destination就是flag
再查看主函数
这里有新的知识点 线程控制
CreateThread是一个Windows API函数,用于创建一个新的线程
具体可参考这位师傅的博客
主函数创建了两个线程:一个通过 CreateThread
调用 StartAddress
,另一个调用 sub_41119F
。
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
__drv_aliasesMem LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
我们先查看第一个线程
使用WaitForSingleObject
函数等待一个名为hObject
的互斥量对象。这里的0xFFFFFFFF
作为超时参数,意味着如果互斥量不可用,调用将无限期等待,直到互斥量变为可用状态。
调用sub_41112C
函数,传入Source
和dword_418008
的当前值作为参数。
调用Sleep
函数,使当前线程暂停执行0x64u
(即100毫秒)的时间。这通常用于控制操作的频率或给予其他线程执行的机会。
函数调用ReleaseMutex
来释放之前获取的hObject
互斥量
继续跟进函数 发现有一个函数有问题 发现存在堆栈不平衡的问题
F5时出现如图错误,一般是程序代码有一些干扰代码,让IDA的反汇编分析出现错误。比如用push + n条指令 + retn来实际跳转,而IDA会以为retern是函数要结束,结果它分析后发现调用栈不平衡,因此就提示sp analysis failed.
转到汇编代码
打开Option->General->stack pointer勾选 ALT+K 修改sp值
根据加密过程编写反脚本
s = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'
d = 'TOiZiZtOrYaToUwPnToBsOaOapsyS'
flag = "flag{"
for i in range(len(d)):
if i % 2 == 0:
flag += d[i]
else:
if d[i].isupper():
index = s.find(d[i])
flag += chr(index + 96)
else:
index = s.find(d[i])
flag += chr(index + 38)
flag += "}"
print(flag)
得到flag
最后答案需要多加一个E
flag{ThisisthreadofwindowshahaIsESE}