R()P DASCTF十月赛pwn R()P题解

本文详细介绍了R()P DASCTF十月赛pwn题目解题过程,涉及ida分析、栈溢出、系统安全以及SROP技术。在程序中,由于没有可用的gadget和libc地址泄露,作者通过观察发现read函数内部包含syscall指令,通过调整rsi并控制got表,实现了对read函数的劫持,从而触发特定的syscall执行/bin/sh,进一步利用execve系统调用实现目标。解题过程中,作者强调了动态调试和理解程序执行流程的重要性。
摘要由CSDN通过智能技术生成

最近对pwn上头了,找点题做做

拖入ida

在这里插入图片描述
这里第一次判断只允许输入小于0x100的数字,作为第二次输入的长度

第二次明显存在栈溢出
但是程序中并没有好用的gadget,没有csu函数
没有write函数泄露libc地址,

观察程序,发现eax,edx,rsi可控,eax可控可以想到用SROP
但是程序中并没有syscall语句

思路打开

看了其他师傅的文章,知道了read函数中向下不定几个字节,有syscall语句
如下图。根据libc不同,偏移不同,实际做题时,只需要爆破一个字节。
在这里插入图片描述
rsi可控,可以调用read函数劫持read的got表,使其指向syscall的地址,根据上图,可以知道最后一个字节应该填充4c,别忘了是小端序存储数据,也就是只用发送一个字节的数据就可以覆盖源地址的40到4c。

我的思路是可以利用srop将栈地址迁移到bss段,然后输入/bin/sh
再调用execve系统中断。 解法不只这一种。
因为第一次栈溢出只可输入0x100个字节,不够传输SigreturnFrame。所以我们先构造一个可以任意输入长度的read函数,然后再进行got劫持等后面的操作。

以下所有的栈中具体参数偏移的位置都是动态调试中得来的。

from pwn import *
name='/home/kali/pwnDASCTF十月赛R()P'
elf = ELF(name)
if args['REMOTE']:
    p = remote('127.0.0.1', 7777)
else:
    #p = gdb.debug(name,"break main")
    p = process(name)
print("raed got addr= "+
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值