REVERSE-PRACTICE-BUUCTF-4
刮开有奖
exe文件,运行后无任何提示,无壳,用ida分析
WinMain->DialogBoxParamA->DialogFunc
DialogBoxParamA函数:
DialogFunc函数:
其中sub_8A10F0函数存在递归调用,它的作用就是v7到v17的数据变换位置,把这个函数的代码进行简单处理运行,得到变换位置后v7到v17的数据
#include<stdio.h>
int arr[] = { 90, 74, 83, 69, 67, 97, 78, 72, 51, 110, 103 };
void sub_8A10F0(int * a1, int a2, int a3)
{
int result;
int i;
int v5;
int v6;
result = a3;
for (i = a2; i <= a3; a2 = i)
{
v5 = i;
v6 = a1[i];
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_8A10F0(a1, a2, i - 1);
result = a3;
++i;
}
}
void main()
{
sub_8A10F0(arr, 0, 10);
for (int i = 0; i < sizeof(arr) / sizeof(int); i++)
{
printf("%d-%c\n", arr[i],arr[i]);
}
return;
}
运行结果:
其中,GetDlgItemTextA函数:
继续向下走,可以看到有两个base64的变换,最后是比较判断
其中,v19~v25其实就是输入的后7个字符,它们在栈中的位置对应如下,于是利用sub_8A10F0解出String和v19,v20到v22用v5逆base64,v23到v25用v4逆base64,即可得到flag
[BJDCTF 2nd]8086
exe程序,但不能运行,程序名称提示要读汇编,ida分析
没看到什么有用的逻辑,发现一段硬编码,按c转成汇编代码
分析汇编代码,就是一段字符串和0x1F进行异或
写代码即可得到flag
[GKCTF2020]Check_1n
exe程序,运行后画了一台win xp的pc,要输入开机密码,无壳,ida分析
首先来到main函数,一通乱点
在sub_40100A->sub_404DF0中发现byte_1C76740要和“HelloWorld”这个字符串比较,猜测这个字符串就是开机密码,试一下果然开机了
开机后有几个小游戏和flag,果断去看flag那个块
提示说是虚假的flag,还有一段看起来很像base64的字符串
解base64,提示说试试砖块游戏
没明白打砖块怎么玩就死了,但是头顶给出了flag,提交成功
[GXYCTF2019]luck_guy
elf文件,无壳,ida分析
分析main函数,要求输入一个偶数,进入get_flag()函数
get_flag()函数取了5次随机数,然后用switch判断,case1给了flag的前半部分,后半部分是f2,但不知道f2,case2和case3没什么用,case4是给f2赋值,case5是对f2进行变换
由case5写脚本,注意小端序,长度为8,下标为奇数对应减2,下标为偶数对应减1,即可得到flag后半部分,连起来即为flag