REVERSE-PRACTICE-BUUCTF-4

刮开有奖

exe文件,运行后无任何提示,无壳,用ida分析
WinMain->DialogBoxParamA->DialogFunc
DialogBoxParamA函数:
DialogParamA-Intro
DialogFunc函数:
刮开有奖-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;
}

运行结果:
sub_8A10F0-result
其中,GetDlgItemTextA函数:
GetDlgItemTextA-Intro
继续向下走,可以看到有两个base64的变换,最后是比较判断
刮开有奖-DialogFunc1
其中,v19~v25其实就是输入的后7个字符,它们在栈中的位置对应如下,于是利用sub_8A10F0解出String和v19,v20到v22用v5逆base64,v23到v25用v4逆base64,即可得到flag
刮开有奖-DialogFunc2

[BJDCTF 2nd]8086

exe程序,但不能运行,程序名称提示要读汇编,ida分析
没看到什么有用的逻辑,发现一段硬编码,按c转成汇编代码
8086-logic
分析汇编代码,就是一段字符串和0x1F进行异或
8086-logic1
写代码即可得到flag
8086-script

[GKCTF2020]Check_1n

exe程序,运行后画了一台win xp的pc,要输入开机密码,无壳,ida分析
首先来到main函数,一通乱点
check_in-main
在sub_40100A->sub_404DF0中发现byte_1C76740要和“HelloWorld”这个字符串比较,猜测这个字符串就是开机密码,试一下果然开机了
check_in-pwd
开机后有几个小游戏和flag,果断去看flag那个块
check_in-game
提示说是虚假的flag,还有一段看起来很像base64的字符串
check_in-flagmode
解base64,提示说试试砖块游戏
check_in-debase64
没明白打砖块怎么玩就死了,但是头顶给出了flag,提交成功
check_in-flag

[GXYCTF2019]luck_guy

elf文件,无壳,ida分析
分析main函数,要求输入一个偶数,进入get_flag()函数
get_flag()函数取了5次随机数,然后用switch判断,case1给了flag的前半部分,后半部分是f2,但不知道f2,case2和case3没什么用,case4是给f2赋值,case5是对f2进行变换
lucky_guy-get_flag
由case5写脚本,注意小端序,长度为8,下标为奇数对应减2,下标为偶数对应减1,即可得到flag后半部分,连起来即为flag
lucky_guy-script

猜你喜欢

转载自blog.csdn.net/weixin_45582916/article/details/114155776