1 概述
本文是这篇文章的笔记:
Fun with SROP Exploitation
https://v0ids3curity.blogspot.jp/2015/06/fun-with-srop-exploitation.html
环境:Ubuntu 16.04
2 程序
nasm -felf32 vuln_s.asm
ld vuln_s.o -melf_i386 -o vuln_s
millionsky@ubuntu-16:~/tmp$ gdb ./vuln_s
(gdb) shell objdump -d vuln_s
vuln_s: 文件格式 elf32-i386
Disassembly of section .text:
08048060 <vuln>: 8048060: 83 ec 08 sub $0x8,%esp 8048063: b8 03 00 00 00 mov $0x3,%eax 8048068: 31 db xor %ebx,%ebx 804806a: 89 e1 mov %esp,%ecx 804806c: ba 00 04 00 00 mov $0x400,%edx 8048071: cd 80 int $0x80 8048073: 83 c4 08 add $0x8,%esp 8048076: c3 ret
08048077 <_start>: 8048077: e8 e4 ff ff ff call 8048060 <vuln> 804807c: 31 c0 xor %eax,%eax 804807e: 40 inc %eax 804807f: cd 80 int $0x80 |
3 EXP
3.1 思路
主要思路
1. Read返回值控制EAX,设置为sigreturn的系统调用号0x77
2. 栈溢出,Sigreturn执行mprotect系统调用
3. Mprotect将text段设置为RWX
4. 调用漏洞函数
5. 栈溢出,执行shellcode
关键点
l read返回值控制EAX,从而控制系统调用号;
l sigreturn可以将栈指向ELF header
l sigretrun可以设置EIP指向INT_80和相应的寄存器,从而执行mprotect;
mprotect将.text段设置为RWX
l ELF header + 0x18的地方为程序入口,即_start;
栈设置在这里,配合ret指令可以让程序重新执行_start;
3.2 实施过程
1. 执行sigreturn系统调用
/*for x86*/ mov eax,0x77 int 80h |
l 栈溢出,覆盖返回地址指向INT_80 = 0x08048071;
l EAX的控制:发送0x77个字节,read返回后EAX即为0x77
EIP: 0x08048076 <vuln+22>: ret |
||
|
char buf[8] |
AAAAAAAA |
|
Return addr |