您的位置:首页 > 其它

pwnable 笔记 Toddler's Bottle - mistake

2016-11-16 23:12 375 查看
这题考察对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()


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pwnable