misc
buu-后门查杀

下载附件,我们用火绒安全扫一下然后点击详情进入该文件所在文件夹,再用记事本打开该文件,搜索flag无果,再试试pass(由题目中的密码联系到pass,password,key等),然后看到了一个
将这个内容提交试试,成功
crypto
buu-rsa2

打开文件,看到e的值很大,那么这是低解密指数,找到模板,求d(因为在文件中有一个未定义的变量d)
import gmpy2
def transform(x,y): #使用辗转相处将分数 x/y 转为连分数的形式
res=[]
while y:
res.append(x//y)
x,y=y,x%y
return res
def continued_fraction(sub_res):
numerator,denominator=1,0
for i in sub_res[::-1]: #从sublist的后面往前循环
denominator,numerator=numerator,i*numerator+denominator
return denominator,numerator #得到渐进分数的分母和分子,并返回
#求解每个渐进分数
def sub_fraction(x,y):
res=transform(x,y)
res=list(map(continued_fraction,(res[0:i] for i in range(1,len(res))))) #将连分数的结果逐一截取以求渐进分数
return res
def get_pq(a,b,c): #由p+q和pq的值通过维达定理来求解p和q
par=gmpy2.isqrt(b*b-4*a*c) #由上述可得,开根号一定是整数,因为有解
x1,x2=(-b+par)//(2*a),(-b-par)//(2*a)
return x1,x2
def wienerAttack(e,n):
for (d,k) in sub_fraction(e,n): #用一个for循环来注意试探e/n的连续函数的渐进分数,直到找到一个满足条件的渐进分数
if k==0: #可能会出现连分数的第一个为0的情况,排除
continue
if (e*d-1)%k!=0: #ed=1 (mod φ(n)) 因此如果找到了d的话,(ed-1)会整除φ(n),也就是存在k使得(e*d-1)//k=φ(n)
continue
phi=(e*d-1)//k #这个结果就是 φ(n)
px,qy=get_pq(1,n-phi+1,n)
if px*qy==n:
p,q=abs(int(px)),abs(int(qy)) #可能会得到两个负数,负负得正未尝不会出现
d=gmpy2.invert(e,(p-1)*(q-1)) #求ed=1 (mod φ(n))的结果,也就是e关于 φ(n)的乘法逆元d
return d
print("该方法不适用")
n= 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241962525705950046253400188884658262496534706438791515071885860897552736656899566915731297225817250639873643376310103992170646906557242832893914902053581087502512787303322747780420210884852166586717636559058152544979471
e = 46731919563265721307105180410302518676676135509737992912625092976849075262192092549323082367518264378630543338219025744820916471913696072050291990620486581719410354385121760761374229374847695148230596005409978383369740305816082770283909611956355972181848077519920922059268376958811713365106925235218265173085
d=wienerAttack(e,n)
print("d=",d)
d=8920758995414587152829426558580025657357328745839747693739591820283538307445
求出d后直接加入原代码中,发现有漏洞 所以不能直接加入,需要优化,在flag那一行的hex(d)改为hex(d).encode()
N = 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241962525705950046253400188884658262496534706438791515071885860897552736656899566915731297225817250639873643376310103992170646906557242832893914902053581087502512787303322747780420210884852166586717636559058152544979471
e = 46731919563265721307105180410302518676676135509737992912625092976849075262192092549323082367518264378630543338219025744820916471913696072050291990620486581719410354385121760761374229374847695148230596005409978383369740305816082770283909611956355972181848077519920922059268376958811713365106925235218265173085
d=8920758995414587152829426558580025657357328745839747693739591820283538307445
import hashlib
flag = "flag{" + hashlib.md5(hex(d).encode()).hexdigest() + "}"
print(flag)
运行后得到#flag{8159e6c4abdd3b94ce461ed9a1a24017},但是是错的,看别人的wp,需要用python2运行,得到flag
buu-RSA2
下载附件,得到题目可以看到是e,n,dp,c
在网上找模板
import gmpy2 as gp
e = 65537
n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113
dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657
c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751
for x in range(1, e):
if(e*dp%x==1):
p=(e*dp-1)//x+1
if(n%p!=0):
continue
q=n//p
phin=(p-1)*(q-1)
d=gp.invert(e, phin)
m=gp.powmod(c, d, n)
if(len(hex(m)[2:])%2==1):
continue
print('--------------')
print(m)
print(hex(m)[2:])
print(bytes.fromhex(hex(m)[2:]))

buu-[AFCTF2018]Morse
点击
附件,如题是摩斯密码,我们用在线工具解密摩斯密码转换器 - 孟坤工具箱网页版就这么简单的提交发现错误,再仔细看看此时的明文,是数字与字母,字母不超f组成,想到了hex的特征,将这个明文转为字符得到了真正的flag字符串HEX转换
花指令
是什么
花指令实质就是一串垃圾指令,主要用于干扰静态分析的难度防止反编译器进行反编译,并不影响程序的正常逻辑,在CTF中花指令的作用主要用于防止静态分析程序,花指令也可以被用在病毒或木马上,通过加入花指令来改变程序的特征码从而躲避杀软的扫描达到免杀的目的,花指令一般被分为两类,可执行花指令与不可执行花指令,不管执不执行都不会影响程序正常运行。
re
nssctf-[GFCTF 2021]wordy【涉及花指令】
附件下载后查得无壳,用ida打开,然后没有在函数窗口并未看到main,所以查看一下其他的。main
函数实际上是被调用的,通过查看start
函数可以发现start函数调用了_libc_start_main
函数,_libc_start_main
里面调用了main
函数。其余部分本题无需考虑。双击后进入main函数,便看到了一个红色的代码,有个jmp,是花指令
,我们需要将花指令剔除,需要用到Pacth功能。可以选择手动更改,先看jmp先前的代码的值patch
改前:改后:
对比即可知道花指令jmp的值是EB,手动更改即是将花指令jmp的每一个的values第一个值改为90
也可以使用IDA python跑脚本
start = 0x1144
end = 0x3100
for i in range(start, end):
if get_wide_byte(i) == 0xEB and get_wide_byte(i + 1) == 0xFF and get_wide_byte(i + 2) == 0xC0:
patch_byte(i, 0x90)
start即是jmp开始的位置 end要找到这jmp的结尾的位置
在脚本无脑 patch 后,发现部分 call 指令出现问题。也就是说有部分 0xeb 是不能被 patch 的。也就是 0xe8 之后四字节内的 0xeb 不能patch。所以我们需要找一下不同,从而限制patch操作,即需要代码中的if条件进行判断。跑成功后看了一大堆的安慰词,终于在最后面看到了flag,改格式:NSSCTF{u_are2wordy}
web
buu-[ACTF2020 新生赛]Upload
看到了没有任何上传的页面,四处划动鼠标,成功点亮灯泡,得以上传的位置
然后我们看一下源代码,用ctrl+U进入,再双击此处
可以得知这个对文件名有限制,所以我们上传后缀为jpg的一句话木马,抓包后改为php,但是不成功改为html,上传成功,再测试蚁剑,显示返回数据为空
在Apache中,以下后缀名都会被服务器解析为PHP文件:
phtml
php
php3
php4
php5
inc
//下面是对上面的大小写混写绕过
pHtml
pHp
pHp3
pHp4
pHp5
iNc
再改为phtml,上传成功再蚁剑测试连接,成功。
然后保存后点击进去在根目录查看到了flag文件找到了flag