文章目录


前言

ROPgadget是一种基于代码复用的一种攻击技术。

一、ROP的使用(其中一种)

我们做pwn的时候,一般我们的目标是找到system函数和“/bin/sh”字符串,但是基本上pwn题是不会让你这么简单就解决了,他会隐藏system函数,和/bin/sh字符串,此时我们就要用到ROP方法。

ROPgadget --binary rop  --only 'pop|ret'
//单引号中间的是你要找的ropgadget的种类。
//rop是你要找的存有你需要的ropgadget的文件。

 

桌面$ ROPgadget --binary ret2libc3  --only 'pop|ret'
Gadgets information
============================================================
0x080486cf : pop ebp ; ret
0x080486cc : pop ebx ; pop esi ; pop edi ; pop ebp ; ret
0x08048399 : pop ebx ; ret
0x080486ce : pop edi ; pop ebp ; ret
0x080486cd : pop esi ; pop edi ; pop ebp ; ret
0x080481a1 : ret
0x080484ae : ret 0xeac1

Unique gadgets found: 7

 这就是我们使用ROP命令找到的gadget,当我们没有system并且我们没有对方网站的libc,我们可以使用execeve("/bin/sh",0,0)函数,用此函数时必须要让eax寄存器的值为0xb(该函数的编号)

payload(垃圾数据+p32(pop_eax_ret地址)+p32(0xb),p32(pop_ebx_ret地址)+p32("/bin/sh"地址)+p32(pop_ecx_edx_ret地址)+p32(0)+p32(0))

二、平衡栈帧

有时我们使用ROP时候需要考虑到平衡栈帧,因为栈是有限的,有的时候我们不仅仅是使用一两次ROP当使用两次以上ROP是我们必须要平衡栈帧。我们从最简单的例子入手(这是我自己假设的例子)。

buf1和buf2分别是gets和system的参数,如果我们直接这么构造payload那么这两个参数无法被清理那么我们就要使用pop函数来清理,我们可以这么改写。

 gets会被之前的执行溢出的函数retn掉,gets自己的retn返回到pop,pop_ebx将buf1放入寄存器ebx中,然后retn到system,后面的过程以此类推,使buf1,buf2,以及两个函数的数据都移出出栈,不占用栈的空间。(这里暂时讲一点,具体的以后再说。)

 


总结

pwn并不像我们想象的那么简单,并不是所有题都给你system函数以及/bin/sh字符串,我们必须要灵活运用他给我们的文件中做包含的函数,数据来构造。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