easyre

IDA3位打开附件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  __main();
v4 = 42;
v5 = 70;
v6 = 39;
v7 = 34;
v8 = 78;
v9 = 44;
v10 = 34;
v11 = 40;
v12 = 73;
v13 = 63;
v14 = 43;
v15 = 64;
printf("Please input:");
scanf("%s", &v19);
if ( (_BYTE)v19 != 65 || HIBYTE(v19) != 67 || v20 != 84 || v21 != 70 || v22 != 123 || v26 != 125 )
return 0;
v16 = v23;
v17 = v24;
v18 = v25;
for ( i = 0; i <= 11; ++i )
{
if ( *(&v4 + i) != _data_start__[*((char *)&v16 + i) - 1] )
return 0;
}
printf("You are correct!");
return 0;
}

刚开始我以为只是一个数组元素的加减

但是仔细观察if判断

1
if ( *(&v4 + i) != _data_start__[*((char *)&v16 + i) - 1] )

伪代码并没有进行任何加密,只是在判断里进行了比较

找到对应的字符即可

1
2
3
4
5
6
7
v4 = [42,70,39,34,78,44,34,40,73,63,43,64]
s = ''
flag = ''
s = '~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(\'&%$# !"'
for i in v4:
flag += chr(s.find(chr(i))+1)
print(flag)

flag{U9X_1S_W6@T?}

rsa

这题跟rsa有关,见面做过几道密码的rsa

这一题的不同之处是数字处理,以及把key放到文件里面去了

提取公钥

IDA打开pub.key后,转换里面的十六进制为字符串,提取出公钥。

—–BEGIN PUBLIC KEY—– MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMAzLFxkrkcYL2wch21CM2kQVFpY9+7+

/AvKr1rzQczdAgMBAAE=

—–END PUBLIC KEY—–

公钥解析(提取e,n)

http://tool.chacuo.net/cryptrsakeyparse对公钥进行解析

公钥指数及模数信息:

key长度: 256

模数:C0332C5C64AE47182F6C1C876D42336910545A58F7EEFE

FC0 BCAAF5AF341CCDD

指数:

65537 (0x10001)

获取到:

e = 65537

n=869344822960481191906660620034948005889056560172030256

17216654058378322103517(模数转换为十进制)

公钥解析(提取p,q)

http://www.factordb.com/index.php?query=86934482296048119190666062003494800588905656017203025617216654058378322103517

通过n解析p,q

p = 285960468890451637935629440372639283459

q = 304008741604601924494328155975272418463

py脚本(网上抄的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import rsa

e = 65537
n = 86934482296048119190666062003494800588905656017203025617216654058378322103517
p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463

phin = (q-1)*(p-1)
d = gmpy2.invert(e, phin)

key = rsa.PrivateKey(n, e, int(d), p, q)

with open("C:\\Users\\Hyang\\Desktop\\flag.enc", "rb+") as f:
f = f.read()
print(rsa.decrypt(f, key))

rome

IDA32位打开

类似的题型学长讲过,循环遍历爆破即可

c语言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <string.h>
int main()
{
char s[] = "Qsw3sj_lz4_Ujw@l";
int len = strlen(s);
char a[100];
char flag[100];
int i, j = 0;
for ( i = 0;i < len;i++)
{
for ( j = 0;j < 128;j++)
{
a[i] = j;
if (a[i] >= 65 && a[i] <= 90)
{
a[i] = (a[i] - 51) % 26 + 65;
}
if (a[i] >= 97 && a[i] <= 122)
{
a[i] = (a[i] - 79) % 26 + 97;
}
if (a[i] == s[i])
{
flag[i] = j;
printf("%c", flag[i]);
}
}

}
return 0;
}

flag{Cae3ar_th4_Gre@t}

CrackRTF

IDA32位

看流程的话一共是要输入两次密码

atoi函数把字符串转换成长整型数

关键是加密函数sub_40100A

我点进去是一脸懵逼,看了几篇wp才算好点

这个函数是hash加密

后面的0x8004是标识符,所以这个加密是sha1加密

加密过后的密文长这样

6E32D0943418C2C33385BC35A1470250DD8923A9

利用爆破写一个脚本(CV)

1
2
3
4
5
6
7
8
9
10
11
import hashlib

flag = "@DBApp"

for i in range(100000, 999999):
s = str(i) + flag
x = hashlib.sha1(s.encode())
cnt = x.hexdigest()
if "6e32d0943418c2c" in cnt:
print(cnt)
print(str(i) + flag)

跑出来密码是123321

运行exe程序成功了,接下来判断第二部分

第二个密码同样是6位

flag{N0_M0re_Free_Bugs}

login

是一个html文件

另外放了一个hint

Hint:本题解出相应字符串后请用flag{}包裹,形如:flag{123456@flare-on.com}

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!DOCTYPE Html />
<html>
<head>
<title>FLARE On 2017</title>
</head>
<body>
<input type="text" name="flag" id="flag" value="Enter the flag" />
<input type="button" id="prompt" value="Click to check the flag" />
<script type="text/javascript">
document.getElementById("prompt").onclick = function () {
var flag = document.getElementById("flag").value;
var rotFlag = flag.replace(/[a-zA-Z]/g, function(c){return String.fromCharCode((c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26);});
if ("PyvragFvqrYbtvafNerRnfl@syner-ba.pbz" == rotFlag) {
alert("Correct flag!");
} else {
alert("Incorrect flag, rot again");
}
}
</script>
</body>
</html>

分析一下

输入的密码大写就是90,小写就是122,然后与其ascii+13判断

大于为其自己+13,小于为其自己-13

+13这个运算实际上就是把情况分成了 a到m和m到z两种情况

脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
a='PyvragFvqrYbtvafNerRnfl@syner-ba.pbz'
flag=''
for i in a:
if i >='A' and i<='M':
flag += chr(ord(i)+13)
elif i >='a' and i<='m':
flag += chr(ord(i)+13)
elif i>='N' and i<="Z":
flag+=chr(ord(i)-13)
elif i>='n' and i<='z':
flag+=chr(ord(i)-13)
else:
flag+=i
print(flag)

flag{ClientSideLoginsAreEasy@flare-on.com}