BUUCTF逆向刷题二

文章详细描述了使用逆向工程工具IDA分析32位无壳程序的过程,通过查找字符串、反编译函数,识别加密和解密机制,最终解密Base64编码得到flag。涉及的技术包括字符串分析、函数跟踪、加密算法理解和C代码重构。
摘要由CSDN通过智能技术生成

不一样的flag

题目链接当然是来自buu上面的逆向了,这里就不放了
做题第一步例行查壳,上PE,如下图捏没有壳且是32位程序,所以嘞直

在这里插入图片描述
接用ida打开即可查找一哈字符串发现极为可疑不确定再看看,看看主函数
在这里插入图片描述
进入主函数反编译很好得到了什么捏,确定了我们的想法呢
在这里插入图片描述

一二三四是上下左右再康康给我们的字符串数一数,哦原来25位直接把他们五个一行五个一行呗,然后不能碰到1想办法走0从*到#号那里,然后就没然后了直接出flag咯

*1111
01000
01010
00010
1111#

迷宫如上呗就走嘛挺简单一题

JustRe

题目依旧buu上面的
第一步例行查壳发现无壳且为32bit,直接用ida打开
在这里插入图片描述
查找字符串在最下面发现可疑字符串疑似flag
在这里插入图片描述
很好我以为得出flag开开心心去输入,结果输入错误,那就看看这个函数的反编译吧
在这里插入图片描述
大概就是这个程序要点19999次然后就出flag然后呢我们看那里呢,当然是看sprintf函数咯,看见前面的%d%d,大胆猜测后面跟的19999与0就是%d所代表的,毕竟逆向这玩意三分经验七分蒙,大胆尝试,结果很好正确地。

刮开有奖

还是那一套开局先查壳发现无壳32位直接ida打开
在这里插入图片描述
打开后查找字符串发现base64的编码规则,然后直接确定这道题肯定要用到base64解密,至于逆向题里的加密方式要是不是很懂呢可以去百度学习一哈
在这里插入图片描述
然后继续跟进呗发现一堆字符串但是没头绪直接进入主函数反编译
在这里插入图片描述
进入DialogFunc函数里面,然后我们注意到string长度为8所以我们可以确定flag的长度为8
在这里插入图片描述
再往下看看还有没有什么东西,发现了下面还有个函数里面有十个字符,查看sub_4010F0函数发现这应该是加密的函数,直接把它转为C语言如下

#include<stdio.h>
int __cdecl sub_4010F0(int a1, int a2, int a3)
{
  int result; // eax
  int i; // esi
  int v5; // ecx
  int v6; // edx

  result = a3;
  for ( i = a2; i <= a3; a2 = i )
  {
    v5 = i;
    v6 = i[a1];
    if ( a2 < result && i < result )
    {
      do
      {
        if ( v6 > a1[result])
        {
          if ( i >= result )
            break;
          ++i;
          a1[v5] = a1[result];
          if ( i >= result )
            break;
          while ( a1[i] <= v6 )
          {
            if ( ++i >= result )
              goto LABEL_13;
          }
          if ( i >= result )
            break;
          v5 =  i;
          a1[result] = a1[i];
        }
        --result;
      }
      while ( i < result );
    }
LABEL_13:
    a1[result] = v6;
    sub_4010F0(a1, a2, i - 1);
    result = a3;
    ++i;
  }
  return result;
}

这里没有主函数别着急先分别出所需加密的字符串是啥,看见上面的那一堆ascll码直接转为字符如下图
在这里插入图片描述
这里即是所需加密的字符串然后接着上面没写完的代码写呗

int main()
{
	char str[] = "ZJSECaNH3ng";
	sub_4010F0(str,0,10);
	printf("%s", str);
	return 0;
}

这就是主函数然后运行一哈子得到加密后的字符串为

3CEHJNSZagn

接下来直接接着看DialogFunc函数,这里直接猜是用base64解密v4与v5,因为它给出的base编码表后面紧跟着的就是v4和v5,直接在线找个网站得到解密后的字符
在这里插入图片描述
加密后的v4与v5分别为jMp与WP1,然后接着往上看在这个函数这获取flag前几位
在这里插入图片描述
这里的string0它并非是Z而是加密后的3,3的ascll码为51,它加34为85对应的字符为U,string[1]为v10,它这里的v10同样为加密后的字符,v10是第五个字符也就是3CEHJNSZagn中的J,而这里的string[2]为加密后的第三位即E转为ascll码为69,再用69*3+141以后除以4等于87即W,string[3]求法与string[2]基本相同得出它为P,由此看出它后面跟的是v5,v5后面才是v4,所以再结合v4与v5得出flag为flag{UJWP1jMp}
这道题还是有点东西在里面的捏,base编码不是很新,现在二刷感觉思路清了不止一点半点,注意别把下面的那些flag前几个字符串搞混了就ok

总结

这里呢是缓解一下自己做题做的有点猛导致脑子有点不清醒的感受,同样希望可以帮助别人吧,这篇博客虽然就三个题,前两个就不说了,第三个还是很有意义的,把第三个搞明白了以后会对自己提升很大,慢慢加油吧,毕竟路还长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值