2023ISCTF Re部分WP

Reverse

crackme

直接从cmd窗口运行附件即可得flag

image-20231123221344720

mfx_re

用010Editor打开附件,将附件的MFX字段全部替换为UPX

image-20231123221742344

然后使用upx -d命令进行脱壳

image-20231123221852662

之后使用ida64打开,对代码进行分析,可知程序对输入字符串的每一位的ASCII码值都减了1,逆向解密只需加1即可

image-20231123222315668

写出exp:

enc = 'HRBSEz1a``8747,a/4e,33e1,88bd,/00b/5841a4a|'
flag = ''
for i in enc:
    flag += chr(ord(i) + 1)
print(flag)

得到flag为:ISCTF{2baa9858-b05f-44f2-99ce-011c06952b5b}

EasyRe

ida64打开附件,找到主要加密函数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分析函数,先对字符串异或17,然后如果字符发ASCII码值等于66或88,用155减去该字符,最后对字符串进行逆序。

写出解密脚本解密,exp如下:

enc = ']P_ISRF^PCY[I_YWERYC'
ttmp = ''
flag = ''
ttmp = reversed(enc)
for i in ttmp:
    if ord(i) == (155 - 66) or ord(i) == (155 - 88):
        flag += chr((155 - ord(i)) ^ 17)
    else:
        flag += chr(ord(i) ^ 17)
print(flag)

解出结果为:ISCTFSNXJSIAOWCBXNAL

flag为:ISCTF{SNXJSIAOWCBXNAL}

easy_flower_tea

ida打开,找到主要加密函数,简单花指令,直接修复,反编译分析代码

image-20231126120616848

简单的tea加密,脚本直接解出,exp:

#include <stdio.h>
#include <stdlib.h>

void decrypt (unsigned int* v, unsigned int* k);

int main()
{
    unsigned int flag[3] = {0x42777AFA,0x781A30CA};
    unsigned int key[4] = {12,34,56,78};
    decrypt(flag,key);
    for(int i = 0;i < 2;i++)
    {
        printf("%d,",flag[i]);
    }
    return 0;
}

void decrypt(unsigned int* v, unsigned int* k)
{
    int j,n;
    for(j = 0;j < 1;j += 2)
    {
        n = j + 1;
        unsigned int delta = 1640531527;
        unsigned int sum = 0 - delta*32;
        for (int i = 0; i < 32; i++)
        {
            v[n] -= (16 * v[j] + k[2]) ^ (v[j] + sum) ^ ((v[j] >> 5) + k[3]);
            v[j] -= (16 * v[n] + k[0]) ^ (v[n] + sum) ^ ((v[n] >> 5) + k[1]);
            sum += delta;
        }
    }
}

得到的10进制数字加上ISCTF头即可:ISTCTF{1472353 3847872}

babyRe

运行程序发现babyRE.py报错

image-20231127182004580

使用PyInstaller Extractor 对.exe进行解包

python pyinstxtractor.py .\babyRe.exe

找到babyRe文件,发现其无后缀名,使用010Editor打开,分析其应为.pyc文件,对其文件头进行补全,并加上后缀名

image-20231127182246750

对.pyc文件进行反编译,得到.py文件

image-20231127182330537

简单RSA,脚本直接解出flag,exp:

a=292884018782106151080211087047278002613718113661882871562870811030932129300110050822187903340426820507419488984883216665816506575312384940488196435920320779296487709207011656728480651848786849994095965852212548311864730225380390740637527033103610408592664948012814290769567441038868614508362013860087396409860
b=21292789073160227295768319780997976991300923684414991432030077313041762314144710093780468352616448047534339208324518089727210764843655182515955359309813600286949887218916518346391288151954579692912105787780604137276300957046899460796651855983154616583709095921532639371311099659697834887064510351319531902433355833604752638757132129136704458119767279776712516825379722837005380965686817229771252693736534397063201880826010273930761767650438638395019411119979149337260776965247144705915951674697425506236801595477159432369862377378306461809669885764689526096087635635247658396780671976617716801660025870405374520076160
c=5203005542361323780340103662023144468501161788183930759975924790394097999367062944602228590598053194005601497154183700604614648980958953643596732510635460233363517206803267054976506058495592964781868943617992245808463957957161100800155936109928340808755112091651619258385206684038063600864669934451439637410568700470057362554045334836098013308228518175901113235436257998397401389511926288739759268080251377782356779624616546966237213737535252748926042086203600860251557074440685879354169866206490962331203234019516485700964227924668452181975961352914304357731769081382406940750260817547299552705287482926593175925396
import libnum
import gmpy2
phi=b-a*2
e=65537
n=b-a-1
print(phi)
print(n)
d=gmpy2.invert(e,phi)
m=pow(c,d,n)
print(libnum.n2s(int(m)))

