1. 程式人生 > 實用技巧 >XCTF-reverse-notsequence wp

XCTF-reverse-notsequence wp

查殼,IDA開啟F5 進入main函式
發現很友好,可以看出來輸入了一些數,以0結尾
然後進行了兩個check

進入兩個check 函式,

發現是對一些數進行求和然後和一個數進行比較,
但是很難看出來到底是哪幾個數相加,於是可以用c++把這些數的下標輸出
用C++寫出這兩個check函式
執行一下

可以發現輸入的數字分成若20行,每一行的和為2的倍數,然後第i列前19個數的和為第20行第i+1列的值
可以想到是楊輝三角
然後再MD5就可以拿到flag

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
int c[200][200];
char s[100]="123456789012345678901234567890";
int main() {
	//觀察check函式的作用 
	int v5=0;
	for(int i=0;i<=1024;i=v5*(v5+1)/2) {
		int v3=0;
		printf("i=%d,v5=%d : ",i,v5);
		for(int j=0;j<=v5;j++) {
			v3+=s[i+j];
			printf(" %d",i+j);
		}
		printf("  sum is %d\n",1<<v5);
		++v5;
		if(v5==20) {
			break;
		}
	}
	
	int v4=0,v3=0,v6=0;
	for(int i=1;i<20;i++) {
		v4=0;
		v3=i-1;
		printf("%d: ",i);
		while(20-1>v3) {
			v4+=s[i-1+(v3*(v3+1)/2)];
			printf("%d ",v6+(v3*(v3+1)/2));
			++v3;
		}
		printf("  final is %d\n",i+(v3*(v3+1)/2));
		if(v4!=s[i+(v3*(v3+1)/2)]) {
			
		}
		++v6;
	} 
	
	
	
	c[0][0]=1;
	for(int n=0;n<=20;n++) {
		c[n][0]=1;
	}
	for(int n=1;n<=20;n++) {
		for(int m=1;m<=n;m++) {
			c[n][m]=c[n-1][m-1]+c[n-1][m];
		}
	}
	
	freopen("A.txt","w",stdout);
	for(int n=0;n<=19;n++) {
		for(int m=0;m<=n;m++) {
			printf("%d",c[n][m]);
		} 
	}
	return 0;
}