实验目的
这次的实验的前提的我们不知道system和bin/sh的函数,然后通过泄露某个函数在libc表中的地址,再加上这几个函数的偏移量来计算system和bin/sh的地址,最后将这个地址覆盖到ret上,以便能跳至我们想要的函数,最终获得shellcode
我们还是以pwn举例
实验文件
链接:https://pan.baidu.com/s/1vgQo4W3P2xEMfdnfwMiaSg
提取码:jgq5
实验步骤
1、先对pwn进行静态分析,找出可以泄露的函数点在哪?
在这里,我认为有两个函数可以泄露:puts和setvbuf。在这里,我选择puts函数进行泄露。
2、动态调试
main的值是通过ida中的静态分析得出的
这里主要讲一下payload是怎么得出来的?
‘a’*112中的112是通过计算得出的需要覆盖ret而需要填充的字符数(这个在上个实验已经介绍过如何得到),‘a’是需要填充的字符(a也可以换成其他的字母)。
后面的是需要泄露的puts函数在libc表中的地址,而这个地址是函数在plt表和got表的地址同时组成。plt表是内部函数表,got表为全局函数表,这两个表相互对应。
pwnlib.gdb.attach函数是连接VScode和gdb动态调试的。
通过sendline函数将payload发送出去。
将泄露出的puts的地址接收并打印出来,并通过puts得到libc的基址。
通过偏移量计算出system和bin/sh的地址,并将其泄露出来。
程序第二次执行main函数,需要重新计算payload,该计算方法与上一个一样。
最后getshell
随便输入个指令看看是否getshell