[HNCTF 2022 Week2]

e@sy_flower

去除花指令

使用ida打开, F5没有用,直接向下滑,看到爆红的花指令

image-20230425113921532

鼠标右击爆红的那一行, Patching -> Change byte

image-20230425114132541

因为图片圈中的地方是+1,所以将第一个改为90(0x90 = NOP)即可

image-20230425114318554

对着 main 函数 点击 p即可编译为函数,然后按 F5
在这里插入图片描述

代码分析:

// printf函数
  sub_401020("please input flag\n", v8);
  // scanf函数
  sub_401050("%s", (char)Arglist);
  v3 = strlen(Arglist);
  // 奇数位和偶数位互换
  for ( i = 0; i < v3 / 2; ++i )
  {
    v5 = Arglist[2 * i];
    Arglist[2 * i] = Arglist[2 * i + 1];
    Arglist[2 * i + 1] = v5;
  }
  // 将进行互换后的输入与 0x30异或
  for ( j = 0; j < strlen(Arglist); ++j )
    Arglist[j] ^= 0x30u;
  // 进行处理后的输入要等于c~scvdzKCEoDEZ[^roDICUMC
  v7 = strcmp(Arglist, "c~scvdzKCEoDEZ[^roDICUMC");
  if ( v7 )
    v7 = v7 < 0 ? -1 : 1;
  if ( !v7 )
  {
    sub_401020("yes", v9);
    exit(0);
  }
  sub_401020("error", v9);

解题脚本

enc = list('c~scvdzKCEoDEZ[^roDICUMC')
flag = []

# 与 0x30异或
for i in range(len(enc)):
    flag.append(chr(ord(enc[i]) ^ 0x30))

#
for i in range(int(len(flag) / 2)):
    tmp = flag[2 * i]
    flag[2 * i] = flag[2 * i + 1]
    flag[2 * i + 1] = tmp

for i in flag:
    print(i, end='')

TTTTTTTTTea

代码分析

scanf("%s", v5);
  v9 = v5;
  // 将输入的值赋入 v4的后八位
  for ( i = 0; i <= 5; ++i )
    v4[i + 8] = *v9++;
  // 两两进行XTea加密
  for ( j = 0; j <= 2; ++j )
    tea_encrypt(&v4[2 * j + 8], &key);
  // 加密后的字符串要等于这些
  v4[0] = 3240027994;
  v4[1] = 2762803571;
  v4[2] = 0xF61C9018;
  v4[3] = 0x32E37BCD;
  v4[4] = 0x2DCC1F26;
  v4[5] = 0x344380CC;
  for ( k = 0; k <= 5; ++k )
  {
    if ( v4[k] != v4[k + 8] )
    {
      printf("ERROR!");
      exit(9);
    }
  }

解题脚本

#include<stdio.h>

int main()
{
    unsigned int enc[6] = {0xC11EE75A, 0xA4AD0973, 0xF61C9018, 0x32E37BCD, 0x2DCC1F26, 0x344380CC};
    unsigned int key[4] = {0x10203, 0x4050607, 0x8090A0B, 0x0C0D0E0F};
    int i, j;
    long sum = 0, delta = 0x61C88647;
    // 解码
    for(i=0;i < 6;i+=2){
        sum =  0 - (32 * delta);
        for(j = 0; j < 32; j++) {
            enc[i+1] -= (((enc[i] >> 5) ^ (16 * enc[i])) + enc[i]) ^ (key[((sum >> 11) & 3)] + sum);
            sum += delta;
            enc[i] -= ((((enc[i+1] >> 5) ^ (16 * enc[i+1])) + enc[i+1]) ^ (key[sum & 3] + sum));
        }
    }
    // 打印
    for (i = 0; i < 6; i++)
    {
        for (j = 0; j<=3; j++)
        {
            printf("%c", (enc[i] >> (j * 8)) & 0xFF);
        }
    }

    return 0;
}

来解个方程?

不太熟练

