buu刷题

[GXYCTF2019]luck_guy

查壳

没有壳,用64位ida打开,找到一个关键函数patch_me

 这段代码是判断奇数,偶数奇数的话就打印“just fiinished",偶数进入get_flag函数,继续跟进

 这是解出flag的函数,接下来进行分析:

这个函数是伪随机,下面case语句是有顺序的,有用的是case1,4,5。case1是将f1,f2两个字串拼接起来,想必就是flag,查看f1:GXY{do_not_,f2为空,那么就需要f2解出来,接着看下面程序,case4是将s = 0x7F666F6067756369LL的值赋给了f2,case5就是对f2的一个处理。

接下来就是脚本解决f2(需要注意下大小端存储问题)

flag{do_not_hate_me}

 [BJDCTF2020]JustRE

 无壳,用32位ida打开shift+f12查看关键字符串

发现类似于flag的字符串 BJD{%d%d2069a45792d233ac} 找到它所在的函数

 %d%d 中的 %d 部分将被具体的整数值替代,结果字符串中将不再包含 %d

最终的字符串结果是 " BJD{1999902069a45792d233ac}"

flag为:flag{1999902069a45792d233ac}

刮开有奖

32位无壳,并且运行程序没用

  DialogBoxParamA这个函数是建立一个对话框,然后传一个函数最为参数即DialogFunc这个函数

这就是主函数部分,简单分析flag是8位的,然后是对字符进行加密

但有10个字符,还有个sub_4010F0函数,点进去看一下

 这个函数对10个字符进行了处理这里需要将伪代码改为C的代码(从大佬的博客知道a1+4*i,也就是a1[i],a1+4 * result,也就是a1[result],因为int占四个字节,所以需要*4.如果是char类型就不需要.,将*(_DWORD*) 删掉就可以将伪代码修改为可以运行的C代码)

#include <stdio.h>
int  sub_4010F0(char* 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;
}

int main()
{
    char str[] = "ZJSECaNH3ng";
    sub_4010F0(str,0,10);
    printf("%s", str);
    return 0;
}
运行后得到经过处理的字符:3CEHJNSZagn

 紧接着有个sub_401000,进去看看,发现很复杂看到有一个byte_407830函数

 是将是将,v4 = ak1w,v5 = V1Ax,两个字符串base64加密。分别解出来为v4 = jMp,v5 = WP1

 最后的代码

 后面四个字符,就是base64加密的那几个,可以看到第三第四字符已经是WP了,说明,WP1在前,jMp在后,,将他们拼接在一起,得到,UJWP1jMp。

简单注册器

下载完附件发现是apk文件,用jadx反编译

 咱也不会弄胡乱点,发现了个字符串dd2940c04462b4dd7c450528835cca15

看起来很复杂但主要还是

   if (flag == 1) {
                    char[] x = "dd2940c04462b4dd7c450528835cca15".toCharArray();
                    x[2] = (char) ((x[2] + x[3]) - 50);
                    x[4] = (char) ((x[2] + x[5]) - 48);
                    x[30] = (char) ((x[31] + x[9]) - 48);
                    x[14] = (char) ((x[27] + x[28]) - 97);
                    for (int i = 0; i < 16; i++) {
                        char a = x[31 - i];
                        x[31 - i] = x[i];
                        x[i] = a;
                    }
                    String bbb = String.valueOf(x);
                    textview.setText("flag{" + bbb + "}");
                    return;
                }

这一部分是需要通过改写可以得到flag()

 

 [GWCTF 2019]pyre

 下载完附件是.pyc文件,python反编译,找了个在线工具

 需要反过来求input1

code = ['\x1f', '\x12', '\x1d', '(', '0', '4', '\x01', '\x06', '\x14', '4', ',', '\x1b', 'U', '?', 'o', '6', '*', ':',
'\x01', 'D', ';', '%', '\x13']

l = len(code)
print(l)
flag = ''
for i in range(l - 2, -1, -1):
code[i] = chr(ord(code[i]) ^ ord(code[i + 1]))
for i in range(l):
flag += chr((ord(code[i]) - i) % 128)

print(flag)

 得到的结果最后用flag{}包裹

[ACTF新生赛2020]easyre

解压后有两个exe对其中一个查壳

 发现有壳,upx脱壳

另一个exe是这样的

 应该没啥用

32位ida打开

从flag长度应该是12,将flag的ASCII值作为下标取值,与v4数组比较。需要利用v4数组_data_start__中找位置,就是我们flag的值

[ACTF新生赛2020]rome

 

 主函数没有什么,进入进入func()

 

v2是一个数组,输入之后会对输入的数进行一系列if判断,其实前面就是ACTF{接下来将{之后的4个值给到v1这个数组,然后是一个16次循环判断是否是大小字母,进行相应的变换,有一点点像凯撒的风格,最后将变换的值与v12那一串数字进行比较。

 得到flag:ACTF{Cae3ar_th4_Gre@t}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值