HGAME2024 RE

本文讨论了EZCPP中的Tea加密函数实现,以及在IDA和010等工具中对其的观察分析,涉及64位操作和AES加密的线索。同时提及了动态规划数塔问题和多线程部分,展示了C++编程中的加密技术和调试过程。
摘要由CSDN通过智能技术生成

EZCPP

64位

进入那个函数

看*16,*32怪怪的

所以就是左移4位=2的四次方=16与左移五位

就很像tea加密惹

#include <stdio.h>

void Tea(int &v0, int &v1){
//	int k[4]={3412,4123,1234,2341};
	int sum=-17889239584,i;
	int delta=-559038737;
//	int k0=k[0],k1=k[1],k2=k[2],k3=k[3];
	for(i=0;i<32;i++){
		v1-=((v0*16)+3412)^(v0+sum)^((v0*32)+4123);
		v0-=((v1*16)+1234)^(v1+sum)^((v1*32)+2341);
		sum-=delta;
	}
}

/*void Tea(int &r,int &l)
{
	int sum=0,delta=-559038737;
	int i;
	int key[4]={1234,2341,3412,4123};
	for(i=0;i<32;i++)
	{
		r -= ((l << 4) + key[2]) ^ (l + sum) ^ ((l << 5) + key[3]);
		l -= ((r << 4) + key[0]) ^ (r + sum) ^ ((r << 5) + key[1]);
		sum += delta;
	}

}
*/
int main(){
    
  unsigned char a[] =
{
    0x88, 0x6A, 0xB0, 0xC9, 0xAD, 0xF1, 0x33, 0x33, 0x94, 0x74, 
    0xB5, 0x69, 0x73, 0x5F, 0x30, 0x62, 0x4A, 0x33, 0x63, 0x54, 
    0x5F, 0x30, 0x72, 0x31, 0x65, 0x6E, 0x54, 0x65, 0x44, 0x3F, 
    0x21, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
	
	int *x = (int*)(a + 3);
    int *y = (int*)(a + 7);
    Tea( *x, *y );
    
    int* x3=(int*)(a + 2);
	int* y3=(int*)(a + 6);
	Tea(*x3,*y3);	
	
	int* x2=(int*)(a + 1);
	int* y2=(int*)(a + 5);
	Tea(*x2,*y2);
    
	int* x1=(int*)(a + 0);
	int * y1=(int*)(a + 4);
	Tea(*x1,*y1);
	
	for(int i=0;i<32;i++)
		printf("%c",a[i]);
    return 0;
}

先看下一个哈

arithmetic

emm用ida打开发现蛮奇怪的

然后观赏wp

用010打开把Ari改成upx,学一下思路

然后脱壳ze

改三处

鼠鼠我啊

用ida打开

不是很懂这一堆的意思

观察wp

动态规划数塔问题

emmm

以后再说吧

#include<iostream>  
#include<algorithm>
using namespace std;
int n;
//dp数塔
int a[1000][1000];
//存放着最大路径
int step[1000];
//原数塔
int b[1000][1000];
int main(){
	cin >> n;
	//读取数塔
	for (int i = 0; i < n; i++){
		for (int j = 0; j <= i; j++){
			cin >> a[i][j];
			b[i][j] = a[i][j];
		}	
	}	
	//计算最大和
	for (int i = n - 2; i >= 0; i--){
		for (int j = 0; j <= i; j++){
			a[i][j] += max(a[i + 1][j], a[i + 1][j + 1]);	
		}
	}
	//求最长路径
	int x = 0, y = 0;
	//根据a数组来求,a数组是已经被修改过的数组,每一层的值是从底层开始求和的最优解
	step[0] = b[0][0];
	for (int i = 0; i < n - 1; i++){
		//若左边大时
		if (a[x + 1][y] > a[x + 1][y + 1]){
			step[i + 1] = b[x + 1][y];
			x++;
			cout<<"1";
		}
		//右边的数据较大时
		else{
			step[i + 1] = b[x + 1][y + 1];
			x++;
			y++;
			cout<<"2";
		}
	}	
	return 0;
}

先跳过这一部吧,以后再补

加密即可

babyre

open,进入main

这都啥啊

交叉引用再反编译

下面是多线程

进入1708那个函数

有一个什么信号异常,看汇编

放放,不懂什么是

零异常and信号量

判断函数

那个那个多线程部分

没很懂具体

加减异或

#include <stdio.h>
#include <stdint.h>
int main(){
	unsigned char t1[] ="feifei";
	for ( int i = 0; i <3; ++i )
      	t1[i]^= 17;
uint32_t data[33] =
{
  12052,
  78,
  20467,
  109,
  13016,
  109,
  27467,
  -110,
  9807,
  91,
  21243,
  -100,
  11121,
  20,
  10863,
  -107,
  10490,
  29,
  10633,
  -101,
  10420,
  78,
  17670,
  -38,
  6011,
  -4,
  16590,
  125,
  10723,
  15,
  7953,
  255
};


    for(int i=31;i>=0;i--){
    	if(i%4==3)
     		data[i] ^= data[i + 1] - *((char *)&t1 + (i + 1) % 6);
		if(i%4==2)
			data[i] /= data[i + 1] + *((char *)&t1 + (i + 1) % 6);
		if(i%4==1)
			data[i] += *((char *)&t1 + (i + 1) % 6) ^ data[i + 1];
		if(i%4==0)
			data[i] -= *((char *)&t1 + (i + 1) % 6) * data[i + 1];
	}//需要第33个data,即data[32]
	for(int i=0;i<32;i++)
		printf("%c",data[i]);
  return 0;
  
}

babyAndroid

打开

check1 

check2

native层(不是很懂)

用解压软件打开attachment.apk

把.so拖进ida

进入off26E8

一个AES加密

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值