from sympy import Symbol
from sympy.solvers import solve

v2 = Symbol("v2")
v3 = Symbol("v3")
v4 = Symbol("v4")
v5 = Symbol("v5")
v6 = Symbol("v6")
v7 = Symbol("v7")
v8 = Symbol("v8")
v9 = Symbol("v9")
v10 = Symbol("v10")
v11 = Symbol("v11")
v12 = Symbol("v12")
v13 = Symbol("v13")
v14 = Symbol("v14")
v15 = Symbol("v15")
v16 = Symbol("v16")
v17 = Symbol("v17")
v18 = Symbol("v18")
v19 = Symbol("v19")
v20 = Symbol("v20")
v21 = Symbol("v21")
v22 = Symbol("v22")
v23 = Symbol("v23")

eq1 = 245 * v6 + 395 * v5 + 3541 * v4 + 2051 * v3 + 3201 * v2 + 1345 * v7 - 855009
eq2 = 3270 * v6 + 3759 * v5 + 3900 * v4 + 3963 * v3 + 1546 * v2 + 3082 * v7 - 1515490
eq3 = 526 * v6 + 2283 * v5 + 3349 * v4 + 2458 * v3 + 2012 * v2 + 268 * v7 - 854822
eq4 = 3208 * v6 + 2021 * v5 + 3146 * v4 + 1571 * v3 + 2569 * v2 + 1395 * v7 - 1094422
eq5 = 3136 * v6 + 3553 * v5 + 2997 * v4 + 1824 * v3 + 1575 * v2 + 1599 * v7 - 1136398
eq6 = 2300 * v6 + 1349 * v5 + 86 * v4 + 3672 * v3 + 2908 * v2 + 1681 * v7 - 939991
eq7 = 212 * v22 + 153 * v21 + 342 * v20 + 490 * v12 + 325 * v11 + 485 * v10 + 56 * v9 + 202 * v8 + 191 * v23 - 245940
eq8 = 348 * v22 + 185 * v21 + 134 * v20 + 153 * v12 + 460 * v9 + 207 * v8 + 22 * v10 + 24 * v11 + 22 * v23 - 146392
eq9 = 177 * v22 + 231 * v21 + 489 * v20 + 339 * v12 + 433 * v11 + 311 * v10 + 164 * v9 + 154 * v8 + 100 * v23 - 239438
eq10 = 68 * v20 + 466 * v12 + 470 * v11 + 22 * v10 + 270 * v9 + 360 * v8 + 337 * v21 + 257 * v22 + 82 * v23 - 233887
eq11 = 246 * v22 + 235 * v21 + 468 * v20 + 91 * v12 + 151 * v11 + 197 * v8 + 92 * v9 + 73 * v10 + 54 * v23 - 152663
eq12 = 241 * v22 + 377 * v21 + 131 * v20 + 243 * v12 + 233 * v11 + 55 * v10 + 376 * v9 + 242 * v8 + 343 * v23 - 228375
eq13 = 356 * v22 + 200 * v21 + 136 * v11 + 301 * v10 + 284 * v9 + 364 * v8 + 458 * v12 + 5 * v20 + 61 * v23 - 211183
eq14 = 154 * v22 + 55 * v21 + 406 * v20 + 107 * v12 + 80 * v10 + 66 * v8 + 71 * v9 + 17 * v11 + 71 * v23 - 96788
eq15 = 335 * v22 + 201 * v21 + 197 * v11 + 280 * v10 + 409 * v9 + 56 * v8 + 494 * v12 + 63 * v20 + 99 * v23 - 204625
eq16 = 428 * v18 + 1266 * v17 + 1326 * v16 + 1967 * v15 + 3001 * v14 + 81 * v13 + 2439 * v19 - 1109296
eq17 = 2585 * v18 + 4027 * v17 + 141 * v16 + 2539 * v15 + 3073 * v14 + 164 * v13 + 1556 * v19 - 1368547
eq18 = 2080 * v18 + 358 * v17 + 1317 * v16 + 1341 * v15 + 3681 * v14 + 2197 * v13 + 1205 * v19 - 1320274
eq19 = 840 * v18 + 1494 * v17 + 2353 * v16 + 235 * v15 + 3843 * v14 + 1496 * v13 + 1302 * v19 - 1206735
eq20 = 101 * v18 + 2025 * v17 + 2842 * v16 + 1559 * v15 + 2143 * v14 + 3008 * v13 + 981 * v19 - 1306983
eq21 = 1290 * v18 + 3822 * v17 + 1733 * v16 + 292 * v15 + 816 * v14 + 1017 * v13 + 3199 * v19 - 1160573
eq22 = 186 * v18 + 2712 * v17 + 2136 * v16 + 98 * v13 + 138 * v14 + 3584 * v15 + 1173 * v19 - 1005746

