ctfshow吃瓜杯-签层饼、Tea_tube_pot

签层饼

题目下载:下载

载入IDA

程序很简单,其中生成随机数的那部分代码并没有影响用户输入的值,所以可以不考虑,那倒着分析,看那个if分支

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

 发现恒1,x交叉引用

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

回到主函数

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

对num1:

 

 对num2:

 

 有4个表达式,用z3求解

可求num1,num2

所以flag为

Tea_tube_pot

题目下载:下载

载入IDA容易知道flag三部分组成,分别进入

可知第一部分为典型tea加密

第二部分为典型xtea加密

第三部分为典型xxtea加密

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

解第一部分

#include <stdio.h> 
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 <stdio.h>
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 <stdbool.h>
#include <stdio.h>
#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!}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值