#undef _FORTIFY_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int BufForTst[100];
int main(int argc, char *argv[])
{
void *buf0,*buf1,*buf2,*buf3;
BufForTst[1]=0x29;
buf0 = malloc(0x80);
memset(buf0, "A", 0x80);
printf("buf0 %x",buf0);
buf1 = malloc(0x80);
memset(buf1, "B", 0x80);
printf("buf1 %x",buf1);
printf("正常的chunk1、chunk2被分配\n");
free(buf0);
buf2=malloc(1);
memset(buf2, 0xb8, 1);
printf("buf2 malloc\n");
printf("buf0 %x",buf0);
return 0;
}
gcc -g test.c -o test
list n
b n
c
0x555555755ff0: 0x00000000 0x00000000 0x00000000 0x00000000
0x555555756000: 0x00000000 0x00000000 0x00000091 0x00000000
0x555555756010: 0x98989898 0x98989898 0x98989898 0x98989898
0x555555756020: 0x98989898 0x98989898 0x98989898 0x98989898
0x555555756030: 0x98989898 0x98989898 0x98989898 0x98989898
0x555555756040: 0x98989898 0x98989898 0x98989898 0x98989898
0x555555756050: 0x98989898 0x98989898 0x98989898 0x98989898
0x555555756060: 0x98989898 0x98989898 0x98989898 0x98989898
0x555555756070: 0x98989898 0x98989898 0x98989898 0x98989898
0x555555756080: 0x98989898 0x98989898 0x98989898 0x98989898
0x555555756090: 0x00000000 0x00000000 0x00000091 0x00000000
0x5555557560a0: 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a
0x5555557560b0: 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a
0x5555557560c0: 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a
0x5555557560d0: 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a
0x5555557560e0: 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a
0x5555557560f0: 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a
0x555555756100: 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a
0x555555756110: 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a
0x555555756120: 0x00000000 0x00000000 0x00020ee1 0x00000000
free后
0x555555755ff0: 0x00000000 0x00000000 0x00000000 0x00000000
0x555555756000: 0x00000000 0x00000000 0x00000091 0x00000000
0x555555756010: 0xf7dd1b58 0x00007fff 0xf7dd1b58 0x00007fff
0x555555756020: 0x98989898 0x98989898 0x98989898 0x98989898
0x555555756030: 0x98989898 0x98989898 0x98989898 0x98989898
0x555555756040: 0x98989898 0x98989898 0x98989898 0x98989898
0x555555756050: 0x98989898 0x98989898 0x98989898 0x98989898
0x555555756060: 0x98989898 0x98989898 0x98989898 0x98989898
0x555555756070: 0x98989898 0x98989898 0x98989898 0x98989898
0x555555756080: 0x98989898 0x98989898 0x98989898 0x98989898
0x555555756090: 0x00000090 0x00000000 0x00000090 0x00000000
0x5555557560a0: 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a
0x5555557560b0: 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a
0x5555557560c0: 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a
0x5555557560d0: 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a
0x5555557560e0: 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a
0x5555557560f0: 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a
0x555555756100: 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a
0x555555756110: 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a 0x9a9a9a9a
0x555555756120: 0x00000000 0x00000000 0x00000411 0x00000000
(gdb) x/50x $rax
0x555555756010: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756020: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756030: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756040: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756050: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756060: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756070: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756080: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756090: 0x00000000 0x00000000 0x00020f71 0x00000000
0x5555557560a0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555557560b0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555557560c0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555557560d0: 0x00000000 0x00000000
(gdb) list 17
12 buf0 = malloc(0x80);
13 memset(buf0, "A", 0x80);
14 printf("buf0 %x",buf0);
15 buf1 = malloc(0x80);
16 memset(buf1, "B", 0x80);
17 printf("buf1 %x",buf1);
18 printf("正常的chunk1、chunk2被分配\n");
19 free(buf0);
20
21 buf2=malloc(1);
(gdb) b 21
Breakpoint 3 at 0x555555554855: file test.c, line 21.
(gdb) c
Continuing.
buf0 55756010buf1 557564b0正常的chunk1、chunk2被分配
Breakpoint 3, main (argc=1, argv=0x7fffffffdf58) at test.c:21
21 buf2=malloc(1);
(gdb) x/50x 0x555555756000
0x555555756000: 0x00000000 0x00000000 0x00000091 0x00000000
0x555555756010: 0xf7dd1b58 0x00007fff 0xf7dd1b58 0x00007fff
0x555555756020: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756030: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756040: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756050: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756060: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756070: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756080: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756090: 0x00000090 0x00000000 0x00000410 0x00000000
0x5555557560a0: 0x30667562 0x37353520 0x31303635 0x66756230
0x5555557560b0: 0x35352031 0x34363537 0xade63062 0xb8b8e5a3
0x5555557560c0: 0x63849ae7 0x6b6e7568
(gdb) n
22 memset(buf2, 0xb8, 1);
(gdb)
24 printf("buf2 malloc\n");
(gdb) x/50x $rax
0x555555756010: 0xf7dd1bb8 0x00007fff 0xf7dd1bd8 0x00007fff
0x555555756020: 0x38383838 0x38383838 0x00000071 0x00000000
0x555555756030: 0xf7dd1b58 0x00007fff 0xf7dd1b58 0x00007fff
0x555555756040: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756050: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756060: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756070: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756080: 0x38383838 0x38383838 0x38383838 0x38383838
0x555555756090: 0x00000070 0x00000000 0x00000410 0x00000000
0x5555557560a0: 0x30667562 0x37353520 0x31303635 0x66756230
0x5555557560b0: 0x35352031 0x34363537 0xade63062 0xb8b8e5a3
0x5555557560c0: 0x63849ae7 0x6b6e7568 0x8180e331 0x6e756863
0x5555557560d0: 0xa2e8326b 0x8688e5ab
这里free(buf0)后 malloc buf2 结果地址是一个。
这里这个分配堆内存时,fastbin 不一定按快来分配。就是按顺序在地址上分配,释放的内存,在分配是就会在刚释放的地址上分配。
写入一个字节后,释放的内存中存在的指针fd 0xf7dd1b58 0x00007fff
在buf2的出现后变成了0xf7dd1bb8 0x00007fff
最后以为变化了。
这个地址应该可以泄露出.bss的地址。
这样之的话就可已泄漏出很多地址
所谓的释放重引用,应该是释放后,内存可以重新利用吧。
from zio import *
io=zio('./tst',timeout=9999)
#io.gdb_hint()
io.read_until('break')
sc='a'*32+l32(0x0)+l32(0x29)+l32(0x804A060)
#sc='abcd'
io.writeline(sc)
io.read()