主页> seo教程> 【北京seo实战】一步一步学ROP之gadgets和2free篇 蒸米

【北京seo实战】一步一步学ROP之gadgets和2free篇 蒸米

北京seo 2021-02-22 10:58 seo教程 157次

ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术,可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)。上次我们主要讨论了linux_x64的ROP攻击。

一步一步学ROP之linux_x86篇

一步一步学ROP之linux_x64篇

在这次的教程中我们会带来通用gadgets和堆漏洞利用的技巧,欢迎大家继续学习。

另外文中涉及代码可在我的github下载:https://github.com/zhengmin1989/ROP_STEP_BY_STEP

0x01 通用 gadgets part2

上次讲到了__libc_csu_init()的一条万能gadgets,其实不光__libc_csu_init()里的代码可以利用,默认gcc还会有如下自动编译进去的函数可以用来查找gadgets。

_init _start call_gmon_start deregister_tm_clones register_tm_clones __do_global_dtors_aux frame_dummy __libc_csu_init __libc_csu_fini _fini

除此之外在程序执行的过程中,CPU只会关注于PC指针的地址,并不会关注是否执行了编程者想要达到的效果。因此,通过控制PC跳转到某些经过稍微偏移过的地址会得到意想不到的效果。

比如说说我们反编译一下__libc_csu_init()这个函数的尾部:

gdb-peda$ disas __libc_csu_init Dump of assembler code for function __libc_csu_init: …… 0x0000000000400606 <+102>: movrbx,QWORD PTR [rsp+0x8] 0x000000000040060b <+107>: movrbp,QWORD PTR [rsp+0x10] 0x0000000000400610 <+112>: mov r12,QWORD PTR [rsp+0x18] 0x0000000000400615 <+117>: mov r13,QWORD PTR [rsp+0x20] 0x000000000040061a <+122>: mov r14,QWORD PTR [rsp+0x28] 0x000000000040061f <+127>: mov r15,QWORD PTR [rsp+0x30] 0x0000000000400624 <+132>: add rsp,0x38 0x0000000000400628 <+136>: ret

可以发现我们可以通过rsp控制r12-r15的值,但我们知道x64下常用的参数寄存器是rdi和rsi,控制r12-r15并没有什么太大的用处。不要慌,虽然原程序本身用是为了控制r14和r15寄存器的值。如下面的反编译所示:

gdb-peda$ x/5i 0x000000000040061a 0x40061a <__libc_csu_init+122>: mov r14,QWORD PTR [rsp+0x28] 0x40061f <__libc_csu_init+127>: mov r15,QWORD PTR [rsp+0x30] 0x400624 <__libc_csu_init+132>: add rsp,0x38 0x400628 <__libc_csu_init+136>: ret

但是我们如果简单的对pc做个位移再反编译,我们就会发现esi和edi的值可以被我们控制了!如下面的反编译所示:

gdb-peda$ x/5i 0x000000000040061b 0x40061b <__libc_csu_init+123>: movesi,DWORD PTR [rsp+0x28] 0x40061f <__libc_csu_init+127>: mov r15,QWORD PTR [rsp+0x30] 0x400624 <__libc_csu_init+132>: add rsp,0x38 0x400628 <__libc_csu_init+136>: ret 0x400629: nop DWORD PTR [rax+0x0] gdb-peda$ x/5i 0x0000000000400620 0x400620 <__libc_csu_init+128>: movedi,DWORD PTR [rsp+0x30] 0x400624 <__libc_csu_init+132>: add rsp,0x38 0x400628 <__libc_csu_init+136>: ret 0x400629: nop DWORD PTR [rax+0x0] 0x400630 <__libc_csu_fini>: repz ret

虽然edi和esi只能控制低32位的数值,但已经可以满足我们的很多的rop需求了。

除了程序默认编译进去的函数,如果我们能得到libc.so或者其他库在内存中的地址,就可以获得到大量的可用的gadgets。比如上一篇文章中提到的通用gadget只能控制三个参数寄存器的值并且某些值只能控制32位,如果我们想要控制多个参数寄存器的值的话只能去寻找其他的gadgets了。这里就介绍一个_dl_runtime_resolve()中的gadget,通过这个gadget可以控制六个64位参数寄存器的值,当我们使用参数比较多的函数的时候(比如mmap和mprotect)就可以派上用场了。

我们把_dl_runtime_resolve反编译可以得到:

0x7ffff7def200 <_dl_runtime_resolve>: sub rsp,0x38 0x7ffff7def204 <_dl_runtime_resolve+4>: mov QWORD PTR [rsp],rax 0x7ffff7def208 <_dl_runtime_resolve+8>: mov QWORD PTR [rsp+0x8],rcx 0x7ffff7def20d <_dl_runtime_resolve+13>: mov QWORD PTR [rsp+0x10],rdx 0x7ffff7def212 <_dl_runtime_resolve+18>: mov QWORD PTR [rsp+0x18],rsi 0x7ffff7def217 <_dl_runtime_resolve+23>: mov QWORD PTR [rsp+0x20],rdi 0x7ffff7def21c <_dl_runtime_resolve+28>: mov QWORD PTR [rsp+0x28],r8 0x7ffff7def221 <_dl_runtime_resolve+33>: mov QWORD PTR [rsp+0x30],r9 0x7ffff7def226 <_dl_runtime_resolve+38>: movrsi,QWORD PTR [rsp+0x40] 0x7ffff7def22b <_dl_runtime_resolve+43>: movrdi,QWORD PTR [rsp+0x38] 0x7ffff7def230 <_dl_runtime_resolve+48>: call 0x7ffff7de8680 <_dl_fixup> 0x7ffff7def235 <_dl_runtime_resolve+53>: mov r11,rax 0x7ffff7def238 <_dl_runtime_resolve+56>: mov r9,QWORD PTR [rsp+0x30] 0x7ffff7def23d <_dl_runtime_resolve+61>: mov r8,QWORD PTR [rsp+0x28] 0x7ffff7def242 <_dl_runtime_resolve+66>: movrdi,QWORD PTR [rsp+0x20] 0x7ffff7def247 <_dl_runtime_resolve+71>: movrsi,QWORD PTR [rsp+0x18] 0x7ffff7def24c <_dl_runtime_resolve+76>: movrdx,QWORD PTR [rsp+0x10] 0x7ffff7def251 <_dl_runtime_resolve+81>: movrcx,QWORD PTR [rsp+0x8] 0x7ffff7def256 <_dl_runtime_resolve+86>: movrax,QWORD PTR [rsp] 0x7ffff7def25a <_dl_runtime_resolve+90>: add rsp,0x48 0x7ffff7def25e <_dl_runtime_resolve+94>: jmp r11

本文标题:【北京seo实战】一步一步学ROP之gadgets和2free篇 蒸米

本文地址:http://www.gzxdxh.com/seojc/49451.html

Tags:

网站分类
标签列表