pwnable.tw刷题笔记2

dubblesort


能从这道题学到的小技巧还是很多的。

首先是一种leak栈信息的办法,read没有在读入数据之后做处理,所以可以让字符串不以‘\x00’结尾,之后用”%s”打印的时候就可以打印出栈上的信息。

经过动态调试可以发现,栈上有一个libc的地址,打印出来之后就可以算出system和/bin/sh的地址。当然还要注意一点是这个程序是会将栈上的数值进行排序,所以注意一样输入数值的大小顺序即可。

exp想了想还是不留了。

hacknote


这道题看起来是一道很简单的uaf,然而做着做着发现了问题,这个程序里面用来打印note的函数有点奇怪:

note[i]->printer(note[i])

而这个printer里面大概是:

puts(&note[i]+4)

对,没错,没有办法直接方便的复写这个printer的地址为system。

之后我卡了很久,第一步肯定非常简单,直接覆盖buffer的地址为got表上的地址,这样就可以通过leak的函数地址算出system的地址。

最后快要绝望的时候,我看到了一个小技巧:

用”;”可以隔断system的输入

于是,只要把buffer的位置写成”;sh;”,就可以拿到shell了。

难受。。。。。。。

Silver Bullet


这道题找到漏洞之后思路就不难了。

首先是那个strncat函数,在查阅了资料之后发现了很重要的一点:

strncat()会将dest字符串最后的’\0’覆盖掉,字符追加完成后,再追加’\0’。

对,就是这个字符串结尾的字符0,刚好可以覆盖掉size的低位,使size置0。

于是就可以利用这一点再次读取数据,造成溢出。

main函数在打败敌人之后才会正常返回,所以需要先找到打败敌人的方法,用16进制查看很容易发现敌人的hp+1之后就会变成一个负数,所以只要之后的读入中吧size所在的地方覆盖成一个负数即可。

第一次溢出的时候先用puts leak出got表的信息,再返回到main函数再次溢出,就可以很容易的拿到shell。

(没有放exp字数好少)

发表评论

电子邮件地址不会被公开。 必填项已用*标注