[GXYCTF2019]luck_guy
查壳
没有壳,用64位ida打开,找到一个关键函数patch_me
这段代码是判断奇数,偶数奇数的话就打印“just fiinished",偶数进入get_flag函数,继续跟进
这是解出flag的函数,接下来进行分析:
这个函数是伪随机,下面case语句是有顺序的,有用的是case1,4,5。case1是将f1,f2两个字串拼接起来,想必就是flag,查看f1:GXY{do_not_,f2为空,那么就需要f2解出来,接着看下面程序,case4是将s = 0x7F666F6067756369LL的值赋给了f2,case5就是对f2的一个处理。
接下来就是脚本解决f2(需要注意下大小端存储问题)
flag{do_not_hate_me}
[BJDCTF2020]JustRE
无壳,用32位ida打开shift+f12查看关键字符串
发现类似于flag的字符串 BJD{%d%d2069a45792d233ac} 找到它所在的函数
%d%d
中的 %d
部分将被具体的整数值替代,结果字符串中将不再包含 %d
最终的字符串结果是 " BJD{1999902069a45792d233ac}"
flag为:flag{1999902069a45792d233ac
}
刮开有奖
32位无壳,并且运行程序没用
DialogBoxParamA这个函数是建立一个对话框,然后传一个函数最为参数即DialogFunc这个函数
这就是主函数部分,简单分析flag是8位的,然后是对字符进行加密
但有10个字符,还有个sub_4010F0函数,点进去看一下
这个函数对10个字符进行了处理这里需要将伪代码改为C的代码(从大佬的博客知道a1+4*i,也就是a1[i],a1+4 * result,也就是a1[result],因为int占四个字节,所以需要*4.如果是char类型就不需要.,将*(_DWORD*) 删掉就可以将伪代码修改为可以运行的C代码)
#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;
}
运行后得到经过处理的字符:3CEHJNSZagn
紧接着有个sub_401000,进去看看,发现很复杂看到有一个byte_407830函数
是将是将,v4 = ak1w,v5 = V1Ax,两个字符串base64加密。分别解出来为v4 = jMp,v5 = WP1
最后的代码
后面四个字符,就是base64加密的那几个,可以看到第三第四字符已经是WP了,说明,WP1在前,jMp在后,,将他们拼接在一起,得到,UJWP1jMp。
简单注册器
下载完附件发现是apk文件,用jadx反编译
咱也不会弄胡乱点,发现了个字符串dd2940c04462b4dd7c450528835cca15
看起来很复杂但主要还是
if (flag == 1) { 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; } String bbb = String.valueOf(x); textview.setText("flag{" + bbb + "}"); return; }
这一部分是需要通过改写可以得到flag()
[GWCTF 2019]pyre
下载完附件是.pyc文件,python反编译,找了个在线工具
需要反过来求input1
code = ['\x1f', '\x12', '\x1d', '(', '0', '4', '\x01', '\x06', '\x14', '4', ',', '\x1b', 'U', '?', 'o', '6', '*', ':',
'\x01', 'D', ';', '%', '\x13']
l = len(code)
print(l)
flag = ''
for i in range(l - 2, -1, -1):
code[i] = chr(ord(code[i]) ^ ord(code[i + 1]))
for i in range(l):
flag += chr((ord(code[i]) - i) % 128)
print(flag)
得到的结果最后用flag{}包裹
[ACTF新生赛2020]easyre
解压后有两个exe对其中一个查壳
发现有壳,upx脱壳
另一个exe是这样的
应该没啥用
32位ida打开
从flag长度应该是12,将flag的ASCII值作为下标取值,与v4数组比较。需要利用v4数组_data_start__中找位置,就是我们flag的值
[ACTF新生赛2020]rome
主函数没有什么,进入进入func()
v2是一个数组,输入之后会对输入的数进行一系列if判断,其实前面就是ACTF{接下来将{之后的4个值给到v1这个数组,然后是一个16次循环判断是否是大小字母,进行相应的变换,有一点点像凯撒的风格,最后将变换的值与v12那一串数字进行比较。
得到flag:ACTF{Cae3ar_th4_Gre@t}