2022NewStar新生赛week3—cat flag
先看看开了什么保护机制
打开64位ida看看
这个就是有四个功能,我们先看看ls
就是一个很正常的ls,没啥好看的
再去看看cat
先是输入一个名字,然后判断是否含有.和/,没有的话开一个线程去执行cating函数
这个cating函数首先判断name数组(也就是我们之前输入的要打印的文件的名字)是不是flag,是的话就不打印,否则休息1s再打印,这个就很有意思了,为什么要休息1s(sleep函数)
再去看看mv
就是修改name这个变量
这时候我们就可以想想了,要知道开线程,线程的特性就是和原来的程序同时运行,就像我们开多个软件一样,不过不同的是我们开多个软件,他的内存会协调好来,要不然你改一下我改一下,你用一下我用一下岂不是乱了套,但是我们程序运行是不会协调好来的,也就是他会同时公用一块内存,也就是说我在原来程序修改了name,那么线程里的name也会随着改变,因为这两个都是同一个地址的内容,所以也就是说,我们一开始可以用一个存在的且不为flag的文件名通过那个和flag比较的检测,然后会sleep1s,这就是在等我们去源程序修改,这时候我们直接在源程序用mv功能修改name的名字为flag就行了,这就是竞态条件
from pwn import*
p=remote('node4.buuoj.cn',28333)
p.recvuntil('==>')
p.sendline(str(2))
p.recvuntil('cat.\n')
p.sendline('bin')
p.recvuntil('==>')
p.sendline(str(3))
p.recvuntil('change.\n')
p.sendline('flag')
p.interactive()