how2heap 题目汇总(上) | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

how2heap 题目汇总(上)

某info 6.2.0正则匹配不严谨导致注入+getshell组合拳

公司做技术分享,分享了项目中的一个攻击metinfo的案例,很有意思的攻击链,记录下。 svn泄露 svn是一个开放源代码的版本控制系统,如果在网站中存在.svn目录,那么我们可以拿到网站的源代码,方便审计。关于svn泄露需要注意的是SVN 版本 >1.7 时,Seay的工具不能dump源码了。可以用@admintony师傅的脚本来利用 https://github.com/admintony/svnExploit/ 在目标站中

很多大佬们都对how2heap这个项目举行了汇总,我就不班门弄斧了,然则同时大佬对一些题目一笔带过,这里就记一下本人在学 how2heap 中的一些有疑问的点,应当具有肯定的代表性.大佬能够帮助挑错,愿望和人人一同提高

first_fit 疑问和拓展

我一开始就有疑问,为何明显是 smallbins 和 largebins 范围内的 chunk ,它直接去 unsortedbins 呢,事实上只需不是 fastbins 范围内的,经由 free 后都邑先进入 unsorted bin 待命.体系在举行 malloc 分派的时刻 unsortedbin 算是起到一个缓冲区的作用,测试顺序以下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char* a = malloc(512);
    char* b = malloc(256);
    free(a);
    char* c = malloc(500);
}

断在 malloc(c)处(:今后 char* c = malloc(500) 这类直接简写成 malloc(c) )

4 int main()
    5 {
    6     char* a = malloc(512);
    7     char* b = malloc(256);
    8     free(a);
 ►  9     char* c = malloc(500);
   10 //  char* d = malloc(512); 
   11 }
──────────────────────────────────────────────────[ STACK ]───────────────────────────────────────────────────
...
────────────────────────────────────────────────[ BACKTRACE ]─────────────────────────────────────────────────
...
──────────────────────────────────────────────────────────────────────────────────────────────────────────────
Breakpoint /home/pic/桌面/te.c:9
pwndbg> bins
fastbins
0x20: 0x0
0x30: 0x0
0x40: 0x0
0x50: 0x0
0x60: 0x0
0x70: 0x0
0x80: 0x0
unsortedbin
all: 0x602000 —▸ 0x7ffff7dd1b78 (main_arena+88) ◂— 0x602000
smallbins
empty
largebins
empty

以后 malloc(c) 会把 unsortedbin 这个掏出(只要这个bin不加s,不是复数,也能够申明只要一个链表,2333),而倘使把顺序举行以下的修正

5 {
    6     char* a = malloc(512);
    7     char* b = malloc(256);
    8     free(a);
    9     char* c = malloc(10);
 ► 10     char* d = malloc(512); 
   11 }
──────────────────────────────────────────────────[ STACK ]───────────────────────────────────────────────────
...
────────────────────────────────────────────────[ BACKTRACE ]─────────────────────────────────────────────────
...
──────────────────────────────────────────────────────────────────────────────────────────────────────────────
pwndbg> x/32gx 0x602000
0x602000:   0x0000000000000000  0x0000000000000021
0x602010:   0x00007ffff7dd1d78  0x00007ffff7dd1d78
0x602020:   0x0000000000000000  0x00000000000001f1
0x602030:   0x00007ffff7dd1b78  0x00007ffff7dd1b78
0x602040:   0x0000000000000000  0x0000000000000000
0x602050:   0x0000000000000000  0x0000000000000000
0x602060:   0x0000000000000000  0x0000000000000000
0x602070:   0x0000000000000000  0x0000000000000000
0x602080:   0x0000000000000000  0x0000000000000000
0x602090:   0x0000000000000000  0x0000000000000000
0x6020a0:   0x0000000000000000  0x0000000000000000
0x6020b0:   0x0000000000000000  0x0000000000000000
0x6020c0:   0x0000000000000000  0x0000000000000000
0x6020d0:   0x0000000000000000  0x0000000000000000
0x6020e0:   0x0000000000000000  0x0000000000000000
0x6020f0:   0x0000000000000000  0x0000000000000000

能够看到顺序仍然是从 unsortedbin 掏出的,不过举行了切割, c 只拿走了0x20(1是标志位)个字节,剩下了0x1f0字节(剩下的我们称之为 remainder chunk ,仍留在 unsortedbin 中),而 remainder chunk 完整不够 d 的大小,所以猜测 d 会切割 top chunk ,以后我们再 n 单步运转发明果然是如许,然则同时

