pwnable.kr mistake

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

#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;
}

大概分析一下这个程序的逻辑是
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在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值