首页
社区
课程
招聘
[原创]迅速入门64位栈沙盒ORW
发表于: 2021-5-13 17:32 14462

[原创]迅速入门64位栈沙盒ORW

2021-5-13 17:32
14462

例题buu 极客大挑战 NOT BAD

什么是orw?

所谓orw就是open read write 打开flag 写入flag 输出flag

什么是seccomp?

seccomp: seccomp是一种内核中的安全机制,正常情况下,程序可以使用所有的syscall,这是不安全的,比如程序劫持程序流后通过execve的syscall来getshell。所以可以通过seccomp_init、seccomp_rule_add、seccomp_load配合 或者prctl来ban掉一些系统调用.

大概思路 这种题都会mmap一段内存在栈上

关于mmap如下

我们先用read让可以利用的变量结合上汇编语言跳转到mmap的地方

然后去写入我们的orw 就可以得到flag了QWQ

直冲漏洞函数

很显然可以溢出0x10,但是无论是栈迁移还是泄露libc都是不可能的太小了

但是我们可以去进行orw,先进行沙箱检测

很好orw权限都开了没问题

先上exp,然后细说

sh1非常好理解就是,开头40个\x00就是单纯的填充到ebp,然后利用shellcraft函数去利用read函数进行mmap的跳转

跳转用的汇编就是后面asm里的汇编语言

asm("sub rsp,0x30;jmp rsp")为什么是0x30?

因为rsp-0x30就是buf,咋看的?来看ida

buf距离end of stack variables共计0x30

ok继续看,为什么是jmp rsp?

如果直接栈溢出,想要一溢出就执行shellcode是不可行的。要么使用call,要么使用像这里的jmp rsp,要么把shellcode的起始地址写到溢出的位置。

我们还要跳转到rsp指针去让他执行里面内容才可以

接着看关键的sh3构造orw

打开open flag这个没什么好说的

然后read这里必须好好讲讲

mmap_place地址多少?一般程序有注释,也可以gdb vmmap

vmmap如下,这段空间大小0x1000,也就是说read里面读取到哪里都无所谓反正mmap_place+x<=max_place就可以,后面那个0x100是读取大小

划重点!!!!!read()函数第一个变量 fd 是文件描述符

write也是一样的第一个参数

如下图我们可以知道对于文件描述符0-2都是保留的用于缓冲区

我们第一个打开文件的文件描述符必定是3

第二个是4

以此类推

改日有空再上堆的ORW

 
 
 
 
 
 
 
 
 
 
 
int sub_400A16()
{
  char buf[32]; // [rsp+0h] [rbp-20h] BYREF
 
  puts("Easy shellcode, have fun!");
  read(0, buf, 0x38uLL);
  return puts("Baddd! Focu5 me! Baddd! Baddd!");
}
int sub_400A16()
{
  char buf[32]; // [rsp+0h] [rbp-20h] BYREF
 
  puts("Easy shellcode, have fun!");
  read(0, buf, 0x38uLL);
  return puts("Baddd! Focu5 me! Baddd! Baddd!");
}
q@ubuntu:~$ seccomp-tools dump ./not
 line  CODE  JT   JF      K
=================================
 0000: 0x20 0x00 0x00 0x00000004  A = arch
 0001: 0x15 0x00 0x08 0xc000003e  if (A != ARCH_X86_64) goto 0010
 0002: 0x20 0x00 0x00 0x00000000  A = sys_number
 0003: 0x35 0x00 0x01 0x40000000  if (A < 0x40000000) goto 0005
 0004: 0x15 0x00 0x05 0xffffffff  if (A != 0xffffffff) goto 0010
 0005: 0x15 0x03 0x00 0x00000000  if (A == read) goto 0009
 0006: 0x15 0x02 0x00 0x00000001  if (A == write) goto 0009
 0007: 0x15 0x01 0x00 0x00000002  if (A == open) goto 0009
 0008: 0x15 0x00 0x01 0x0000003c  if (A != exit) goto 0010
 0009: 0x06 0x00 0x00 0x7fff0000  return ALLOW
 0010: 0x06 0x00 0x00 0x00000000  return KILL
q@ubuntu:~$ seccomp-tools dump ./not
 line  CODE  JT   JF      K
=================================
 0000: 0x20 0x00 0x00 0x00000004  A = arch
 0001: 0x15 0x00 0x08 0xc000003e  if (A != ARCH_X86_64) goto 0010
 0002: 0x20 0x00 0x00 0x00000000  A = sys_number
 0003: 0x35 0x00 0x01 0x40000000  if (A < 0x40000000) goto 0005
 0004: 0x15 0x00 0x05 0xffffffff  if (A != 0xffffffff) goto 0010
 0005: 0x15 0x03 0x00 0x00000000  if (A == read) goto 0009
 0006: 0x15 0x02 0x00 0x00000001  if (A == write) goto 0009
 0007: 0x15 0x01 0x00 0x00000002  if (A == open) goto 0009
 0008: 0x15 0x00 0x01 0x0000003c  if (A != exit) goto 0010
 0009: 0x06 0x00 0x00 0x7fff0000  return ALLOW

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2021-5-13 17:52 被H.R.P编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (1)
雪    币: 4168
活跃值: (15932)
能力值: ( LV9,RANK:710 )
在线值:
发帖
回帖
粉丝
2
支持
2021-5-16 19:44
1
游客
登录 | 注册 方可回帖
返回
//