wpsecCTFpwn 0x1

      一道简单的pwn题,对于我来说是第一道。


wpsecCTFpwn 0x1_第1张图片
题目

    题目提示便是溢出,那么先说下溢出的概念。

      在百度上的解释是溢出是黑客利用操作系统的漏洞,专门开发了一种程序,加相应的参数运行后,就可以得到你电脑具有管理员资格的控制权,你在你自己电脑上能够运行的东西他可以全部做到,等于你的电脑就是他的了。溢出是程序设计者设计时的不足所带来的错误。

    首先介绍下栈帧:就是利用EBP寄存器访问栈内局部变量,参数,函数返回地址等的手段,在栈中esp始终指向栈顶指针,而EBP寄存器则就是栈帧指针。因为栈中的数据写入时,栈便会被抬高ESP便会始终跟着栈来移动。所以根据ESP的值的变化来写程序会很困难。所以在程序开始的时候,先把ESP值保存入EBP写在栈中,这样ESP值无论怎么变化,根据它的值便会安全访问对应函数的各个模块的位置。

对应的汇编代码:PUSH EBP  ;函数开始(使用EBP前先把已有值保存到栈中)

                MOV EBP,ESP

                ....

                 MOV ESP,EBP ;将函数的起始地址返回到ESP中

                 POP EBP     ;函数返回前弹出保存在栈中的EBP值

                 RETN        ;终止

(最后的retn实际上等于pop eip    jump这两条指令)

     当不对输入的长度进行判断时,便会将ebp覆盖,那么在退出时函数的指针便会指向其他模块。如果知道函数的对应地址,便可以执行一些插入的脚本。

  这便是栈的溢出,其他堆,ebp,eip的溢出这些目前我还应付不来。

题目做的方法:

 首先下载下来使用文本打开发现是elf二进制文件

    1.放入ida中f5反编译,跟进主函数找到func函数。查看该函数之后发现gets();给s赋值


wpsecCTFpwn 0x1_第2张图片
 func函数

         双击查看对应变量s;v3;发现距离栈底分别为[ebp-2c],[ebp+8]

        那么我们便可以利用gets()函数的任意长度写入,覆盖掉v3。当函数执行到if语句是,让a1中所储存的值为0xcafebabe,那么程序直接便会直接执文件。

      把文件拖入linux(ubuntu),首先获得文件权限:chmod u+x sd(原文件名太长,改为sd)。

     根据提示的nc:

那么我们便可以远程写入:(python -c "print" '0'*52+'xbe\xba\xfe\xca')| nc 143.248.249.64 9000     (注意小端序)

  ls查看目录,发现flag之后显示出flag为:daddy, I just pwned a buFFer :)

  在加了wpsec{}提交发现报错。。。。。然后等了半天发现那括号里面有一句MD5

的32位小写,然后加密之后提交正确。



明天加上使用gdb的分析。

你可能感兴趣的:(wpsecCTFpwn 0x1)