buucf.reverse 1-32

1、easyre

考点:IDA工具使用

shift+f12直接得到flag

2、reverse1

X64架构;比较用户输入的flag

for (j = 0; ; ++j)
{
    v8 = j;
    v2 = j_strlen(Str2);
    if (v8 > v2)
        break;
    if (Str2[j] == 111)#将str2中的'o'替换为'0'
        Str2[j] = 48;
}  
sub_1400111D1("input the flag:");
  sub_14001128F("%20s", &Str1);#将用户输入的信息存放在str1中
  v3 = j_strlen(Str2);
  if ( !strncmp(&Str1, Str2, v3) )#如果str2=str1;提示正确的flag
    sub_1400111D1("this is the right flag!\n");#说明str2为正确flag
}

找到str2存储的信息将’o’替换为’0’

3、reverse2

 {
    for ( i = 0; i <= strlen(&flag); ++i )
    {
      if ( *(&flag + i) == 105 || *(&flag + i) == 114 )
        *(&flag + i) = 49;#将flag中的i r 替换为1
    }
  }
  printf("input the flag:", argv);
  __isoc99_scanf("%20s", &s2);
  if ( !strcmp(&flag, &s2) )
    result = puts("this is the right flag!");
  else
    result = puts("wrong flag!");
  return result;
}

将flag中的i r 替换为1
在这里插入图片描述

4、内涵的软件

考点:熟悉IDA;shift+f12直接得到flag

5、 新年快乐

1、发现程序加了UPX 3.9.1的壳;脱壳(手动脱壳)

upx -d xx.exe

2、X32程序

 strcpy(&v4, "HappyNewYear!");#将字符串复制到v4内存地址
  v5 = 0;
  memset(&v6, 0, 0x1Eu);#将v6前30个字节设置为0
  printf("please input the true flag:");
  scanf("%s", &v5);#用户输入的信息存储到v5中
  if ( !strncmp((const char *)&v5, &v4, strlen(&v4)) )#比较v4与v5;说明v4就是flag
    result = puts("this is true flag!");
  else
    result = puts("wrong!");
  return result;
}

6、xor

  v3 = (char *)256;
  printf("Input your flag:\n", 0LL);
  get_line(v6, 256LL);#将用户输入的值存储在v6中
  if ( strlen(v6) != 33 )#检查v6的长度
    goto LABEL_12;
  for ( i = 1; i < 33; ++i )#遍历字符
    v6[i] ^= v6[i - 1];#将当前字符与前一个字符异或
  v3 = global;
  if ( !strncmp(v6, global, 0x21uLL) )#比较v6和v3的值
    printf("Success", v3);
  else
LABEL_12:
    printf("Failed", v3);

思路:比较v3与v6的值;v6的值进行了异或处理;找到v3的值逆向还原就是正确flag

#exp
ida_chars = [
    0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26, 0x4F, 0x2E, 0x40, 0x11,
    0x78, 0x0D, 0x5A, 0x3B, 0x55, 0x11, 0x70, 0x19, 0x46, 0x1F,
    0x76, 0x22, 0x4D, 0x23, 0x44, 0x0E, 0x67, 0x06, 0x68, 0x0F,
    0x47, 0x32, 0x4F, 0x00
]
v6 = ida_chars.copy()
original = [0] * 33
original[0] = v6[0]
for i in range(1, 33):
    original[i] = v6[i] ^ v6[i - 1]
print("".join(chr(x) for x in original))

7、reverse3

题目:

  sub_41132F("please enter the flag:");
  sub_411375("%20s", &Str);#str存储用户输入
  v0 = j_strlen(&Str);#length
  v1 = (const char *)sub_4110BE(&Str, v0, &v11);#调用函数修改str
  strncpy(Dest, v1, 0x28u);#将v1复制到Dest数组中
  v8 = j_strlen(Dest);#length
  for ( j = 0; j < v8; ++j )#对每个字符ASCII值加上自己的索引j
    Dest[j] += j;
  v2 = j_strlen(Dest);
  if ( !strncmp(Dest, Str2, v2) )#比较str2与Dest操作
    sub_41132F("rigth flag!\n");
  else
    sub_41132F("wrong flag!\n");
}

思路:就是将str2中的元素的ASCII减去自己的索引J;然后通过sub_4110BE函数还原;跟进sub_4110BE发现是base64编码

import base64
s = [101, 51, 110, 105, 102, 73, 72, 57, 98, 95, 67, 64, 110, 64, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巅峰赛2000分以下是巅峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值