sol = solve((eq1, eq2, eq3, eq4, eq5, eq6, eq7, eq8, eq9, eq10, eq11, eq12, eq13, eq14, eq15, eq16, eq17, eq18, eq19,
             eq20, eq21, eq22),
            (v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23))

print(chr(sol[v2]), end='')
print(chr(sol[v3]), end='')
print(chr(sol[v4]), end='')
print(chr(sol[v5]), end='')
print(chr(sol[v6]), end='')
print(chr(sol[v7]), end='')
print(chr(sol[v8]), end='')
print(chr(sol[v9]), end='')
print(chr(sol[v10]), end='')
print(chr(sol[v11]), end='')
print(chr(sol[v12]), end='')
print(chr(sol[v13]), end='')
print(chr(sol[v14]), end='')
print(chr(sol[v15]), end='')
print(chr(sol[v16]), end='')
print(chr(sol[v17]), end='')
print(chr(sol[v18]), end='')
print(chr(sol[v19]), end='')
print(chr(sol[v20]), end='')
print(chr(sol[v21]), end='')
print(chr(sol[v22]), end='')
print(chr(sol[v23]), end='')

Easy_Android

public static void main(String[] args) throws NoSuchAlgorithmException {
    	// md5加密
        MessageDigest digest = MessageDigest.getInstance("MD5");
        String userName = "Tenshine";
        digest.reset();
        digest.update(userName.getBytes());
        byte[] bytes = digest.digest();
        String hexstr = toHexString(bytes, "");
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < hexstr.length(); i += 2) {
            sb.append(hexstr.charAt(i));
        }
        String userSN = sb.toString();
        System.out.println("NSSCTF{" + userSN + "}");
    }

    private static String toHexString(byte[] bytes, String separator) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(b & 255);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex).append(separator);
        }
        return hexString.toString();
    }

Try2Bebug_Plus

将前面的sleep函数patch, 开始动调
在这里插入图片描述

Packet

这里是直接使用工具脱壳的, 如果想手动脱壳的可以看 https://zhuanlan.zhihu.com/p/610542968

使用exeinfo 发现是 64位,upx3.91的壳

image-20230425224231694

直接使用 upx -d [文件目录]脱壳,脱完壳后进行代码分析, 可以去 https://upx.github.io/ 下载自己需要的upx

Base64加密,变表了,下面的程序使用的base64表

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G0IElxZb-1682477580296)(null)]

enc是加密后的字符串,

tLntq1rgE1vqwf8XC19Zmf8Zyxn5Fq==

在这里插入图片描述

通过在线解密网站,直接拿到flag

image-20230425225025635

getflag

直接运行,可以看到,需要点击 Click me 100000000次

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4u4uMKB1-1682477580347)(null)]

使用ida打开,直接使用 shift + F12 打开字符串搜索,看到 对应的字符串,直接双击进去看

image-20230426104217288

看到了getFlag方法,直接 修改这个if 或者 将getFlag函数的代码拉出来跑

image-20230426104245877

直接修改对应的跳转, 将 jg 指令 改为了 gle 指令
在这里插入图片描述

运行,点击getFlag,直接拿到flag
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值