吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1901|回复: 2
上一主题 下一主题
收起左侧

[CTF] 【BUUCTF】wdb2018_GUESS题解

[复制链接]
跳转到指定楼层
楼主
iowolf 发表于 2024-12-11 08:49 回帖奖励
本帖最后由 iowolf 于 2024-12-11 11:05 编辑

题目地址

https://buuoj.cn/challenges#wdb2018_guess

解题

  • 查看可执行文件的安全属性,发现其是64位,有canary、NX,无PIE以及GOT可写。
  • 运行程序感受其逻辑结构,发现是个有三次机会的猜标志。放入IDA
    • 在main函数中,可以发现在37行存在一个gets函数,可以利用栈溢出,需要注意程序有canary。分析结构发现,是把创建的flag文件读到了buf中,并存在了栈上。strcmp中的s2也同样在栈上。
    • 在ubuntu16环境下,由于存在金丝雀值,发生栈破坏时,对金丝雀产生了破坏会调用__stack_chk_fail函数,此函数源码如下:
  • 手动输入一个不合法的字符串,可以看到,发生栈溢出是会打印出__libc_argv[0],其含义是程序的全路径。试验发现打印出的是文件的相对路径,如图
  • argv[0]在main函数的栈上,由此可以得到一个整体的思路:通过将libc_argv[0]覆盖为read_got表中内容,此时破坏了canary,将会调用stack_chk_fail,打印出read_got表内容,然后得到libc基址。下面动态调试,找到libc_argv[0]相对于gets函数的偏移
  • 动态调试找到gets函数入口为图示,此为用户输入的字符串,要想构造垃圾字符覆盖栈空间到__libc_argv[0]位置,需要计算偏移,__libc_argv[0]的地址如下
    1. 计算偏移如下
    2. 所以可以编写exp泄露read_got表地址如下
  • 进而计算libc基址,再由此计算出environ表地址。通过相关偏移就可得到所有栈上值的地址

    • 可以得到环境变量地址开头1个字节为\x7f,编写下列代码泄露出栈地址

    • 接下来计算,flag位置与stack地址的偏移,经过动态调试可以得到

    • 偏移为360,编写payload如下
  • 最后运行exp,得到flag

    通过题目

体会

  • 需要掌握一定的系统知识,例如本题中的ubuntu16系统栈溢出调用__stack_chk_fail 函数,以及该函数的特性,会打印相关内容。
  • 如果充分理解以上内容,可以帮助更快反映解题方向:利用程序会fork3次,加上父进程,总共可以打印3次内容(fork部分没有详细提及,具体可以参考其它blog),相当于可以泄露3次相关地址。
  • 还需要更加熟练地掌握gdb动态调试,下合适的断点,找到想要得到的地址。

屏幕截图 2024-12-11 082424.png (49.38 KB, 下载次数: 4)

屏幕截图 2024-12-11 082424.png

运行.png (61.46 KB, 下载次数: 2)

运行.png

免费评分

参与人数 3威望 +1 吾爱币 +22 热心值 +2 收起 理由
爱飞的猫 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
ZbyEMM + 1 热心回复!
jiangche + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
msmvc 发表于 2024-12-13 10:36
论坛高级用户
3#
romoi 发表于 2024-12-31 23:41
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-4-29 10:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表