CTF-Pwn-8月记录

08.03

1、看之前的2篇文章

08.04

1、换服务器并配置


F44EBD8E-1656-4661-9317-1E9F4110B707.png

阿里云服务器创建镜像备份
登陆控制台--->实例--->镜像创建--->导出
需要开通OSS,暂未完成

2、安装做题需要的环境等
centOS安装apt-get, 比较麻烦
告辞,退了

3、换成Ubuntu
但是,字体没有配色,看起来很难受。

08.05

1、解决没有高亮显示
https://blog.csdn.net/wzy1551368/article/details/79394001

sudo apt install gedit
发现是因为普通账户登陆了,而不是管理员登陆。
sudo vim /etc/ssh/sshd_config
找到 #PermitRootLogin prohibit-password, 改为yes
成功修改为root权限登陆!

2、安装所必须的工具
pwngdb
pwntool

3、题目:fastbin_attack-examples
32位文件,IDA打开
参考文章 https://www.anquanke.com/post/id/86286
其中fd,bk指针只用到了fd
攻击:覆盖堆头,fd指向任意地址。
除此之外对于fastbin还存在double free,house of spirit等攻击方式。
输入bins,即可查看bins的内容。

13C46549-F168-4650-B2B7-E3BD76D574C0.png

delete之后


43A1FE6C-60F2-4A3F-812C-1C5821C293CD.png

使用unsortedbin来泄漏libc的指针。
tcachebins机制是新引入的。

08.06

1、CTF特训营

  • 程序保护机制


    D595E9B0-26E4-41FC-8C67-3716B8409375.png

,重定位,重定位信息可写,full relro 重定位信息不可写。

  • free的规则

  • tcache
    重要结构体:entry 和 pertheread_struct

  • 运行代码
    malloc需要包含头文件 stdlib.h

08.07

1、示例运行
有strcpy函数,需要用到 头文件

#include 
#include 
#include 

void target_func(){
        printf("Hacked\n");
}

void show_info_A(char *info){
        printf("%s\n",info);
}

struct struct_A{
        int type;
        int size;
        char A_info[0x20];
        void (*show_info_ptr)(char *);
};

struct struct_B{
        int type;
        int size;
        char B_info[0x40];
};

void show_info(void *data, int type){
        printf("in show_info:%d\n",type);
        if(type == 0){
                printf("in 0\n");
                struct struct_A *struct_A_ptr = (struct struct_A*)data;
                struct_A_ptr -> show_info_ptr(struct_A_ptr->A_info);
        }

else if(type == 1){
                printf("in 1\n");
                struct struct_B *struct_B_ptr = (struct struct_B*)data;
                printf("%s\n",struct_B_ptr->B_info);
        }
}

int main(){
        struct struct_A *var_a;
        struct struct_B *var_b;
        var_a = malloc(sizeof(struct struct_A));
        var_a->type = 0;
        strcpy(var_a->A_info,"A_info");
        var_a->show_info_ptr = show_info_A;
        var_a->size = strlen(var_a -> A_info);
        var_b = malloc(sizeof(struct struct_B));
        scanf("%d",&var_a ->type);
        getchar();
        gets(var_b->B_info);
        var_b->size = strlen(var_b -> B_info);
        show_info(var_a,var_a->type);
        show_info(var_b,var_b->type);
        return 0;
}

gdb中查看函数地址的方法:x 函数名

C10DAEA5-6722-4B6A-9095-AFA3DCEE0AC6.png

得到target_func函数的地址为 0x55555555481a
书中有一个错误,B对应的是1,如果想有错误,应该输入0.
终端中,双击g,回到函数最开始的位置。

思想:填充A_info部分,添加返回地址即可。但是没成功。

2、unlink
有检查,突破手段 freenote 或 stkof
源码:修改指针。如果P的尺寸不在small_bin,并且P前一块用来指示的尺寸不为NULL,assert两次。

freenote

3、视频b站

08.08

1、b站视频
objdump -d hacknote | less
cat /proc/26666 maps


C9894210-D113-47D4-BBD5-3F5B66DFDA51.png

ldd 程序
可以查看使用的libc是哪一个。


018C44C4-BAAE-4559-9CA0-ACD33F9EA5CF.png

LD_LIBRARY_PATH

真实地址在 .got.plt里面

lay asm可以查看汇编代码。

libcdb.com可以查找函数的对应地址(概率成功)

08.09-08.10

1、栈
64位,控制rax
rax = rdi

A66AB341-1905-4CE9-8C8F-2406256354C7.png

输出


8EA08F8D-F94D-44EC-9F80-66F327F766E3.png

控制rcx
(1)strcpy, ecx = 输入字符串(2)ecx为syscall的下一行地址(可以用来泄漏libc基址)

lay reg查看寄存器的值

08.11

1、编写带debug symbol 的libc
下载太慢,本机下载再上传。

CFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -w" CXXFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -w" ../configure --prefix=/root/test/glibc-2.19/64

make报错


image.png