pwndbg> heap
0x602000 FASTBIN {          <------------------c
  prev_size = 0, 
  size = 33, 
  fd = 0x7ffff7dd1d78 <main_arena+600>, 
  bk = 0x7ffff7dd1d78 <main_arena+600>, 
  fd_nextsize = 0x0, 
  bk_nextsize = 0x1f1
}
0x602020 PREV_INUSE {           <------------------之前的 remainder chunk
  prev_size = 0, 
  size = 497, 
  fd = 0x7ffff7dd1d58 <main_arena+568>, 
  bk = 0x7ffff7dd1d58 <main_arena+568>, 
  fd_nextsize = 0x0, 
  bk_nextsize = 0x0
}
0x602210 {              <------------------b
  prev_size = 496, 
  size = 272, 
  fd = 0x0, 
  bk = 0x0, 
  fd_nextsize = 0x0, 
  bk_nextsize = 0x0
}
0x602320 PREV_INUSE {           <-------------------d
  prev_size = 0, 
  size = 529, 
  fd = 0x0, 
  bk = 0x0, 
  fd_nextsize = 0x0, 
  bk_nextsize = 0x0
}
0x602530 PREV_INUSE {           <-------------------top chunk
  prev_size = 0, 
  size = 133841, 
  fd = 0x0, 
  bk = 0x0, 
  fd_nextsize = 0x0, 
  bk_nextsize = 0x0
}
pwndbg> p d
$1 = 0x602330 ""
pwndbg> bins
fastbins
0x20: 0x0
0x30: 0x0
0x40: 0x0
0x50: 0x0
0x60: 0x0
0x70: 0x0
0x80: 0x0
unsortedbin
all: 0x0
smallbins
0x1f0: 0x602020 —▸ 0x7ffff7dd1d58 (main_arena+568) ◂— 0x602020 /* '  `' */
largebins
empty

发明我们之前剩下的 chunk 这才被归入了 smallbins .我们能够抽象的理解为 unsortedbin 异常强势,试图控制统统,然则它在才能不足时才会把他人应得的送还,也即我们常说的甩锅,2333

consolidate研讨

我在这里直接演示一个比较极度的例子,因为 how2heap 中的顺序 fastbin_dup_consolidate 看上去就像是直接整合到了 smallbins 一样

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int main() {
  void* p1 = malloc(0x70);
  void* p3 = malloc(0x70);
  void* p4 = malloc(0x70);
  void* p5 = malloc(0x70);
  void* p6 = malloc(0x70);
  void* p7 = malloc(0x70);
  void* p8 = malloc(0x70);
  void* p9 = malloc(0x70);
  void* p10 = malloc(0x70);
  void* p2 = malloc(0x70);
  free(p1);
  free(p3);
  free(p4);
  free(p5);
  free(p6);
  free(p7);
  free(p8);
  free(p9);
  free(p10);
  void* p12 = malloc(0x400);
}

直接在 malloc(p12) 中下断,跑起来

pwndbg> bins
fastbins
0x20: 0x0
0x30: 0x0
0x40: 0x0
0x50: 0x0
0x60: 0x0
0x70: 0x0
0x80: 0x602400 —▸ 0x602380 —▸ 0x602300 —▸ 0x602280 —▸ 0x602200 ◂— ...
unsortedbin
all: 0x0
smallbins
empty
largebins
empty

之前 free 的都跑到了 fastbins 再次 n 单步,发明

apk混淆工具Obfuscapk原理探究

前言 Obfuscapk是一个python实现的apk混淆工具,使用插件系统构建,被设计为模块化且易于扩展。每个obfuscator都是一个从抽象基类(obfuscator_category.py)继承的插件,都实现了obfuscate方法。 使用新的obfuscator对该工具进行扩展非常简单:在src/obfuscapk/obfuscators目录中添加实现混淆技术的源代码和插件元数据文件(obfuscator-name.obfuscator)即可。本文接下

pwndbg> bins
fastbins
0x20: 0x0
0x30: 0x0
0x40: 0x0
0x50: 0x0
0x60: 0x0
0x70: 0x0
0x80: 0x0
unsortedbin
all: 0x602410 —▸ 0x7ffff7dd1b78 (main_arena+88) ◂— 0x602410
smallbins
empty
largebins
empty

经由 consolidate 后,我们的 fastbins 悉数被摘下来了,同时进入了 unsortedbin ,而且也够 p12 请求的大小.所以整合过的 chunk 就直接分派给 p12 了.

pwndbg> p p12
$2 = (void *) 0x602010

这时刻我们再回头看看 fastbin_dup_consolidate ,把之前我们引见的强势的 unsortedbin 观点拿过来,我们发明,事实上该顺序在 void* p3 = malloc(0x400); 时, unsortedbin 的大小并不满足 p3 所请求的大小,所以会举行”甩锅”,把 unsortedbin 中的 chunk 丢到 smallbins 中

unsafe_unlink

大佬们已总结的很好了,处理这两个题目就完事

  • unlink 历程
  • 末了的赋值修正

unlink历程

FD = P->fd;
BK = P->bk;
FD->bk = BK
BK->fd = FD

我们看一下, FD 和 BK 都是相对 P(fake chunk) 而言的,所以 FD 就是 0x602058 ,同时 BK 是 0x602060 ,所以 FD->bk = 0x602060 , BK->fd = 0x602058 ,因为FD->bkBK->fd这两块都是指向一处地点,后边的有用,改成了

pwndbg> x/32gx 0x602058
0x602058:   0x0000000000000000  0x00007ffff7dd2540
0x602068 <completed.7594>:  0x0000000000000000  0x0000000000602058

要注意 chunk0_ptr 此时地点为 0x602070 ,我们能够修正指针的指向以到达恣意写的目标,能够看看以下的小 demo

末了的赋值修正,相似云云

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

uint64_t  *chunk0_ptr;
int main()
{
    char b[8]="aaaa";
    chunk0_ptr=&b;
    chunk0_ptr[0] = 0x4242424242424242LL;
    printf("%s\n",b);
}

顺序效果

{13:40}~/桌面 ➭ gcc te.c
te.c: In function ‘main’:
te.c:10:12: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
  chunk0_ptr=&b;
            ^
{13:40}~/桌面 ➭ ./a.out 
BBBBBBBB


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明how2heap 题目汇总(上)
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址