type
status
date
slug
summary
tags
category
icon
password
前几天打比赛的时候做的第一道题就是要用到SROP的手法的题目,结果当时由于长期没有接触这种手法导致在比赛的时候一直不知道要怎么解,之后后面结束了看其他师傅的wp才想起来还有SROP这种手法。也是当时在学的时候没好好学懂这种手法,当时学的一知半解的就过了,导致这次的没做出来,这是应该反思的问题。
正好趁现在就拿这道题来好好写一写这种手法的利用。这个手法的具体原因不做详细解释(我也是不是很懂,这里具体讲一下这个手法的利用。)
如果要看这个的可以去网上看具体过程
SROP - CTF Wiki
CTF Wiki
https://ctf-wiki.org/pwn/linux/user-mode/stackoverflow/x86/advanced-rop/srop/
这种攻击手法目前我学到是基于栈溢出之后的,简单的过程就是在栈溢出之后使程序先执行
sigreturn
然后在执行Signal Frame
,就可以直接拿到shell。并且程序中的
Signal Frame
这个在pwntools中已经有集成的环境,可以直接使用。我们要做的就是使程序执行
sigreturn
然后直接输入Signal Frame
就行。我们先来讲一讲
sigreturn
这个的执行构成。一般情况下来说在程序中是不会有这个的,但我们可以通过修改rax寄存器的值然后执行syscall从而达到执行sigreturn
的目的。就是直接执行这个函数的系统调用,这个的调用要保证的就是rax这个寄存器的值为0xf然后执行syscall就可以了。
修改rax的办法有很多种,如果程序中有pop_rax_ret这个指令,那直接用这个修改rax的值为0xf最好不过,如果在程序中没有,就要看能不能构造一个了,下面要当例题讲的就是一道要通过构造才能使rax为0xf的题。
在修改之后直接执行syscall就可以,这里就要保证在程序中必须要有syscall的地址,这是很重要的,包括下面的操作中也要用到这个东西。其他的寄存器的值可以不用管了,只要保证rax的值为0xf然后执行syscall就行。
关于
Signal Frame
这个有个可以直接拿到shell的模版其中要注意的就是我们一定要知道
/bin/sh
的存放地址和syscall的地址,然后就可以直接构造出这个脚本。然后直接把这个发过去就行。
上面那个模板适用于直接拿到shell的情况下,如果在程序中不能直接拿到shell,如有沙箱保护等,也可以修改寄存器的值从而达到其他目的。
然后就来简单的看下这道题
没有任何的保护,同时程序也是很简单的存在。就这两个函数,一个用于输出
Hello Pwn
宁一个输入内容,由于这里的栈的特殊,会导致程序直接返回到我们输入的内容。这里由于这个程序就只有这几个过程,没有其他的函数等等,我们遇到这种就要像是不是能用SROP的手法。如果看现在的伪c并不能看出什么就要简单看一下汇编
很明显这里的函数调用都是通过syscall实现的系统调用。那我们就知道syscall的地址,然后再看看能不能找到
/bin/sh
,好现在我们已经知道syscall和/bin/sh的地址,对于进行SROP,就只差如果修改rax的值为0xf然后执行syscall了。
再看看有没有其他的地方指令供我们使用,
只找到与rax有关的3个命令,这3个分别简单讲一下
这一个的用途在于把rax的值消除,改为0
这个看起来比较复杂,但执行之后其实就是把rax的值加1
这个的结果是吧rax的值乘2
现在我们有的命令分别是把rax清0,把rax+1和rax*2,并且这3个都有ret可以连在一起用。
于是我们就可以简单连出一个过程,
- 先把rax的值清零,得0
- 在把rax的值加1,得1
- 在把rax的值乘2,得2
- 在把rax的值加1,得3
- 在把rax的值乘2,得6
- 在把rax的值加1,得7
- 在把rax的值乘2,得0xe
- 在把rax的值加1,得0xf
然后执行syscall就可以达到我们的目的
就这样,然后直接按上面的模板就行
exp
这道题是个第一题,很简单的,但是当时没有做出来,这是需要反思的问题。借助这道题把这种做法学了一遍,也算有所收获吧。
- 作者:wgiegie
- 链接:https://tangly1024.com/article/10a3ecc9-5160-8023-8f2a-da5ea9e9aeb1
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。