这题考察对c语言的运算符优先级的理解
题目源码
题目分析
先看一遍代码,程序开始的时候调用open()
打开文件password
open()
函数如果成功打开了文件,会返回一个正整数值,如果失败,会返回-1
仔细的看一下下面这段代码,可以发现这里出了一个小错误
if(fd=open("/home/taqini/pwnable/mistake/password",O_RDONLY,0400) < 0)
关系运算符<
的优先级要高于赋值运算符=
,这里先执行判断语句:
open("/home/taqini/pwnable/mistake/password",O_RDONLY,0400) < 0
如果open()
成功打开文件,将返回一个正整数,这个数小于0必然不成立,所以这个判断语句返回的结果是False
也就是0
,之后再执行赋值语句
fd = 0
这样只要文件打开成功,fd
就会等于0
(表示stdin
文件)
这导致了后面read()
本来应该从password
文件中读数据,现在却变成了从stdin
中读取数据
if(!(len=read(fd,pw_buf,PW_LEN) > 0))
这里read()
从标准输入文件中读取了10
个字节的数据,存到了pw_buf
中,pw_buf
中原本应该存储password
的前10
个字节,现在变成了存储stdin
中的前10
个字节。
所以我们只需要在标准输入中写上10
个字节的数据,这10
字节的数据就是pw_buf
之后scanf()
读取pw_buf2
,pw_buf2
的每一位和1
异或后与pw_buf
对比,相等的话,打印出flag
解题思路
- 向
stdin
中输入pw_buf
pw_buf
和1
按位异或后得到pw_buf2
- 输入
pw_buf2
解题脚本
#!/usr/bin/python
from pwn import *
from time import sleep
target = process('/home/mistake/mistake')
pw_buf = "A"*10
pw_buf2 = ""
for c in pw_buf:
pw_buf2 += chr(ord(c)^1)
target.sendline(pw_buf)
sleep(20)
target.read()
target.sendline(pw_buf2)
target.interactive()