第一次实训PWNwp
这次三道题目都挺简单的
一、送分
直接拖IDA
程序很简单,只要把v5的值覆盖为100即可得到flag。
exp:
1 | from pwn import * |
二、rop1
首先查看程序保护机制:
仅仅NX是开启的。
直接拖IDA
程序逻辑很清楚,如果v5=2并且v6=1的话,那么就可以到达gets()函数,即程序漏洞处,之后就可以进行栈溢出。
v5是自己输入的值,v6是sub_401162的返回值。进入函数sub_401162()
发现该函数是为了向bss段里的某个变量赋值。如果赋值恰好都能验证通过,使v2=10,那么返回值就是1.(实际上加这一步仅仅是为了不让题目看起来太简单,实际还是没有新生赛pwn3有难度)
之后发现程序中没有system函数,需要使用Libcsearcher来进行库查找匹配。
所以exp为:
1 | from pwn import * |
三、canary
首先查看保护机制:
之后拖IDA打开:
发现输入为1的话是可以往buf里输入0x100个字节的数据,存在溢出。
如果输入为2的话可以打印buf中的数据,遇0截止。
但是不可能直接进行溢出利用的,因为canary机制存在:
1 | 64位的canary机制,会在函数头部添加: |
canary的值是存在于[rbp-0x8]处,所以如果canary的值被修改了,就会导致程序崩溃。
所以需要先泄露canary的值。
buf与rbp距离为0x50,所以可以填入0x49个数据,把canary的值泄露,因为最后一位的\x00是为了截断某些打印函数而设置的,防止canary被打印,所以也需要覆盖。
调用2,再调用1即可。
exp:
1 | from pwn import * |
- 本文作者: 李小混
- 本文链接: https://lixiaohun.github.io/post/0.html
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!