2022Newstar新生赛week1—calc
看看开了什么保护机制

打开64位ida,发现有两个函数


通过第一个函数puts的话和第二个函数的阅读,发现这一题就是给你100题计算题,30s内全对就可以拿到shell了,这个对于有python编程功底的应该不难,毕竟计算机算的快得多
from pwn import*
p=process('./pwn1')
for i in range(100):
p.recvuntil('answer? ')
a=p.recvline()
b=a.split(' ')
print(b[0])
print(b[1])
print(b[2])
if '+' in b[1]:
p.sendline(str(int(b[0])+int(b[2])))
print(int(b[0])+int(b[2]))
if '-' in b[1]:
p.sendline(str(int(b[0])-int(b[2])))
print(int(b[0])-int(b[2]))
if 'x' in b[1]:
print(int(b[0])*int(b[2]))
p.sendline(str(int(b[0])*int(b[2])))
if '/' in b[1]:
print(int(b[0])/int(b[2]))
p.sendline(str(int(b[0])/int(b[2])))
p.interactive()
还有另一种思路,我们知道,c语言的随机数其实是伪随机,他是有循环节的,只不过循环节很大,所以可以看作随机数,而且他生成的算法是固定的,所以说只要种子一样,那么生成的第几个随机数一定是对应相同的,所以我们使用python调用c语言的库,这样子我们就可以提前获得题目了,不过要注意的是,种子是当前时间,所以如果网速慢,导致电脑启动的代码完了的话就会种子不一样,从而导致随机数错误,这时候换个网多试几次就行了
from pwn import*
from ctypes import*
p=remote('node4.buuoj.cn',26702)
lib=CDLL('pwn1.so')
for i in range(0,100):
a1=lib.xyqrand(i+114)%1919+1
a2=lib.xyqrand(i+514)%810+1
a3=lib.xyqrand(i+1919810)%3
if a3==0:#+
a4=a1+a2
elif a3==1:#-
a4=a1-a2
elif a3==2:#x
a4=a1*a2
else :a4=a1/a2
p.sendline(str(a4))
p.interactive()

浙公网安备 33010602011771号