编译命令改为:
CFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -Wno-error=maybe-uninitialized -Wno-error" CXXFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -Wno-error=maybe-uninitialized -Wno-error" ../configure --prefix=/root/test/glibc-2.19/64
还是报错

8DDA8ECA-6F0E-4C5B-A715-5A80B31EB968.png
/usr/bin/ld: /root/test/glibc-2.19/build/csu/crt1.o: relocation R_X86_64_32S against symbol `__libc_csu_fini' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/7/crtbegin.o: relocation R_X86_64_32 against hidden symbol `__TMC_END__' can not be used when making a PIE object
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
../Rules:140: recipe for target '/root/test/glibc-2.19/build/iconv/iconvconfig' failed
make[2]: *** [/root/test/glibc-2.19/build/iconv/iconvconfig] Error 1
make[2]: Leaving directory '/root/test/glibc-2.19/iconv'
Makefile:213: recipe for target 'iconv/others' failed
make[1]: *** [iconv/others] Error 2
make[1]: Leaving directory '/root/test/glibc-2.19'
Makefile:9: recipe for target 'all' failed
make: *** [all] Error 2

参考 https://sourceware.org/bugzilla/show_bug.cgi?id=20845

CFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -w" CXXFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -w" ../configure --prefix=/root/test/glibc-2.19/64 --disable-shared
还是报错,但是错误比刚才少了一些

653EE16A-B2B9-4F02-8BF5-A2A3DA084ED3.png

不编译2.19了,编译2.23版本
参考视频和文章 https://www.jianshu.com/p/1a966b62b3d4

CFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -w" CXXFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -w" ../configure --prefix=/root/glibc/glibc-2.23/64 --disable-shared

不行,改为
CFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -Wno-error=maybe-uninitialized -Wno-error" \ CXXFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -Wno-error=maybe-uninitialized -Wno-error" \ ../configure --prefix=/root/glibc/glibc-2.23/64 --disable-shared

还是错误,可能是版本太低,参考
https://developer.aliyun.com/article/620956

**中途安装 patchelf **
参考 https://blog.csdn.net/qq_33873431/article/details/97751520

编译环境比当前系统版本要高。

/root/glibc/glibc-2.23/build/nss/getent.o: In function `rpc_keys':
/root/glibc/glibc-2.23/nss/getent.c:685: undefined reference to `setrpcent'
/root/glibc/glibc-2.23/nss/getent.c:686: undefined reference to `getrpcent'
/root/glibc/glibc-2.23/nss/getent.c:688: undefined reference to `endrpcent'
/root/glibc/glibc-2.23/nss/getent.c:697: undefined reference to `getrpcbyname'
/root/glibc/glibc-2.23/nss/getent.c:695: undefined reference to `getrpcbynumber'
collect2: error: ld returned 1 exit status
../Rules:147: recipe for target '/root/glibc/glibc-2.23/build/nss/getent' failed
make[2]: *** [/root/glibc/glibc-2.23/build/nss/getent] Error 1
make[2]: Leaving directory '/root/glibc/glibc-2.23/nss'
Makefile:214: recipe for target 'nss/others' failed
make[1]: *** [nss/others] Error 2
make[1]: Leaving directory '/root/glibc/glibc-2.23'
Makefile:9: recipe for target 'all' failed
make: *** [all] Error 2

查看版本root@VM-0-3-ubuntu:/lib64# strings ld-linux-x86-64.so.2 | grep GLIBC

59E2646F-E012-4614-AE24-7FCB145E763C.png

可能只能下载相应的版本。。。。
下载2.4版本的应该没错

CFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -Wno-error=maybe-uninitialized -Wno-error" CXXFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -Wno-error=maybe-uninitialized -Wno-error" ../configure --prefix=/root/glibc/glibc-2.4/64 --disable-shared

CFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -w" CXXFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -w" ../configure --prefix=/root/glibc/glibc-2.4/64 --disable-shared

7E5F68D1-3F9E-421B-9D5F-1243557BF344.png

/root/glibc/glibc-2.23/64 --disable-shared

还是版本没有,下载2.5试试

CFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -w" CXXFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -w" ../configure --prefix=/root/glibc/glibc-2.5/64 --disable-shared

2D553000-7226-4676-AE19-8BA229E35612.png

下载2.3版本试试
CFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -w" CXXFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -w" ../configure --prefix=/root/glibc/glibc-2.3/64 --disable-shared
没了原来版本2.3的提示了,但是说gcc的版本可能太低了。

安装最新版gcc的方法
需要gcc的版本是7.4.0,make的版本为4.1

不行不行不行

08.12

1、下载glibc源码
官网下载较慢,github上地址 https://github.com/jorinzou/glibc

2、分析
查看ldd版本


image.png

安装docker

3、hacknote
编译时加入-g,就会带上debuging symbol

image.png

chunk比malloc的内存要大一点

lay src
参考 下图,得到堆块的内容


image.png
image.png

top chunk


image.png
image.png

用来记录可以使用,但是没有分配的内存 0x20d71

再malloc一些块


image.png

地址头部由290变为2d0,+0x40
内存d71变为d31 , -0x40

