当前位置: 代码迷 >> 综合 >> pwnable.kr mistake
  详细解决方案

pwnable.kr mistake

热度:64   发布时间:2023-12-17 11:11:58.0

看一下题目
在这里插入图片描述
ssh连接一下
看一下目录的文件
在这里插入图片描述
先看一下 mistake.c

#include <stdio.h>
#include <fcntl.h>#define PW_LEN 10
#define XORKEY 1void 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 inputxor(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;
}

大概分析一下这个程序的逻辑是
1.题目从/home/mistake/password文件中读取10字节数据
2.我们输入10字节并把这10个字节与XORKEY (0x1)异或
3.对比上面两个字符串是否一致,一致则输出flag

看起来最简单的方法是 cat一下password的文件,但是我们是没有权限读取的
在这里插入图片描述
还有一个方法是可以爆破,但仔细看它的题目提示是不需要花里胡哨的黑客技能的,所以应该也不是爆破
在这里插入图片描述
这句提示也说明了是符号优先级的问题
在这里插入图片描述
找了一下资料后发现问题出在这行代码里

if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0)
{
...
}

因为比较运算符优先级高于赋值运算符,而open打开一个文件,任何情况下返回都不会小于0,所以比较之后的结果等于0,0就赋值给了fd(fd=0),如果fd=0,那么之后的read(fd,pw_buf,PW_LEN)实际上是从stdin读取,stdin我们可以控制是我们可以控制输入的,控制了两个buf解开就很简单了

第一次输入1111111111(1是0x31),第二次输入0000000000(0x30),第二次经异或0x1也变为了111111111在这里插入图片描述