CSAPP attack实验
今天有点精力,想着下午就来干attack这个算了(因为有了ddl
从下午差不多3点开始看题目文档,百无聊赖的随便翻翻
看到最后直接上手level1,先干一个再慢慢看
因为是第一个,意外的比较顺利,15:34拿下第一个
第二个遇到点困难,顾不得其他,干了一个半小时弄完 17:05
后面就没什么问题了,第三个17:41,面包鸡蛋晚饭
第四个20:59,第五个22:13
一边听鬼畜一边解题,很上头,孩子体验很好,下次还来
level1:
第一个基本课本例题:栈上预留了40个字节给gets,超出就覆盖了
调用者栈帧中的返回地址,前40个字节随便填点啥,最后三个字节
填touch1返回地址低位就行(毕竟.text段
level2
第二个要求改返回地址的同时传一个参数
传参得改到%rdi,所以需要注入代码
一开始以为注入代码是在gdb找段空白直接赋值,然后ret到那里
然后反应过来是在字符串
前三个没有栈随机化,stack也可以执行,比现实情况容易太多
把注入的代码转换后填到字符串,返回地址填栈上字符串的地址就行
一开始因为搞错返回地址折腾了半天,最后从Gets的%rdi里调出来了,多花至少半小时
level3
第三个还是传参数,传char *
好说,同样放到栈上就行了,注入代码往后放一放
一开始的时候调试进去hmatch还是好好的
从random出来就没了,调了半天应该是放的太靠后被后来函数的栈帧覆盖了
level4-5
后面这两个,其实思路清楚弄起来不是很难
麻烦就麻烦在把gadget farm里的小玩意都整理清楚
然后就像拼图一样顺理成章了
整理gadget farm少说用了我两个小时
弄到一半想写个自动化程序又作罢
只能用返回,%rsp的值基本上一直是增加的
所以实际的部分大多写在溢出后,一个返回地址接一个返回地址
中间有一两个参数
最后转到touch2 touch3,完事
level4用了两个gadget
level5用了八个gadget,其中两个重复
和文档上提示的差不多
level5串的多,是一步一步调的
中间有个小插曲
由于担心字符串放的和injection code太近被函数栈帧覆盖,
往后退了几十个字节
最后没有问题,而且hmatch里的栈帧%rsp还要更大
大概没有问题
不是不想放前面
gadget只有%e开头的让人很难办