1.
以上是程序的反编译代码和保护机制。我们可以看出他开了canary保护。我们运行一下程序,发现只要输入一定数额的字符,其可以保持正常功能。
2.canary总是保存在bp的上面,意是我们虽然开辟了48字节的空间,但真正能写的只有40字节。最近遇到一个pwn大佬,跟着他学到了很多gdb调试的技巧,我想把它结合这个题目记录下来。
3.
我们可以在代码中加入gdb.attach(io,’’),让程序停在某个特定的位置并吊出一个本次运行的 gdb界面。一般让他停在send之前,然后查看各个数据,因为很多程序是开了ASLR,导致地址在每次运行都会发生变化。我们在运行exp的时候,在后面加上大写的DEBUG,可以看到我们发送的东西和程序收到的东西,结合吊出来的gdb界面查的内容,我们可以检查我们发送到程序的数据是否是我们想要发送的。
4.
这里的1是程序的加载地址,当程序开了PIE以后程序的加载地址始终在变化,但是在gdb中,gdb是默认将PIE关掉了的,所以每次用vmmap或piebase来查看都是不变的,此时在IDA中解析出来的是相对ELF文件头(也就是1)的相对地址。当程序关了PIE以后,
IDA解析出来的是绝对地址。且不管是开PIE还是没开,在gdb中用 p 打印出来的函数都是真实地址。