[BUUCTF]RE笔记(更新中)
刮开有奖
打开exe,刮不了
exe查壳,无壳,ida打开,shift+F12,查看寻找可疑字符串,发现了,还可以看到应该有base64加密
点击进去,ctrl+x交叉引用
F5反编译进入
发现了有用的东西,string=ZJSECaNH3ng
进入sub_4010F0,可以键盘上的/建添加注释,是个加密返回result
修改成c语言代码得到result
#include <stdio.h>
int sub_4010F0(char* a1, int a2, int a3)
{
int result; // eax
int i; // esi
int v5; // ecx
int v6; // edx
result = a3;
for ( i = a2; i <= a3; a2 = i )
{
v5 = i;
v6 = i[a1];
if ( a2 < result && i < result )
{
do
{
if ( v6 > a1[result])
{
if ( i >= result )
break;
++i;
a1[v5] = a1[result];
if ( i >= result )
break;
while ( a1[i] <= v6 )
{
if ( ++i >= result )
goto LABEL_13;
}
if ( i >= result )
break;
v5 = i;
a1[result] = a1[i];
}
--result;
}
while ( i < result );
}
LABEL_13:
a1[result] = v6 ;
sub_4010F0(a1, a2, i - 1);
result = a3;
++i;
}
return result;
}
int main()
{
char str[] = "ZJSECaNH3ng";
sub_4010F0(str,0,10);
printf("%s", str);
return 0;
}
reslut=3CEHJNSZagn
返回,继续分析代码v4和v5都要进行了sub_401000处理
进入sub_401000,查看代码,进入 byte_407830
应该是base64加密
与v4 和v5 有关的只有ak1w和V1Ax
将其base64解密得到jMp,WP1
继续分析if语句
string[0]=‘3’+34=51+34=85=‘U’,string[1]=J,string[2]=‘E’+3+141/4=3*69 + 141 / 4=87=‘W’
string[3]=8 * (‘Z’/9)= 2 * (90/9)* 4 = 80=‘P’,以及jMp,WP1
将其拼接一起用flag{}包裹不对,结合上面的string的长度为8,及拼接应该是UJWP1jMp,包裹起来
最终得到flag{UJWP1jMp}
简单注册器
下载打开jadx反汇编
charAt()方法返回指定索引字符
xx为32位字符串,最后一位为a,第二位为b,第一位与第三位的ascii码之和为104
例如,下面代码返回结果为 6
public class test5 {
public static void main(String[] args) {
String s = "0123456789";
char result = s.charAt(6);
System.out.println(result);
}
}
代码明显直接对x进行处理后倒序,用flag{}包裹就是flag
倒序后
[GWCTF 2019]pyre
下载为pyc文件,在线反汇编
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']
编写脚本
code = [
'\x1f',
'\x12',
'\x1d',
'(',
'0',
'4',
'\x01',
'\x06',
'\x14',
'4',
',',
'\x1b',
'U',
'?',
'o',
'6',
'*',
':',
'\x01',
'D',
';',
'%',
'\x13']
flag = ''
for i in range(21,-1,-1):
code[i] = chr(ord(code[i]) ^ ord(code[i+1]))
for i in range(23):
code[i] = chr((ord(code[i])-i)%128)
flag = flag +code[i]
print(flag)
得到flag
[ACTF新生赛2020]easyre
exe查壳,upx壳,32位
upx脱壳
ida反汇编 v4是一个数组,_data_start__字符串里面寻找一个字符然后 -1 与v4进行对比是否相等,逆过来就是+1
点击_data_start__
编写脚本
# -*- coding:utf-8 -*-
v4 = [42,70,39,34,78,44,34,40,73,63,43,64]
model = r"~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(" + chr(0x27) + r'&%$# !"'
pos = []
for i in v4:
pos.append(model.find(chr(i))+1)
s = [chr(x) for x in pos]
flag = ''.join(s)
print ('flag{'+flag+'}')
append() 方法用于在列表末尾添加新的对象。
Python find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回-1
实例
info = ‘abca’
print info.find(‘a’) # 从下标0开始,查找在字符串里第一个出现的子串,返回结果:0
0
print info.find(‘a’,1) # 从下标1开始,查找在字符串里第一个出现的子串:返回结果3
3
print info.find(‘3’) # 查找不到返回-1
-1
得到flag
findit
下载附件apk,jdax反汇编,找到main
修改一下代码运行得到flag
public class test5 {
public static void main(String[] args) {
final char[] a = {'T', 'h', 'i', 's', 'I', 's', 'T', 'h', 'e', 'F', 'l', 'a', 'g', 'H', 'o', 'm', 'e'};
final char[] b = {'p', 'v', 'k', 'q', '{', 'm', '1', '6', '4', '6', '7', '5', '2', '6', '2', '0', '3', '3', 'l', '4', 'm', '4', '9', 'l', 'n', 'p', '7', 'p', '9', 'm', 'n', 'k', '2', '8', 'k', '7', '5', '}'};
char[] x = new char[17];
char[] y = new char[38];
for (int i = 0; i < 17; i++) {
if ((a[i] < 'I' && a[i] >= 'A') || (a[i] < 'i' && a[i] >= 'a')) {
x[i] = (char) (a[i] + 18);
} else if ((a[i] >= 'A' && a[i] <= 'Z') || (a[i] >= 'a' && a[i] <= 'z')) {
x[i] = (char) (a[i] - '\b');
} else {
x[i] = a[i];
}
}
String m = String.valueOf(x);
for (int i2 = 0; i2 < 38; i2++) {
if ((b[i2] >= 'A' && b[i2] <= 'Z') || (b[i2] >= 'a' && b[i2] <= 'z')) {
y[i2] = (char) (b[i2] + 16);
if ((y[i2] > 'Z' && y[i2] < 'a') || y[i2] >= 'z') {
y[i2] = (char) (y[i2] - 26);
}
} else {
y[i2] = b[i2];
}
}
String n = String.valueOf(y);
System.out.println(n);
}
}
flag{c164675262033b4c49bdf7f9cda28a75}
[ACTF新生赛2020]rome
下载附件,exe文件,查壳,无壳,32位
ida反汇编,找到主函数
对v2进行处理,然后与v12的字符串对比是否相等,编写暴力破解脚本
v15= [ 'Q','s','w','3','s','j', '_','l','z','4','_','U','j','w','@','l' ]
flag=""
for i in range(16):
for j in range(128):#ascii表上有127个字符,一个一个试吧
x=j
if chr(x).isupper():
x=(x-51)%26+65
if chr(x).islower():
x=(x-79)%26+97
if chr(x)==v15[i]:
flag+=chr(j)
print ('flag{'+flag+'}')
运行得到flag
rsa
什么是rsaRSA基本原理文章
下载附件得到两个文件
E=65537 (0x10001)
N=0xC0332C5C64AE47182F6C1C876D42336910545A58F7EEFEFC0BCAAF5AF341CCDD
N=p*q
p= 285960468890451637935629440372639283459
q=304008741604601924494328155975272418463
知道了p和q后我们根据
L
=
l
c
m
(
p
-
1
,
q
-
1
)
L=lcm(p-1,q-1)
L=lcm(p-1,q-1)
(L为p-1、q-1的最小公倍数)就可以算出L,有了L和E可以根据
1
<
D
<
L
,
E
*
D
m
o
d
L
=
1
1 < D < L,E*D mod L = 1
1<D<L,E*DmodL=1
算出D,有了D和N我们就可以根据
明文=密
文
D
m
o
d
N
明文=密文^D mod N
明文=密文DmodN
来解密出明文了
解密脚本
import gmpy2
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\\wond\\Downloads\\41c4e672-98c5-43e5-adf4-49d75db307e4\\output\\flag.enc", "rb+") as f:
f = f.read()
print(rsa.decrypt(f, key))
[FlareOn4]login
下载附件
提示
进入网站
查看源代码
ROT13加密
Rot13是一种简易的替换式加密算法,也称为回转13位,最早是用于英文网站上用于隐藏八卦、妙句或者脏话的工具。
算法原理
原理上来说是对26个小写字母以及26个大写字母进行操作,对原有字母的ASCII值 + 13或者ASCII-13,然后找到计算后的ASCII值对应的字母。通过这样的规则将一个字母替换为另一个字母,从而达到加密的目的。规则如下:
a-m 对应替换为 n-z
n-z 对应替换为 a- m
A-M 对应替换为 N-Z
N-Z 对应替换为A-M
其他字符:例如数字、空白字符以及其他字符均保持不变,并且替换后大小写不会改变(小写a替换后是小写n,而不是大写N)
举个例子
'A’=65 ROT13 = 65+13=78=‘N’
这段代码 return String.fromCharCode((c <= “Z” ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26); 是用于在 JavaScript 中实现 ROT13 加密字符的解密操作。
该代码片段使用了条件(三元)运算符来进行逻辑判断和转换。下面是对该代码进行详细解释:
1.c.charCodeAt(0) + 13:将字符 c 的 Unicode 码点值加上 13,实现 ROT13 解密中向后偏移 13 个位置。
2.(c <= “Z” ? 90 : 122):条件判断,如果字符 c 在大写字母范围内(ASCII 值小于等于 “Z”),则返回 ASCII 码点值 90,否则返回 122;这是为了确定解密后是否需要循环到字母表的起始位置。
3.(c <= “Z” ? 90 : 122) >= (c = c.charCodeAt(0) + 13):比较 (c <= “Z” ? 90 : 122) 和 (c.charCodeAt(0) + 13) 的大小,得到一个布尔值。
4.String.fromCharCode():将得到的 Unicode 码点值转换为字符。
ROT13加密/解密 - ROT13编码/解码—LZL在线工具 (lzltool.cn),在线网站解码得到flag内容