BUUCTF Re

easyre

下载 拖入IDA

然后f5反汇编

flag{this_Is_a_EaSyRe}

reverse 1

f5反汇编

进入main函数

进入Str2发现  {hello_world}

用R换一下111和48

即用0替换o

得到flag{hell0_w0rld}

reserve 2

跟进一下flag

把7BH换成ASCII码

{hacking_for_fun}

然后上面那个if即i,r用1替换

即flag{hack1ng_fo1_fun}

内涵的软件

32位进入main函数

就离谱

flag{49d3c93df25caad81232130f3d2ebfad}

把前缀改了就可

新年快乐

32位的

好像要脱壳,软件还没下好,以后再说吧

晚上了,搞好了

有一个比较嘛然后就是那个所以

flag{HappyNewYear!}

xor

写脚本先放放

晚上了,再看看

64位的

进入getline

跟踪global

然后一堆数据

shift e是导出数据

直接复制即可

这是异或完了的结果然后写个代码逆回去

有一点点不太对,注意和后一位异或

flag{QianQiuWanDai_YiTongJiangHu}

千秋万代,一统江湖;

helloworld

alt +t 搜索字符串

apk后缀应该用jeb或jdax-gui打开

所在位置

问题jeb打不开了

用jdaxgui打开.apk文件找到mainactivity

flag{7631a988259a00816deda84afb29430a}

reverse3

找到main函数反汇编

STR2

stmcpy函数(复制)和strncmp(比较)

shift 和f12查看

base64加密

base64然后在线解码?好像不太行

2024.1.28日记

写了个脚本然后再base64解码

忽略汉字

flag{i_l0ve_you}

2023.11.19刚刚看了下是说有@所以不能用在线网站解密emmm

不一样的flag

迷宫问题

goto去到哪里

exit粘贴的

exit()通常是用在子程序中用来终结程序用的,使用后程序自动结束,跳回操作系统。

exit(0) 表示程序正常退出,exit⑴/exit(-1)表示程序异常退出。

exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束。

            函数用法

             函数名: exit()

所在头文件:stdlib.h(如果是"VC6.0"的话头文件为:windows.h)

功 能: 关闭所有文件,终止正在执行的进程。

exit(0)表示正常退出,

exit(x)(x不为0)都表示异常退出,这个x是返回给操作系统(包括UNIX,Linux,和MS DOS)的,以供其他程序使用

大概可以写出flag了根据个数得出5*5的迷宫

flag{222441144222}

v7那里不太懂里面具体什么意思复制了一个别人的

每次操作后都要检查x和y坐标是不是在0~4之间

simpleRv

进入函数dercy

暴力求解方法

#include<stdio.h>
int main()
{
	char key[]="adsfkndcls";
	char text[]="killshadow";
	char input; 
	int i=0,v3=10;
	for(input=64;input<=128;input++)
 	{ 	
	 	if( text[i] == (input-39-key[v3%10]+97) % 26 + 97	)
          {
          	++v3;
		    i++;
		    printf("%c",input);	
			input=64;			//注意重新开始
		  }
   	}
	return 0;
}

flag{KLDQCUDFZO}

JAVA逆向解密

写个脚本

#include<stdio.h>
int main()
{
	char key[]={180, 136, 137, 147, 191, 137, 147, 191,148, 136, 133, 191, 134, 140, 129, 135, 191, 65};
	int i;
	for(i=0;i<18;i++){
		key[i]=(key[i]^32)-'@';
	}
	puts(key);
	return 0;
 } 

得到

flag{This_is_the_flag_!}

luck_guy

进入get-flag函数

从case4-case5-case1

\n ——————换行 
\r ——————回车 
\t ——————制表符 
\f —————— formfeed 
\b —————— 退格 
\a —————— 响铃 
\e —————— escape(ASCII中的escape字符) 
\007 —————— 任何八进制值(这里是,007=bell(响铃)) 
\x7f —————— 任何十六进制值(这里是,007=bell) 
\cC —————— 一个控制符(这里是,Ctrl+C) 
\ ——————反斜线 
\” ——————双引号 
\l —————— 下一个字符小写 
\L ——————接着的字符均小写到\E 
\u —————— 下一个字符大写 
\U —————— 接着的字符均大写到\E 
\Q ——————在non-word字符前加上\(自动加转义符号),直到\E 
\E —————— 结束\L,\U和\Q

写个脚本

#include<stdio.h>
int main()
{
	int i,j;
	char f2[]="icug`of\x7f";
	for(j=0;j<=8;j++){
		if(j%2 == 1)
			f2[j]=f2[j]-2;
		else
			f2[j]--;
		
	}
	puts(f2);
	return 0;
 } 

flag{do_not_hate_me}

justre

反汇编没啥用然后shift+f5

