Reverse 3
strlen
格式:strlen (字符数组名)
功能:计算字符串s的(unsigned int型)长度,不包括’\0’在内
说明:返回s的长度,不包括结束符 \0提示
注意:调用strlen函数前需要包含string.h这个头文件
sizeof和strlen的区别
-
sizeof属于一种操作符(关键字) 而strlen属于一种函数
-
sizeof计算的结果是内存大小 strlen计算的结果则是字符串的长度
char ar[10]="abcdefg"; int num1=sizeof(ar)//10 int num2=strlen(ar)//7
ctrncpy
ctrncpy属于c语言标准库里的一个函数 ,定义在string.h头文件中,作用就是将一个字符串的一部分拷贝到另一个字符串里
memset
memset也是属于c语言标准库里的一个函数,定义在string.h的头文件中,作用是将一块内存中所有字节都设定为特定的值
int main() { char arr1[20]="abcdefghigk"; char arr2[10]; memset(arr2, '\0', sizeof(arr2)); strncpy(arr2,arr1,9); //因为这里arr2出去\0外所包含的内存空间为9 所以交换字符不可超过9位 printf("%s\n",arr2);
chr()
chr()
是 Python 中的一个内置函数,它用于将 ASCII 码值转换为对应的字符ASCII是一种字符编码标准,用于将特定的数字值映射到字符上。在 Python 中,chr()
函数接受一个介于 0 到 127 之间的整数(对应于标准 ASCII 表)作为参数,并返回对应的字符。
strncmp
strncmp是c'语言标准库里的一个函数,定义在string.h头文件中,作用是比较两个字符串a b 在前n位是否相同
如果在第n位上两个字符串所对应字符的ASCII值相同的话返回0
如果a<b则返回一个负整数
如果a>b则返回一个正整数
const char *str1 = "abcdefg"; const char *str2 ="efjajkfaj"; int num-strncmp(str1,str2,5);
base64
Base64是一种基于64个可打印字符来表示二进制的表示方法
26个大写字母 26个小写字母10个自然数还有两个符号+和/
因为是64位刚好是2的6次方 所以每六位为一组 缺少的用=表示
和ASCII码表的含义差不多
值得注意的是Base64不是加密算法 其仅仅是一种编码方式 所以不能依赖他进行加密
在做这道reverse3时 我们先对程序进行查壳 发现无壳 然后对程序进行反汇编处理
在伪c代码里查看主函数的逻辑(将str这个字符串进行base64编码,把Destination这个数组里的字符拷贝到v4中 ,又进行了一次简单的加密)
在写一个一次解密的脚本
这里这个加密的原理就是将本来每个字符对应的ASCII值再减去其索引值 进行简单的加密
char arr[] = ""; int len = strlen(arr); char flag[100] = {0}; int num = 0; for (int i = 0; i < len; i++) { char temp = arr[i] - i; if (temp< 0) { temp += 256; } flag[num++] =temp; } flag[num] = '\0'; printf(" %s\n", flag);
解密后的 e2lfbDB2ZV95b3V9在放入base解密工具中进行解密得到flag{i_l0ve_you}提交就ok了