pwnable - mistake
step by step
提示与运算符优先级有关
#include <stdio.h> #include <fcntl.h> #define PW_LEN 10 #define XORKEY 1 void xor(char* s, int len){ int i; for(i=0; i<len; i++){ s[i] ^= XORKEY; } } int main(int argc, char* argv[]){ int fd; if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){ printf("can't open password %d\n", fd); return 0; } printf("do not bruteforce...\n"); sleep(time(0)%20); char pw_buf[PW_LEN+1]; int len; if(!(len=read(fd,pw_buf,PW_LEN) > 0)){ printf("read error\n"); close(fd); return 0; } char pw_buf2[PW_LEN+1]; printf("input password : "); scanf("%10s", pw_buf2); // xor your input xor(pw_buf2, 10); if(!strncmp(pw_buf, pw_buf2, PW_LEN)){ printf("Password OK\n"); system("/bin/cat flag\n"); } else{ printf("Wrong Password\n"); } close(fd); return 0; }
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){
问题在这:比较运算符优先级大于赋值运算优先级,这里fd=0,read函数时,实际是在stdin读入数据,也就是我们输入的内容
然后与第二次输入的password异或相同就给flag
(注意:这里输入是字符串,异或时也是字符串中字符的最低位改变,不是输入的变,而是它对应的ascii码最低位异或后对应的字符)