BUUCTF Youngter-drive

文件有壳 先用upx脱壳

upx -d 文件地址

把文件拖入IDA shift+F12查看可疑字符串 发现有flag的信息 继续跟进

跟进函数 F5查看伪c代码

这里destination就是flag

再查看主函数

这里有新的知识点 线程控制

CreateThread是一个Windows API函数,用于创建一个新的线程

具体可参考这位师傅的博客

http://t.csdnimg.cn/Z1Fly

主函数创建了两个线程:一个通过 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函数,传入Sourcedword_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}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值