zoukankan      html  css  js  c++  java
  • 基础学习ret2text

    这算是最简单的入门教学题目了。看网上的博客和视频讲解的原理,感觉挺简单的,但是实际自己动手去做的时候还是有一些问题出现,在这里记录一下。

     首先打开IDA,找到main函数,和存在漏洞的vulnerable函数。这里的注释意思是,用户数据在栈的ebp-0x10的位置开始存放。

    然后我就用gdb动态调试一下,想看看具体发生了哪些事情。

    一开始是不能打开的,提示没有权限,然后用chmod 777更改一下就可以了。

    用gdb打开之后,b main在main函数处下断点,然后run。

    我在用si ni想逐句读一下是怎么工作的,然后就被栈里的esp和ebp给绕晕了。

     

    我的问题是发生在valnerable函数中的gets,当我ni之后,观察栈发现,esp和ebp相差很多,而且也并不是IDA中显示的距离esp+8的位置来存放输入数据的。

    后来又想了想,如果再执行完后面两条语句就符合了。究其原因就是这里gets函数是cdcall约定(清理栈的工作交给调用函数来处理),所以当gets返回后需要清理栈,这才是一个完整的过程。

     再一个不明白的就是这个get_pc_thunk_ax函数,查询得到,调用这个函数后,将会得到下一行的指令地址并放到EAX中。

     ni后,确实如此。但是对这个函数到底有什么用,还是不明白。

    然后我想到,gdb中有n和s(区别于ni和si),它是按照源代码执行一条语句来调试的。

     当我用n和s调试时,发现,会直接跳过0x80484f6--0x8048502的这些语句,也就是说明这6行汇编指令对应的是源代码中的一行代码。

     

    接着看IDA可知,也许跳过的这些汇编,就是char buffer[8]这行语句。

  • 相关阅读:
    第四节 pandas 数据加载
    第五节 matplotlib库
    第二节 pandas 基础知识
    第一节 anaconda+jupyter+numpy简单使用
    枚举效率测试 --简单计算题
    Tree 树形结构
    django url分发,视图,模板回顾
    django自定义分页器
    转git的使用
    转Git配置SSH,并Push到GitHub上的相关流程
  • 原文地址:https://www.cnblogs.com/sweetbaby/p/14076581.html
Copyright © 2011-2022 走看看