pwn入门实验–实验二


有个大佬在前领着前行,感谢星耀胡!

实验的原理和目的

利用栈溢出,修改程序ret值,使其返回到我们想让它执行的位置,从而获取flag,这也算是ctf入门级的题目。

实验步骤

·利用IDA看一下汇编语言

pwn入门实验--实验二·作为小白来讲,可能一开始看到这个并没有太多的感觉,我们来看一下源代码。

pwn入门实验--实验二·来看一下运行效果。
pwn入门实验--实验二
·根据实验的原理,如果我们输入的字符串足够长,则会发生栈溢出,我们只要计算好究竟要输入多少字符之后,继续输入才能恰好将ret的值覆盖(这个需要一点关于内存分配的知识)。
· 那我们再仔细用IDA看一下,发现有‘system’函数,确实可以再输入,那么就可以利用栈溢出获取系统权限。
·最后发现了“新大陆”。
pwn入门实验--实验二·终于发现了‘getflag’,进一步就会找到getflag的入口地址。
pwn入门实验--实验二·也就是最后将系统调用后将ret的值设置为0x0804858B,我们就能达到目的了。

计算栈填充数目

·1、稍微简单的方法就是我们输入的时候尽可能地多输入一些,使其溢出报错,报错的时候就会返回我们想要的那个地址,然后在计算一下需要填充的字符个数就可以了。
在这里利用‘cyclic num’语句,生成num个字符,方便输入(当然也可以一直手动输入)
pwn入门实验--实验二·然后‘gdb pwn’调试,用这个生成的字符串作为输入。
pwn入门实验--实验二·运行之后发现报错,溢出的地址也就给你了。
pwn入门实验--实验二·然后再用‘cyclic -l address’语句来自动查询一下所需字符数目。
pwn入门实验--实验二·也就是说,我们只需再编辑一个脚本,先填充112个字符,随后第113个就是getflag的入口地址。
·2、不失一般性,再介绍另外一种方法,就是一步步调试,当运行到需要输入的时候,利用ebp、esp计算一下函数剩余栈的值,也就进一步可以算出需要多少填充字符(ret=ebp+4)。
·加入断点,运行调试。
pwn入门实验--实验二·一步步执行,直到需要输入的时候。
pwn入门实验--实验二·此时看一下寄存器的值。
pwn入门实验--实验二·也就是我们需要计算一下‘ebp-(esp+0x1c)+4’值,结果发现也是112.

编写脚本,获取权限

· 1、知道了所需填充字符的数目,我们可以编写python脚本了。
pwn入门实验--实验二·然后运行获取权限。
pwn入门实验--实验二·但是,这里的flag是事先在本地端编好的,pwn入门实验--实验二·2、我们也可以用远端的方法获取flag
pwn入门实验--实验二·运行脚本,得到flag
pwn入门实验--实验二

实验小结

pwn确实不太容易掌握,只能靠大佬的带领和自己的努力了!!!

相关文章:

  • 2021-06-26
  • 2022-12-23
  • 2021-05-11
  • 2021-11-23
  • 2021-07-03
  • 2021-12-22
  • 2021-08-12
  • 2021-05-19
猜你喜欢
  • 2021-06-14
  • 2021-06-04
  • 2021-06-29
  • 2021-12-17
  • 2021-07-22
  • 2022-02-24
  • 2021-05-10
相关资源
相似解决方案