首页
社区
课程
招聘
[已解决] [求助]一道线下CTF pwn题,求wp和加固方法 55.00雪花
2018-12-9 20:53 3186

[已解决] [求助]一道线下CTF pwn题,求wp和加固方法 55.00雪花

2018-12-9 20:53
3186
这题加了壳,把内存dump出来看,大概是个堆利用,但堆利用不太熟,求wp和解释,另求加固方法。

代码形如:
int __cdecl main(int argc, const char **argv, const char **envp)
{
  __int64 v3; // rax
  __int64 v4; // rax
  __int64 v5; // rax
  __int64 v6; // rax
  __int64 v7; // rax
  __int64 v8; // rax

  sub_7F2F3D25323C();
  while ( 1 )
  {
    v3 = print((__int64)&unk_7F2F3D4541C0, (__int64)"1 Add");
    sf0(v3, qword_7F2F3D453FF8);
    v4 = print((__int64)&unk_7F2F3D4541C0, (__int64)"2 view");
    sf0(v4, qword_7F2F3D453FF8);
    v5 = print((__int64)&unk_7F2F3D4541C0, (__int64)"3 edit");
    sf0(v5, qword_7F2F3D453FF8);
    v6 = print((__int64)&unk_7F2F3D4541C0, (__int64)"4 delete");
    sf0(v6, qword_7F2F3D453FF8);
    v7 = print((__int64)&unk_7F2F3D4541C0, (__int64)"5 use");
    sf0(v7, qword_7F2F3D453FF8);
    v8 = print((__int64)&unk_7F2F3D4541C0, (__int64)"6 exit");
    sf0(v8, qword_7F2F3D453FF8);
    input((__int64)&unk_7F2F3D4540A0, (__int64)&dword_7F2F3D4542E0);
    if ( dword_7F2F3D4542E0 <= 0 || dword_7F2F3D4542E0 > 5 )
      break;
    ((void (__fastcall *)(void *, int *))qword_7F2F3D454300[dword_7F2F3D4542E0 - 1])(
      &unk_7F2F3D4540A0,
      &dword_7F2F3D4542E0);
  }
  return 0;
}

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开发者可享99元/年,续费同价!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (1)
雪    币: 4879
活跃值: (2679)
能力值: ( LV15,RANK:550 )
在线值:
发帖
回帖
粉丝
diycode 5 2018-12-10 11:22
2
0

先脱壳,观察程序,发现有proc/exe/self的字符串。搜proc/exe/self linux packer就可以知道是upx的。用upx -d脱壳,结果报not packed by upx,回头看看发现magic number被改了,把\xaa\xaa\xaa\xaa替换回UPX!。再跑,报checksum error。那么可以拉份upx源码下来,把抛checksum error的代码改掉就完事儿了。

 

当然你还可以直接patch upx程序本身,拖进IDA,通过字符串可以立刻定位到throw checksum error的函数,patch成ret也完事儿了。

 

图片描述

$ src/upx -d ../c++note_magic
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2013
UPX 3.91        Markus Oberhumer, Laszlo Molnar & John Reiser   Sep 30th 2013

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
qq
     11164 <-      6249   55.97%  linux/ElfAMD   c++note_magic

Unpacked 1 file.

$ checksec ./c++note_magic
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      PIE enabled

大致看了下,有比较明显的三个洞。
第一个是后门,fini_array里面的逻辑,选10即可直接进shell。
图片描述

 

第二个是UAF,delete的时候没有清空指针。
图片描述

 

第三个是堆溢出,一个在add里面一个在edit里面,edit的里面size可以随便输入,比较好使。

 

这几个洞可以各自单独利用,也可以结合利用,攻击和防御都不难,不过可能还有其他不太明显的洞。

 

另外,由于加了壳,有很多rwx段,堆上就可以写shellcode,建议加固第一步就脱壳。

最后于 2018-12-10 13:54 被diycode编辑 ,原因:
上传的附件:
游客
登录 | 注册 方可回帖
返回