发现了一个奇奇怪怪的东西,学习一下

进到反汇编的地方,再次反汇编

把1999和0放进去跟printf函数差不多的意思,好结束

刚刚复制把d复制进去了,啊

flag{1999902069a45792d233ac}

刮开有奖

从main函数中进入中间那个函数然后

发现V7那里有一个加密可能改变了v13的值

sub——40100那里base64加密(不换表)

sub——4010F那里传入了10,可推测v8,v9的数据也传进了函数里面加密了

写个脚本得到加密后的数据

#include<stdio.h>
int sub_4010F0(int* 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=a1[i];		//v6 = *(4 * i + a1);
    if ( a2 < result && i < result )
    {
      do
      {
        if(v6>a1[result])//if ( v6 > *(a1 + 4 * 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(){
	int v7[11]={90,74,83,69,67,97,78,72,51,110,103};
	int i;
	sub_4010F0(v7,0,10);
	for(i=0;i<11;i++) 	printf("%d ",v7[i]);
	return 0;
} 

对在伪代码中,有a1+ 4 * i,a1+4 *result,这样的字符。但是在C语言代码中没有,引用一下

51 67 69 72 74 78 83 90 97 103 110

易得

注意v18的顺序,flag{UJWP1jMp}

溜了溜了

简单注册器

apk文件用jadx打开

忽略上面的逻辑错误,直接看if里面


#include<stdio.h>
int main()
{
    char x[] = "dd2940c04462b4dd7c450528835cca15";
    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;
     }
     puts(x);
return 0;
}

得到flag{59acc538825054c7de4b26440c0999dd}

[GWCTF 2019]pyre

.pyc文件先转成.py

该目录下生成了

打开即可得到

# uncompyle6 version 3.9.0
# Python bytecode version base 2.7 (62211)
# Decompiled from: Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)]
# Embedded file name: encode.py
# Compiled at: 2019-08-19 21:01:57
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']

然后写个脚本逆回去,有点晕,以后说

#include<stdio.h>
#include<string.h>
int main(){
	char code[] = {'\x1f', '\x12', '\x1d', '(', '0', '4', '\x01', '\x06', '\x14', '4', ',', 
 					'\x1b', 'U', '?', 'o', '6', '*', ':', '\x01', 'D', ';', '%', '\x13'};
 	int n,i;
 	char input[24];
 	char num,ch;
	n= strlen(code);
	
	for(i=n-2;i>=0;i--){
		code[i]=code[i]^code[i+1];
	}
	for(i=0;i<n;i++){
		for(ch=1;ch<128;ch++){
			num=(ch + i) % 128 ;	//可以对原来的进行简化 
			if(code[i]==code[i]-num)		
			{
			input[i]=ch;
			break;
			}
	 }printf("%c",ch);
	} 
    

 return 0;
}
/*int main(){
	char code[] = {'\x1f', '\x12', '\x1d', '(', '0', '4', '\x01', '\x06', '\x14', '4', ',', 
 					'\x1b', 'U', '?', 'o', '6', '*', ':', '\x01', 'D', ';', '%', '\x13'};
 	int l;
	l = strlen(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

 return 0;
}*/

别人的

code = ['\x1f', '\x12', '\x1d', '(', '0', '4', '\x01', '\x06', '\x14', '4', ',', '\x1b', 'U', '?', 'o',
        '6', '*', ':', '\x01', 'D', ';', '%', '\x13']
flag=""
f1 = len(code)
for i in range(f1 - 2, -1, -1):
  code[i] = chr(ord(code[i]) ^ ord(code[i + 1]))
 
for j in range(f1):
  flag+=chr((ord(code[j]) - j) % 128)
print(flag)

看到一个说可以逆回去也可以用z3

知识梳理

ida快捷键

shift +f12查找字符串

n重命名

/做注释

r转化为ASCII码

h转化为十六进制

\管道符

base64

要是这种直接在线解码,然后有@的好像不行

数据大小端储存

记:在计算机中 数据都是小端存储的

DWORD类型

strlen:

strlen函数:当计算长度时,只有遇到'\0'才会停止计算,同时计算的长度不包含'\0'。

    场景一,arr字符数组中存储的是一个字符串(字符串是以'\0'为结束标志的),那么strlen遍历到字符 'e' 时,再向后遍历,就会遇到'\0',此时strlen停止遍历,返回字符个数:5;

    场景二:字符'a'、'b'、 'c' 、'd' 、'e'五个字符依次存储在arr的字符数组中,并没有存储'\0',所以'e'字符后面存储的内容我们并不知道有什么。而strlen函数只有遇到'\0'时才停止,所以返回的个数是一个随机值。

故:我们使用strlen函数时,应该检查字符数组是否以'\0'为结束标志

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值