DNUICTF反思总结

DNUICTF反思总结
自己还是太菜了。。。
在这里插入图片描述
1.signin 明码在这里插入图片描述
2 happyctf在这里插入图片描述
异或20

#include <iostream>
using namespace std;
int main(){

	int a[24]={114,120,117,115,111,67,113,120,119,123,121,
	113,75,96,123,75,90,113,97,103,123,114,96,105};
for(int i=0;i<24;i++)
	a[i]^=20;
	for(int i=0;i<24;i++){
		char p=a[i];
		cout<<p;
	}
	
} 

3 Remember Crypt 4
我太菜了,没学过rc4。赛后狠狠的看了看算法代码。来自百度百科
先初始化

void rc4_init(unsigned int*s, unsigned char*key, unsigned long Len)
{
    int i = 0, j = 0;
    char k[256] = { 0 };
    unsigned char tmp = 0;
    for (i = 0; i<256; i++)
    {
        s[i] = i;
        k[i] = key[i%Len];
    }
    for (i = 0; i<256; i++)
    {
        j = (j + s[i] + k[i]) % 256;
        tmp = s[i];
        s[i] = s[j];
        s[j] = tmp;
    }
}

建立一个s的256个成员的数组。内容为从0到255,且根据密钥被完全打乱。

void rc4_crypt(unsigned int*s, unsigned char*Data, unsigned long Len)
{
    int i = 0, j = 0, t = 0;
    unsigned long k = 0;
    unsigned char tmp;
    for (k = 0; k<Len; k++)
    {
        i = (i + 1) % 256;
        j = (j + s[i]) % 256;
        tmp = s[i];
        s[i] = s[j];//交换s[x]和s[y]
        s[j] = tmp;
        t = (s[i] + s[j]) % 256;
        Data[k] ^= s[t];
    }
}

再打乱一下s,然后进行异或操作。
这是对称加密,加密函数即为解密函数。
init对应sub_140001120()
crypt对应sub_140001240()
最后异或34再进行比较在这里插入图片描述
key=“12345678abcdefghijklmnopqrspxyz”

#include<stdio.h>
#include<string.h>
#include <iostream>
using namespace std; 
typedef unsigned longULONG;

void rc4_init(unsigned int*s, unsigned char*key, unsigned long Len)
{
    int i = 0, j = 0;
    char k[256] = { 0 };
    unsigned char tmp = 0;
    for (i = 0; i<256; i++)
    {
        s[i] = i;
        k[i] = key[i%Len];
    }
    for (i = 0; i<256; i++)
    {
        j = (j + s[i] + k[i]) % 256;
        tmp = s[i];
        s[i] = s[j];
        s[j] = tmp;
    }
}

void rc4_crypt(unsigned int*s, unsigned char*Data, unsigned long Len)
{
    int i = 0, j = 0, t = 0;
    unsigned long k = 0;
    unsigned char tmp;
    for (k = 0; k<Len; k++)
    {
        i = (i + 1) % 256;
        j = (j + s[i]) % 256;
        tmp = s[i];
        s[i] = s[j];//交换s[x]和s[y]
        s[j] = tmp;
        t = (s[i] + s[j]) % 256;
        Data[k] ^= s[t];
    }
}
 
int main()
{
    unsigned int  s[256] = { 0 }, s2[256] = { 0 };//S-box
    char key[256] = { "12345678abcdefghijklmnopqrspxyz" };
    char pData[512] = {0x9E,0xE7,0x30,0x5F,0xA7,0x01,0xA6,0x53,0x59,0x1B,0x0A,0x20,0xF1,0x73,0xD1,0x0E,0xAB,0x09,0x84,0x0E,0x8D, 0x2B};
    unsigned long len = strlen(pData);
 for(int i=0;i<22;i++)
 pData[i]^=0x22;
    rc4_init(s, (unsigned char*)key, strlen(key));
    for (i = 0; i<256; i++)
    {
        cout<<s[i]<<" ";
        if (i && (i + 1) % 16 == 0)putchar('\n');
    }
    printf("\n\n");
    for (i = 0; i<256; i++)
    {
        s2[i] = s[i];
    }
    rc4_crypt(s2, (unsigned char*)pData, len);
    printf("pData=%s\n\n", pData);
    return 0;
}

4 easyre
一点都不easy,我没学过linux系统vm信号转换。就看一个个信号函数蒙圈。(做题时:s1?s1是什么?在哪里赋的值?为什么有个区域一直被修改?)看别人题解后:原来如此。虽然还是不会做。在这里插入图片描述
开始读取4019c0的指令
看别人writeup的解析https://mp.weixin.qq.com/s/KgxHOFH52EE8z7NnMTSIDA
解码出来是汇编指令在这里插入图片描述
赋值是push pop 进行的。其中 call 29是异或,call 64是加。

在这里插入图片描述
最后再与s2比较,相等就行了。在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_51275728

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值