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'为结束标志