签层饼
题目下载:下载
程序很简单,其中生成随机数的那部分代码并没有影响用户输入的值,所以可以不考虑,那倒着分析,看那个if分支
dword_525A30为0就可以输出yeah,那我们肯定想让他为0,点进去看看
发现如果if条件成立,则 dword_525A30 就为0,那看if条件,因为要求num1和num2,所以他们是唯一的,所以如果想要输出yeah!这个if条件一定成立,即num2正确的话,dword_525A30一定为0,所以关注点是如何求num1,num2。
对,num1,num2按热键x交叉引用。
Tea_tube_pot
题目下载:下载
所以从网上找脚本就可以写出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!}