XCTF-reverse-notsequence wp
阿新 • • 發佈:2020-12-23
查殼,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; }