ltrace 会trace libc的function call
ltrace -e 'malloc+free' ./hacknote

image.png

chunk在使用的时候,fd bk没有作用,可以存放data,free之后才有作用

p/x *(struct malloc_chunk*)0x555555756250将内存转为chunk来查看

image.png

08.13

1、b站视频
使用malloc需要包含

097D3600-09B6-4D68-97A4-C1AD311BD41F.png
61B64F93-F8C1-4D44-BEA0-822E9154946F.png

free掉p之后,按理说size的P位应该为0,但是测试发现还是1

查看最开始free的chunk, fd指向main_arean部分


image.png

实验结果:main_arean是一个环状

  • malloc会把刚刚释放的给重新分配回来


    7114B132-6170-4B5E-915C-0F158CA2D17D.png

08.14

1、b站视频


image.png

发现和视频讲解不一样,新malloc的是靠后的0x...4e0
查看bin结构如下


image.png

这是由于新引入的tcachebins的结构,新free的被放在最开头的位置
可能是单链表的结构,bk的值都是0.

  • 如果一个chunk后面是top chunk,在free的时候会和后面的合并。如果它前面或者后面的没有使用(not inuse),free的时候也会合并

2、UAF
free掉的东西有机会再被利用,因为指针没有清空。

函数如下

#include 
#include 
#include 

class A{
        public:
                virtual void print(){
                        puts("class A");
                }
};

class B: public A{
        public:
                void print(){
                        puts("class B");
                }
};

void sh(){
        system("sh");
}

char buf[1024];

int main(){
        setbuf(stdout,0,_IONBF,0);

        A *p = new B();  //malloc
        delete p;  //free

        fgets(buf,sizeof(buf),stdin); 
        char *q = strndup(buf);  // malloc

        p->print();

        return 0;
} 

08.17

1、b站视频
上个程序分析
p首先地址是 0x602010
fd原本指向的是B的print
free掉之后原来指向的内容就会清零

08.18

1、b站视频---uaf
strdup在复制的时候,64位很有可能00截断。

call函数的时候,自己可以使用传递的第一个参数,是object本身。

想查看一个函数的地址,直接p 函数名即可。

如果没有直接的后门函数,自己构造printf,p->print会把p传进来

2、Fastbin corruption
尺寸小于0x80
单链表,只用fd,fd是指向下一个块的指针。
重新malloc取块时,也是从头部开始拿的,因为是单链表
自己也有一些检查
关于double free:只检查第一个chunk是否和要free的相同,容易绕过。

2BF41438-E6B6-4C6A-8F80-104C48B41A4C.png

08.19

08.20

08.21

1、fastbin
取出的chunk的size要正确
绕过:

  • stack上的变数当作size
  • GOT上,如果函数没有call过,通常地址为0x40,把0x40当作size
    接下来就会对任意地址进行读写

08.23

1、fastbin -- double free
程序如下

#include 
#include 
#include 

void sh(char *cmd){
        system(cmd);
}

int main(){
//      setbuf(stdout, 0, _IONBF, 0);
        int cmd,idx,sz;
        char *ptr[10];
        memset(ptr,0,sizeof(ptr));
        puts("1.malloc + gets\n2.free\n3.puts");

        while(1){
                printf("> ");
                scanf("%d %d", &cmd, &idx);
                idx %= 10;
                if (cmd == 1){
                        scanf("%d%*c", &sz);
                        ptr[idx] = malloc(sz);
                        gets(ptr[idx]);
                }

                else if (cmd == 2){
                        free(ptr[idx]);
                }

              else if (cmd == 3){
                        puts(ptr[idx]);
                }

                else exit(0);
        }

        return 0;
}

输入的是cmd,idx

  • 如果free的部分是空的,就什么都不做。


    image.png

    检查不太好

objdump -d fastbin > d1

ps au 查看进程id

image.png

08.23

1、fastbin
heap起始的位置是 0x555555756000

0E9B1190-C7C1-4797-A6B7-743C3843B563.png

结束的位置是
C0C5D37A-F3DB-497C-9CDC-A81B441A10EB.png

heap2- 32min

参考视频 https://www.bilibili.com/video/BV1op4y1D7e9?from=search&seid=9463446650216238443
向后合并是 把前一个块与此块合并。

  • 理解glibc malloc
    参考 https://sploitfun.wordpress.com/2015/02/10/understanding-glibc-malloc/

1、b站视频 heap
需要glibc,下载
wget https://ftp.gnu.org/gnu/libc/glibc-2.19.tar.gz

强网先锋AP
步骤大概就是:覆盖,泄漏puts地址,找到基址,
参考
https://prowes5.github.io/2019/05/27/2019强网杯部分writeup/

https://www.anquanke.com/post/id/179386#h2-10

http://blog.leanote.com/post/xp0int/[Pwn]-强网先锋-AP-mf

1、搭建CTF-PWN环境


CTF特训营

做题网址
http://pwnable.kr/play.php

https://www.jarvisoj.com/login
https://www.ctfhub.com/#/index

你可能感兴趣的:(CTF-Pwn-8月记录)