还是个远程的题,开启环境后登过去看到blukat,blukat.c,password三个文件,还都是可读的,password应该是密文,.c文件里有密钥,加密方法是异或,看似简单但是完不成.
由于password里有不可见字符,这里用xxd password弄成文本取回来
#password.xxd
00000000: 5561 263c 284d 437d 7e1a 020a 6e64 306e Ua&<(MC}~...nd0n
00000010: 2e7e 350f 1504 282d 7a15 0801 267f 6c23 .~5...(-z...&.l#
00000020: 1a61 1434 194e 4255 100e 7d0a .a.4.NBU..}.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
char flag[100];
char password[100];
char* key = "3\rG[S/%\x1c\x1d#0?\rIS\x0f\x1c\x1d\x18;,4\x1b\x00\x1bp;5\x0b\x1b\x08\x45+";
void calc_flag(char* s){
int i;
for(i=0; i<strlen(s); i++){
flag[i] = s[i] ^ key[i];
}
printf("%s\n", flag);
}
int main(){
FILE* fp = fopen("./password", "r");
fgets(password, 100, fp);
char buf[100];
printf("guess the password!\n");
fgets(buf, 128, stdin);
if(!strcmp(password, buf)){
printf("congrats! here is your flag: ");
calc_flag(password);
}
else{
printf("wrong guess!\n");
exit(0);
}
return 0;
}
#flag{107e7992-7f6c-45b6-bd89-c43c7fd1"'nt!\x1f
解密方法
from pwn import *
key = b"3\rG[S/%\x1c\x1d#0?\rIS\x0f\x1c\x1d\x18;,4\x1b\x00\x1bp;5\x0b\x1b\x08\x45+\x00"
passwd = open('password', 'rb').read()
print(len(key), len(passwd))
flag = ''
for i in range(len(passwd)):
flag+= chr(passwd[i]^key[i])
print(flag)
可是问题来了,BUU上的flag是uuid 总行42位,而key是33位,不够长。后来查了下网上,都是用的原版,原版flag没那么长。 提示是flag有点长,别问我,没办法,剩下的爆破flag就没意思了。