BUUCTF-RE-Youngter-drive

20 篇文章 1 订阅
18 篇文章 1 订阅

PEID查壳

在这里插入图片描述
发现是UPX的壳,脱壳
在这里插入图片描述
脱壳之后再查壳
在这里插入图片描述

关键代码审计

进入main函数
在这里插入图片描述再进入到main_0函数
在这里插入图片描述
代码分析
打印在这里插入图片描述
并将输入的字符串保存在Source变量里面
具体分析如图所示
在这里插入图片描述
sub_411190()函数将Source的值与"TOiZiZtOrYaToUwPnToBsOaOapsyS"对比
在这里插入图片描述
按x查看交叉引用
在这里插入图片描述
来到StartAddress_0()函数里面
在这里插入图片描述在这里插入图片描述
dword_418008的值为29
查看WaitForSingleObject函数的交叉引用
在这里插入图片描述
在这里插入图片描述其实可以知道,当执行量为10时,转向被冻结线程B,也就是说sub_41119F,dword_418008=29当执行到第9执行量的时候减一,然后线程被冻结(Sleep),然后转向另一个线程,结合图我们可以知道,当数值为奇数的时候,对字符串进行处理,为偶数的时候不进行处理,其实就叫线程互斥,每两个字符写一次

进入sub_41112C()函数
在这里插入图片描述
跳转问题
在这里插入图片描述
将jz改为jmp就可了
在这里插入图片描述
就可以F5了
在这里插入图片描述
分析清楚可以写脚本了

脚本

#include<stdio.h>

int main(void)
{
   char str1[] = "TOiZiZtOrYaToUwPnToBsOaOapsyS";
   char str2[] = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
   char flag[30] = {0};
   int i = 0;
   int j = 0;
   for(i = 28;i > -1;i--)
   {
     if(i % 2 == 1){   //为奇数时
     for(j = 0;j < 52;j++)   //52是因为str2的长度为53  也可以改为sizeof(str2)-1
     {
         if(str1[i] == str2[j])
         {
             flag[i] = j+ 38;
             if(!(flag[i] >= 65 && flag[i] <= 90))
             {
                 flag[i] = j+96;
                 break;
             }
         }
     }
     }else
     {
        flag[i] = str1[i];
        continue;
     }
   }
    puts(flag);
    return 0;
}

在这里插入图片描述

get flag

查看大佬的wpBUUCTF-re-Youngter-drive

其实最后一位没有对比,所以要多加一个E,搞得我忙活半天,还以为出错了
flag{ThisisthreadofwindowshahaIsESE}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值