buu刷题日记2

文章讲述了在FlareOn5、MRCTF2020等比赛中解决技术挑战的过程,包括解压、反编译APK和jar文件、识别加密函数、栈溢出利用等步骤,展示了技术专家如何通过逆向工程找到flag。
摘要由CSDN通过智能技术生成

[FlareOn5]Minesweeper Championship Registration

下载附件打开后是jar文件,直接用jdgui打开就能发现flag
在这里插入图片描述

[MRCTF2020]PixelShooter

下载附件发现是apk文件,然后搜索有搜索发现是安卓逆向,要用到jeb但是没下就根据别人博客下载了一个,然后又扒拉扒拉别人博客发现安卓unity游戏的核心逻辑一般位于assets\bin\Data\Managed\Assembly-CSharp.dll,所以这里我们可以直接进去搜索{,然后会发现
在这里插入图片描述
我们也就得出了flag为:flag{Unity_1S_Fun_233}

[ACTF新生赛2020]SoulLike

下载附件打开查壳发现无壳是64位
在这里插入图片描述
然后ida打开直接反编译查看主函数

__int64 __fastcall main(int a1, char **a2, char **a3)
{
  char v5; // [rsp+7h] [rbp-B9h]
  int i; // [rsp+8h] [rbp-B8h]
  int j; // [rsp+Ch] [rbp-B4h]
  int v8[14]; // [rsp+10h] [rbp-B0h] BYREF
  char v9[110]; // [rsp+4Ah] [rbp-76h] BYREF
  unsigned __int64 v10; // [rsp+B8h] [rbp-8h]

  v10 = __readfsqword(0x28u);
  printf("input flag:");
  scanf("%s", &v9[6]);
  strcpy(v9, "actf{");
  v5 = 1;
  for ( i = 0; i <= 4; ++i )
  {
    if ( v9[i] != v9[i + 6] )
    {
      v5 = 0;
      goto LABEL_6;
    }
  }
  if ( !v5 )
    goto LABEL_16;
LABEL_6:
  for ( j = 0; j <= 11; ++j )
    v8[j] = v9[j + 11];
  if ( (unsigned __int8)sub_83A(v8) && v9[23] == 125 )
  {
    printf("That's true! flag is %s", &v9[6]);
    return 0LL;
  }
  else
  {
LABEL_16:
    printf("Try another time...");
    return 0LL;
  }
}

主函数是这玩意然后分析了一波发现加密函数肯定是sub_83A,但是这里打不开并给出提示
在这里插入图片描述
然后去网络上又找了找,又看了看佬的博客,最后弄明白了原因是函数太大导致反编译失败,然后将其成功显示出来需要修改配置文件,就是把配置文件IDA\cfg\hexrays.cfg给修改了,并将

MAX_FUNCSIZE            = 64        // Functions over 64K are not decompiled
修改为:
MAX_FUNCSIZE            = 1024        // Functions over 64K are not decompiled

修改成功并保存后即可成功打开发现这个函数三千多行,贼拉多,但是就是对数组的处理以及异或操作,所以这里写脚本也没有搞出来因为代码段太长了,就借鉴了一下网上大佬的脚本,可是好像因为这个代码有点多很多脚本都不完整,但是还有一种pwn的解法,根据栈溢出来进行exp的编写,因为实力有限就没有细看所以就只看了他们c的脚本

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int v4[]={126,50,37,88,89,107,53,110,0,19,30,56};
int sub_83A(char *v1,int i)
{
	*v1 ^= 43u;
	v1[1] ^= 108u;
	v1[2] ^= 126u;
	v1[3] ^= 86u;
	//复制源代码
	v1[8] ^= 0x6Bu;
	v1[9] ^= 0x70u;
	v1[10] ^= 0x29u;
	v1[11] ^= 0x3Bu;
	if(v1[i] == v4[i])
		return 1;
	else
	    return 0;
}

int main()
{
	int i,j;
	char flag[13] = "";
	char tmp[13] = "";
	for(i = 0; i < 12 ; i++)
	{
	    for(j = 33; j <= 126 ; j++)
	    {
	        strcpy(flag,tmp);
	        flag[i] = j;
	        if(sub_83A(flag,i))
	        {
	            tmp[i] = j;
	            break;
	        }
	    }
	}
	printf("actf{%s}\n",tmp);
	return 0;
}

最后运行的结果就是flag为:flag{b0Nf|Re_LiT!}
当然也写了一些杂项和密码题,但是因为有点lazy就就就不想写博客了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值