解得flag为:ISCTF{kisl-iopa-qdnc-tbfs-ualv}

FloweyRSA

ida64打开,简单花指令,直接去花,反编译main函数

image-20231128193024907

简单rsa,网站在线分解素数

image-20231128193134789

直接脚本一把梭,exp:

p =  56099
q =  56369
ppp = [1966878405,2375075638,2166893744,2129446000,2488145363,746243878,1904115824,818668601,2983811740,1840670651,306202172,2009857636,299417177]
import libnum
import gmpy2
flag = ''
for c in ppp:
    phi = (p - 1) * (q - 1)
    e = 465
    n = p * q
    d=gmpy2.invert(e,phi)
    m=pow(c,d,n)
    printtt = libnum.n2s(int(m)).decode()
    flag += printtt
print(flag)

解得flag:flag{reverse_is_N0T_@lways_jusT_RE_myy_H@bIb1!!!}

z3_revenge

ida打开,查看主要函数,发现约束条件

printf("Printf input the flag:");
  scanf("%s", &v4);
  if ( !BYTE3(v9)
    && (char)v4 + 394 - 740 * SBYTE1(v4) == -60953
    && SBYTE1(v4) + 878 - (SBYTE2(v4) + 614) == 280
    && 195 * SBYTE2(v4) + 457 - SBYTE3(v4) == 13438
    && SBYTE3(v4) - 330 - (186 - SBYTE4(v4)) == -362
    && 840 * SBYTE4(v4) - 977 * SBYTE5(v4) == -61371
    && 729 * SBYTE5(v4) - (197 - SBYTE6(v4)) == 89567
    && SBYTE6(v4) - 899 + 946 - SHIBYTE(v4) == 44
    && SHIBYTE(v4) - 593 - 373 * (char)v5 == -18770
    && 842 * (char)v5 + 261 * SBYTE1(v5) == 55613
    && 787 * SBYTE1(v5) - (SBYTE2(v5) + 204) == 43029
    && 664 * SBYTE2(v5) + 160 - SBYTE3(v5) == 34635
    && SBYTE3(v5) - 885 + 366 * SBYTE4(v5) == 35768
    && 659 * SBYTE4(v5) + 892 - SBYTE5(v5) == 66691
    && 500 * SBYTE5(v5) - (SBYTE6(v5) + 535) == 49920
    && SBYTE6(v5) - 983 + 194 - SHIBYTE(v5) == -844
    && SHIBYTE(v5) - 871 + 545 - (char)v6 == -326
    && 762 * (char)v6 - 443 * SBYTE1(v6) == 51835
    && 846 * SBYTE1(v6) - (SBYTE2(v6) + 964) == 45464
    && SBYTE2(v6) - 363 + 218 * SBYTE3(v6) == 9549
    && SBYTE3(v6) - 477 - 170 * SBYTE4(v6) == -9272
    && SBYTE4(v6) - 177 - (351 - SBYTE5(v6)) == -379
    && SBYTE6(v6) + 541 + 492 * SBYTE5(v6) == 48314
    && SBYTE6(v6) - 952 - (454 - SHIBYTE(v6)) == -1306
    && SHIBYTE(v6) - 731 - ((char)v7 + 890) == -1615
    && (char)v7 - 941 - (SBYTE1(v7) + 380) == -1332
    && SBYTE1(v7) - 328 + SBYTE2(v7) + 124 == -98
    && SBYTE2(v7) + 695 + SBYTE3(v7) + 186 == 980
    && SBYTE3(v7) - 412 + 632 * SBYTE4(v7) == 62205
    && SBYTE4(v7) + 820 + SBYTE5(v7) + 257 == 1221
    && SBYTE5(v7) - 155 + SBYTE6(v7) + 673 == 613
    && 786 * SBYTE6(v7) - (773 - SHIBYTE(v7)) == 38625
    && SHIBYTE(v7) + 929 - (956 - (char)v8) == 171
    && (char)v8 + 913 + 311 - SBYTE1(v8) == 1270
    && SBYTE1(v8) + 113 - 705 * SBYTE2(v8) == -40018
    && SBYTE3(v8) + 782 + 901 * SBYTE2(v8) == 52237
    && SBYTE3(v8) - 716 + 255 - SBYTE4(v8) == -411
    && SBYTE4(v8) + 307 + SBYTE5(v8) + 874 == 1329
    && SBYTE5(v8) + 355 - (201 - SBYTE6(v8)) == 308
    && SBYTE6(v8) + 934 + 531 - SHIBYTE(v8) == 1465
    && SHIBYTE(v8) - 801 - ((char)v9 + 413) == -1209
    && (char)v9 - 690 + 558 - SBYTE1(v9) == -135
    && SBYTE1(v9) - 559 + SBYTE2(v9) + 953 == 571
    && SBYTE2(v9) + 141 - 654 * (char)v4 == -47476 )
  {
    puts("true");
  }
  else
  {
    puts("false");
  }

