ctfshow吃瓜杯-签层饼、Tea_tube_pot

签层饼

题目下载:下载

载入IDActfshow吃瓜杯-签层饼、Tea_tube_pot_第1张图片

程序很简单,其中生成随机数的那部分代码并没有影响用户输入的值,所以可以不考虑,那倒着分析,看那个if分支ctfshow吃瓜杯-签层饼、Tea_tube_pot_第2张图片

 dword_525A30为0就可以输出yeah,那我们肯定想让他为0,点进去看看

 发现恒1,x交叉引用ctfshow吃瓜杯-签层饼、Tea_tube_pot_第3张图片ctfshow吃瓜杯-签层饼、Tea_tube_pot_第4张图片

发现如果if条件成立,则 dword_525A30 就为0,那看if条件,因为要求num1和num2,所以他们是唯一的,所以如果想要输出yeah!这个if条件一定成立,即num2正确的话,dword_525A30一定为0,所以关注点是如何求num1,num2。

回到主函数ctfshow吃瓜杯-签层饼、Tea_tube_pot_第5张图片

 对,num1,num2按热键x交叉引用。

对num1:ctfshow吃瓜杯-签层饼、Tea_tube_pot_第6张图片ctfshow吃瓜杯-签层饼、Tea_tube_pot_第7张图片

ctfshow吃瓜杯-签层饼、Tea_tube_pot_第8张图片 ctfshow吃瓜杯-签层饼、Tea_tube_pot_第9张图片

 对num2:ctfshow吃瓜杯-签层饼、Tea_tube_pot_第10张图片

 ctfshow吃瓜杯-签层饼、Tea_tube_pot_第11张图片

ctfshow吃瓜杯-签层饼、Tea_tube_pot_第12张图片

ctfshow吃瓜杯-签层饼、Tea_tube_pot_第13张图片

 有4个表达式,用z3求解ctfshow吃瓜杯-签层饼、Tea_tube_pot_第14张图片

可求num1,num2

所以flag为ctfshow吃瓜杯-签层饼、Tea_tube_pot_第15张图片

Tea_tube_pot

题目下载:下载

载入IDActfshow吃瓜杯-签层饼、Tea_tube_pot_第16张图片容易知道flag三部分组成,分别进入

可知第一部分为典型tea加密ctfshow吃瓜杯-签层饼、Tea_tube_pot_第17张图片

第二部分为典型xtea加密 ctfshow吃瓜杯-签层饼、Tea_tube_pot_第18张图片

第三部分为典型xxtea加密ctfshow吃瓜杯-签层饼、Tea_tube_pot_第19张图片

所以从网上找脚本就可以写出flag

解第一部分

#include  
int main(){
	int v[2]={0x5FD744F6,0x95832046};
	 unsigned int key[4]={0x73696854,0x5F73695F,0x74616574,0x21656275};
	unsigned int l = v[0], r = v[1], sum = 0, delta = 0x61C88647;
	sum = delta * (-32);
	for (size_t 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;
	}
	v[0] = l;
	v[1] = r;
	char *p=(char *) v;
	for(int i=0;i<8;i++){
		printf("%c",*p);
		p++;
	}
}
//T1nyENCr

 解第二部分
 

#include 
int main(){
	int key[4]={0x73696854,0x5F73695F,0x74616574,0x21656275};
	int v[2]={0xFD731313,0x6662CB90};
  	unsigned int l = v[0], r = v[1], sum = 0, delta = 0x61C88647;
  	sum = delta * (-32);
  	for (size_t i = 0; i < 32; i++) {
    	r -= (((l << 4) ^ (l >> 5)) + l) ^ (sum + key[(sum >> 11) & 3]);
    	sum += delta;
    	l -= (((r << 4) ^ (r >> 5)) + r) ^ (sum + key[sum & 3]);
  }
  	v[0] = l;
  	v[1] = r;
  	char *p=(char *) v;
	for(int i=0;i<8;i++){
		printf("%c",*p);
		p++;
	}
}
//yPti0nA1

解第三部分
 

#include 
#include 
#define MX \
  ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z))
bool btea(unsigned int* v, int n, unsigned int* k) {
  unsigned int z = v[n - 1], y = v[0], sum = 0, e, DELTA = 0x9e3779b9;
  unsigned int p, q;
  if (n > 1) { /* Coding Part */
    q = 6 + 52 / n;
    while (q-- > 0) {
      sum += DELTA;
      e = (sum >> 2) & 3;
      for (p = 0; p < n - 1; p++)
        y = v[p + 1], z = v[p] += MX;
      y = v[0];
      z = v[n - 1] += MX;
    }
    return 0;
  } else if (n < -1) { /* Decoding Part */
    n = -n;
    q = 6 + 52 / n;
    sum = q * DELTA;
    while (sum != 0) {
      e = (sum >> 2) & 3;
      for (p = n - 1; p > 0; p--)
        z = v[p - 1], y = v[p] -= MX;
      z = v[n - 1];
      y = v[0] -= MX;
      sum -= DELTA;
    }
    return 0;
  }
  return 1;
}
 
int main(int argc, char const* argv[]) {
  // test
  unsigned int v[2] = {0x4B136C82, 0x1A6E9613}, key[4] = {0x73696854, 0x5F73695F, 0x74616574, 0x21656275};
  //printf("%u,%u\n", v[0], v[1]);
  //btea(v, 2, key);
  //printf("%u,%u\n", v[0], v[1]);
  btea(v, -2, key);
  char *p=(char *) v;
	for(int i=0;i<8;i++){
		printf("%c",*p);
		p++;
	}
  //printf("%u,%u\n", v[0], v[1]);
  return 0;
}

//9ori7hM!

所以flag为ctfshow{T1nyENCryPti0nA19ori7hM!}

你可能感兴趣的:(re简单题,c++,CTF,tea,re)