buuctf:ciscn_s_3题解

本文详细解析了buuctf比赛中ciscn_s_3挑战的解决过程,涉及64位系统调用、栈溢出漏洞的寻找与利用。通过分析程序,发现栈溢出并利用系统调用实现shell获取。文章介绍了如何寻找gadget,构造payload以执行特定系统调用,并讨论了在找不到相应gadget时的应对策略。
摘要由CSDN通过智能技术生成

title: 系统调用的学习
date: 2021-05-25 22:00:00
tags:

  • binary security
  • study report
  • syscall
    comments: true
    categories:
  • ctf
  • pwn

today新的知识又增长了,发现了getshell的另一种方式:syscallsrop。故事还要源于…(此处省略万字输出)

(note:本作者这次有点懒,没有写AT&T汇编,而是一律用了intel汇编,请悉知)

可能是之前汇编基础不太好吧,竟没有发现syscall这么好用的指令,只要再把/bin/sh传参就能直接打开一个shell,真是妙蛙。但是在系统调用之前要做很多的事情,诸如各类参数传递,以64位的来说,我们要先知道我们要执行的函数系统调用号为59。我也是翻过libc库的,发现system函数实现里面有一段竟然是直接执行execve("/bin/sh")

syscall_1.png

实属意外了,这是在我有次反汇编libc库的时候发现的,我原来一直是只用system函数getshell的,没想到system内部是通过这样的系统调用来打开shell的。

那这得学啊,这是基础的基础啊。

这边给出一下64位Linux的各个系统调用号,这个在Linux的/usr/include/asm/unistd.h下有,我这里截取部分。


#ifndef _ASM_X86_UNISTD_64_H
#define _ASM_X86_UNISTD_64_H 1

#define __NR_read 0
#define __NR_write 1
#define __NR_open 2
#define __NR_close 3
#define __NR_stat 4
#define __NR_fstat 5
#define __NR_lstat 6
#define __NR_poll 7
#define __NR_lseek 8
#define __NR_mmap 9
#define __NR_mprotect 10
#define __NR_munmap 11
#define __NR_brk 12
#define __NR_rt_sigaction 13
#define __NR_rt_sigprocmask 14
#define __NR_rt_sigreturn 15
#define __NR_ioctl 16
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xi@0ji233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值