使用z3库进行方程组求解,exp:

from z3 import *
s = Solver()
c = [Int('v%d'%i)for i in range(43)]
s.add(c[0] + 394 - 740 * c[1] == -60953)
s.add(c[1] + 878 - (c[2] + 614) == 280)
s.add(195 * c[2] + 457 - c[3] == 13438)
s.add(c[3] - 330 - (186 - c[4]) == -362)
s.add(840 * c[4] - 977 * c[5] == -61371)
s.add(729 * c[5] - (197 - c[6]) == 89567)
s.add(c[6] - 899 + 946 - c[7] == 44)
s.add(c[7] - 593 - 373 * c[8] == -18770)
s.add(842 * c[8] + 261 * c[9] == 55613)
s.add(787 * c[9] - (c[10] + 204) == 43029)
s.add(664 * c[10] + 160 - c[11] == 34635)
s.add(c[11] - 885 + 366 * c[12] == 35768)
s.add(659 * c[12] + 892 - c[13] == 66691)
s.add(500 * c[13] - (c[14] + 535) == 49920)
s.add(c[14] - 983 + 194 - c[15] == -844)
s.add(c[15] - 871 + 545 - c[16] == -326)
s.add(762 * c[16] - 443 * c[17] == 51835)
s.add(846 * c[17] - (c[18] + 964) == 45464)
s.add(c[18] - 363 + 218 * c[19] == 9549)
s.add(c[19] - 477 - 170 * c[20] == -9272)
s.add(c[20] - 177 - (351 - c[21]) == -379)
s.add(c[22] + 541 + 492 * c[21] == 48314)
s.add(c[22] - 952 - (454 - c[23]) == -1306)
s.add(c[23] - 731 - (c[24] + 890) == -1615)
s.add(c[24] - 941 - (c[25] + 380) == -1332)
s.add(c[25] - 328 + c[26] + 124 == -98)
s.add(c[26] + 695 + c[27] + 186 == 980)
s.add(c[27] - 412 + 632 * c[28] == 62205)
s.add(c[28] + 820 + c[29] + 257 == 1221)
s.add(c[29] - 155 + c[30] + 673 == 613)
s.add(786 * c[30] - (773 - c[31]) == 38625)
s.add(c[31] + 929 - (956 - c[32]) == 171)
s.add(c[32] + 913 + 311 - c[33] == 1270)
s.add(c[33] + 113 - 705 * c[34] == -40018)
s.add(c[35] + 782 + 901 * c[34] == 52237)
s.add(c[35] - 716 + 255 - c[36] == -411)
s.add(c[36] + 307 + c[37] + 874 == 1329)
s.add(c[37] + 355 - (201 - c[38]) == 308)
s.add(c[38] + 934 + 531 - c[39] == 1465)
s.add(c[39] - 801 - (c[40] + 413) == -1209)
s.add(c[40] - 690 + 558 - c[41] == -135)
s.add(c[41] - 559 + c[42] + 953 == 571)
s.add(c[42] + 141 - 654 * c[0] == -47476)
s.check()
result = s.model()
flag = ''
for i in range(43):
    flag += chr(result[c[i]].as_long())
print(flag)

解出flag为:ISCTF{ad1745de-dd7f-4a13-821c-2bd69b0d6614}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值