Buuctf-Re

buu

reverse1

先运行

image-20210722152409028

查,64位,拖IDA,但是没有main函数,但是我们可以找到flag相关的函数

image-20210722152016942

跟进image-20210722152036790

这块可以反汇编

image-20210722152109275

看if语句可以知道,Str2里面的值传给Str1,相等就是flag

点开Str2image-20210722152156137

交了发现错了。应该要改点什么,回到上面找加密

image-20210722152237583

按R转换字符,111是o,48是0,所以把所有的o变成0,交上了

reverse2

查,64位,拖IDA

image-20210722153004435

如出一辙,跟进flag

image-20210722153044258

交了发现又错,再回去看上面什么加密

image-20210722153136415

如出一辙。用1替换掉i和r一交就行

内涵的软件

先运行

image-20210722153618334

调皮~

IDA梭

image-20210722153656528

它就是flag

新年快乐

运行

image-20210722154046953

查,有upx壳,先脱壳

image-20210722154111800

拖IDA

image-20210722154130820

就是它

xor

常规操作

image-20210722160122018

知道了flag长度33,且进行了一次xor,然后与global比较,跟进

image-20210722160227640

发现字符串,可以shift+e提取出来 image-20210722160255687

查资料得知xor后再xor一遍就可以还原,直接写解密脚本

1
2
3
4
5
6
7
8
a=[102,  10, 107,  12, 119,  38,  79,  46,  64,  17,
120, 13, 90, 59, 85, 17, 112, 25, 70, 31,
118, 34, 77, 35, 68, 14, 103, 6, 104, 15,
71, 50, 79, 0]
flag=""
for i in range(len(a)-1):#不要0
flag+=chr(a[i]^a[i-1])
print(flag)

image-20210722160520686

helloworld

apk,常规操作看Java源码

image-20210722161031015

秒了

不一样的flag

运行

image-20210722162242675

上下左右,猜想是迷宫题

直接拖IDA找迷宫

image-20210722162316544

变成5*5的一个迷宫

image-20210722162323142

过迷宫,22244114422包上flag就是了

SimpleRev

常规操作,64位IDA

image-20210722181531232

必然在Decry里,跟进,看见变量按R逆取,然后key1,3里面可以点进去,直接拼出来完整的,往下分析代码写解密脚本就行

image-20210722181559045

image-20210722182348163

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
#include<iostream>
#include<stdio.h>
#include<iomanip>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include <bits/stdc++.h>
using namespace std;
int main(){
char a[]="adsfkndcls";
char b[]="killshadow";
int c=10;
int i;
for ( i = 0; i < 10; i++ )
{
for(int j=0;j<128;j++){ //用ASCII码作为范围,输出j变成字符串
if(j<'A'||j>'z'||j>'Z'&&j<'a')
continue;
if((j-39-a[c % 10]+97)% 26 + 97==b[i])
{
printf("%c",j);
c++;
break;
}
}

}

}

image-20210722182528608

Java逆向解密

拿到class文件,丢idea看

image-20210722183654699

关键只有中间那串for循环里的运算,KEY是加密后字符串,直接写出解密脚本

1
2
3
4
5
a=[180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65 ]
flag=""
for i in range(len(a)):
flag+=chr(a[i]-64^32)
print(flag)

image-20210722184940523

[GXYCTF2019]luck_guy

IDA分析main

很简单,v4满足条件后跟进patch_me

image-20211027204823505

所以是为偶数的话进入get_flag

image-20211027204512501

看switch,case1的时候跟进f1发现

image-20211027204558788

case4发现f2为0x7F666F6067756369LL,由于是小端序存储,写脚本时需要调整为逆序

case5注意循环内是8,f2就可以拆成[0x7F,0x66,0x6F,0x60,0x67,0x75,0x63,0x69]刚好是8

1
2
3
4
5
6
7
8
9
10
11
flag="GXY{do_not_"
f2=[0x7F,0x66,0x6F,0x60,0x67,0x75,0x63,0x69][::-1]
for i in range(8):
if i%2==1 :
s=chr(f2[i]-2)
else:
s=chr(f2[i]-1)

flag+=s

print (flag)

[BJDCTF2020]JustRE

IDA跟进DialogFunc

image-20211028141351409

知识补充:C 库函数 – sprintf() | 菜鸟教程 (runoob.com)

把19999和0分别填入输出位置即可

简单注册器

jadx直接找MainActivity

image-20211028142602094

直接把这段代码拿出来单跑就行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.jingfei.Encryptoin;

class main {
public static void main(String[] args) {


char[] x = "dd2940c04462b4dd7c450528835cca15".toCharArray();
x[2] = (char) ((x[2] + x[3]) - 50);
x[4] = (char) ((x[2] + x[5]) - 48);
x[30] = (char) ((x[31] + x[9]) - 48);
x[14] = (char) ((x[27] + x[28]) - 97);
for (int i = 0; i < 16; i++) {
char a = x[31 - i];
x[31 - i] = x[i];
x[i] = a;
}
System.out.println("flag{" + String.valueOf(x) + "}");
}
}

pyre

pyc反编译py

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
33
34
35
print 'Welcome to Re World!'
print 'Your input1 is your flag~'
l = len(input1)
for i in range(l):
num = ((input1[i] + i) % 128 + 128) % 128
code += num

for i in range(l - 1):
code[i] = code[i] ^ code[i + 1]

print code
code = [
'\x1f',
'\x12',
'\x1d',
'(',
'0',
'4',
'\x01',
'\x06',
'\x14',
'4',
',',
'\x1b',
'U',
'?',
'o',
'6',
'*',
':',
'\x01',
'D',
';',
'%',
'\x13']

解密脚本

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
33
34
35
#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
print ('Welcome to Re World!')
print ('Your input1 is your flag~')


code = [
'\x1f',
'\x12',
'\x1d',
'(',
'0',
'4',
'\x01',
'\x06',
'\x14',
'4',
',',
'\x1b',
'U',
'?',
'o',
'6',
'*',
':',
'\x01',
'D',
';',
'%',
'\x13']

for i in range(len(code)-2,-1,-1):
code[i] = chr(ord(code[i])^ord(code[i+1]))
for i in range(len(code)):
print(chr((ord(code[i])-i)%128),end="")

rsa

wp参考:(13条消息) buu RSA_ao52426055的博客-CSDN博客

大素数分解网站:http://www.factordb.com

发现pubkey:

1
2
3
4
-----BEGIN PUBLIC KEY-----
MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMAzLFxkrkcYL2wch21CM2kQVFpY9+7+
/AvKr1rzQczdAgMBAAE=
-----END PUBLIC KEY-----

公钥解析

image-20211028202454980

分解n分别得到p,q,用rsatools解出密钥d

image-20211028200230739

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

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

key = rsa.PrivateKey(n,e,d,q,p) #在pkcs标准中,pkcs#1规定,私钥包含(n,e,d,p,q)

with open("E:\\ctf\\re\\buu\\41c4e672-98c5-43e5-adf4-49d75db307e4\\output\\flagenc.txt","rb") as f: #以二进制读模式,读取密文
f = f.read()
print(rsa.decrypt(f,key))

ACTF easyre

先upx脱壳

1
2
3
4
5
6
v4="*F'\"N,\"(I?+@"
key= '~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(\'&%$# !"'
flag=''
for i in v4:
flag+=chr(key.find(i)+1)
print(flag)