声明:re新手 定时更新wp
再声明:感觉一题一题来效率好低,我写wp的目的是为了查漏补缺,所以以后就写曾经卡了我很久的题吧
day 5
九、不一样的flag
无壳32丢到ida
看关键段
1上2下3左4右,很像控制人物移动的标志
看不懂,先不管,从后往前看
exit(0)是正常结束程序,而exit(非零值)表示程序出现了异常情况,所以我们不能执行到exit(非零值)
上面漏了一串代码
可以看到这是一串字符串,而49和35转成字符后是’1‘和’#‘,那么!!
注意看字符串中,包含了’1‘和’#‘,只有判断到’#‘才能正常结束程序,配合上文获得的信息,我们的人物不能移动到‘1’上,且‘#’是终点,所以这个字符串表示的是———一个迷宫!!!
*11110100001010000101111# 的长度是25,25只能被5整除,所以这是一个5*5的迷宫,我们将迷宫正确输出出来
*1111
01000
01010
00010
1111#
*是起点,#是迷宫出口
那么我们只要走到#,那路径就是flag了
222441144222
包上flag{222441144222}
十、SimpleRev
ELF64,丢ida里
main函数无从下手,shift+f12看字符串
老规矩看比较
join函数是将v9接到key3后面(strcat)
按r将v9数值转化成字符串
注意:因为涉及了内存存储的问题,所以我们要考虑字节序,下面用一个简单的程序测试是小端序还是大端序
#include <stdio.h>
int main() {
int num = 1;
char *ptr = (char *)#
if (*ptr == 1) {
printf("小端字节序 (Little Endian)\n");
} else {
printf("大端字节序 (Big Endian)\n");
}
return 0;
}
测试出来是小端序,所以字符串wodah实际是hadow、字符串SLCDN实际是NDCLS
而str2是由key进行变换得到的
key中的字符一开始是ADSFKNDCLS
这里的其实就是将大写字母转成小写字母了
变为adsfkndcls
这里输入的v1其实就是明文flag,经过循环key加密到了str2里面去了
str2到最后其实就是text,因为这俩得相等
直接用爆破脚本(网上找的)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char key[] = "adsfkndcls";
char text[] = "killshadow";
char flag[100] = "";
int keyLen = strlen(key);
int textLen = strlen(text);
for (int i = 0; i < textLen; i++) {
for (int x = 65; x < 123; x++) {
if (text[i] == (char)((x - 39 - key[i % keyLen] + 97) % 26 + 97)) {
strncat(flag, (char *)&x, 1);
break;
}
}
}
printf("flag{%s}\n", flag);
return 0;
}
得flag{KLDQCUDFZO}