[HNCTF 2022 WEEK3]smash
知识点:
Stack smash
准备
64 位,开了 NX
和 canary
保护
分析
main函数
1 | int __fastcall main(int argc, const char **argv, const char **envp) |
这里会把 flag
输入到 buf
处
然后有 gets
函数,所以存在缓冲区溢出
思路
这题开了 canary
保护,有溢出点,没其他信息,所以可以想到 Stack smash
花式栈溢出技巧的一种,利用栈溢出覆盖 argv[0]
为我们想要输出的字符串的地址,得到 flag
( stack smash
技巧则就是利用打印这一信息的程序来得到我们想要的内容。这是因为在程序启动 canary
保护之后,如果发现 canary
被修改的话,程序就会执行 __stack_chk_fail
函数来打印 argv[0]
指针所指向的字符串,正常情况下,这个指针指向了程序名)
先去 ida
中查看 buf
地址
得到 buf
地址为 0x404060
这里受 libc
版本影响,偏移量会有区别
我这里改了 libc
后,无法直接定位 argv[0]
,所以先看没改的 gdb
调试,主要是确定 argv[0]
的位置
在 gets
处下断点,然后运行,看栈情况
得到了 argv[0]
在栈上的位置
改 libc
版本后,同样的步骤后,查看栈情况
得到偏移量为 0x1f8
最后直接构造 ROP
链
1 | buf=0x404060 |
脚本
1 | from pwn import * |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Raider-XL!
评论