BUUCTF笔记

[BUUCTF]RE笔记(更新中)

刮开有奖

屏幕截图 2023-07-15 144055

打开exe,刮不了

image-20230716133952007

exe查壳,无壳,ida打开,shift+F12,查看寻找可疑字符串,发现了,还可以看到应该有base64加密

image-20230716143633710

点击进去,ctrl+x交叉引用

image-20230716143812125

F5反编译进入

image-20230716143936015

发现了有用的东西,string=ZJSECaNH3ng

image-20230716144254053

进入sub_4010F0,可以键盘上的/建添加注释,是个加密返回result

image-20230716145425601

修改成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

image-20230716145915647

返回,继续分析代码v4和v5都要进行了sub_401000处理

image-20230716150132850

进入sub_401000,查看代码,进入 byte_407830

image-20230716150041723

应该是base64加密

image-20230716150225482

与v4 和v5 有关的只有ak1w和V1Ax

image-20230716150602702

将其base64解密得到jMp,WP1

继续分析if语句

image-20230716151019573

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}

image-20230716152041249

简单注册器

image-20230716152311034

下载打开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);
	}
}

image-20230727163956507

代码明显直接对x进行处理后倒序,用flag{}包裹就是flag

image-20230727164200236

倒序后

image-20230727164218539

[GWCTF 2019]pyre

image-20230727164302770

下载为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

屏幕截图 2023-07-27 180343

[ACTF新生赛2020]easyre

image-20230728140025220

exe查壳,upx壳,32位

image-20230728140640510

upx脱壳

image-20230728141558048

ida反汇编 v4是一个数组,_data_start__字符串里面寻找一个字符然后 -1 与v4进行对比是否相等,逆过来就是+1

image-20230728143617003

点击_data_start__

image-20230728143556785

编写脚本

# -*- 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

image-20230728153026597

findit

image-20230728153210277

下载附件apk,jdax反汇编,找到main

image-20230728154440732

image-20230728154511219

修改一下代码运行得到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}

image-20230728154600785

[ACTF新生赛2020]rome

image-20230728164351107

下载附件,exe文件,查壳,无壳,32位

image-20230728164533845

ida反汇编,找到主函数

image-20230728173023987

对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

image-20230728173457755

rsa

image-20230729142325814

什么是rsaRSA基本原理文章

下载附件得到两个文件

image-20230729151555724

分解公钥网站

image-20230729151719159

E=65537 (0x10001)
N=0xC0332C5C64AE47182F6C1C876D42336910545A58F7EEFEFC0BCAAF5AF341CCDD

N=p*q

在线网站分解N得到p和q

image-20230729152011595

p= 285960468890451637935629440372639283459
q=304008741604601924494328155975272418463

知道了p和q后我们根据
L = l c m ( p - 1 , q - 1 ) L=lcm(p-1,q-1) Llcmp1q1
(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<LEDmodL1
算出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))

image-20230729152544082

[FlareOn4]login

下载附件

image-20230729161728349

提示

image-20230729161658686

进入网站

image-20230729161755544

查看源代码

image-20230729161814740

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)

举个例子

image-20230729162832267

'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内容

image-20230729163357566

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值