REVERSE-PRACTICE-BUUCTF-4
- 刮开有奖
- [BJDCTF 2nd]8086
- [GKCTF2020]Check_1n
- [GXYCTF2019]luck_guy
刮开有奖
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