08.03
1、看之前的2篇文章
08.04
1、换服务器并配置
阿里云服务器创建镜像备份
登陆控制台--->实例--->镜像创建--->导出
需要开通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的内容。
delete之后
使用unsortedbin
来泄漏libc的指针。
tcachebins机制是新引入的。
08.06
1、CTF特训营
-
程序保护机制
,重定位,重定位信息可写,full relro 重定位信息不可写。
free的规则
tcache
重要结构体:entry 和 pertheread_struct运行代码
malloc需要包含头文件 stdlib.h
08.07
1、示例运行
有strcpy函数,需要用到 <string.h> 头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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 函数名
得到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
ldd 程序
可以查看使用的libc是哪一个。
LD_LIBRARY_PATH
真实地址在 .got.plt里面
lay asm可以查看汇编代码。
libcdb.com可以查找函数的对应地址(概率成功)
08.09-08.10
1、栈
64位,控制rax
rax = rdi
输出
控制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报错
编译命令改为:
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
还是报错
/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
还是报错,但是错误比刚才少了一些
不编译2.19了,编译2.23版本
参考视频和文章 //www.greatytc.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
可能只能下载相应的版本。。。。
下载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
/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
下载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版本
安装docker
3、hacknote
编译时加入-g,就会带上debuging symbol
chunk比malloc的内存要大一点
lay src
参考 下图,得到堆块的内容
top chunk
用来记录可以使用,但是没有分配的内存 0x20d71
再malloc一些块
地址头部由290变为2d0,+0x40
内存d71变为d31 , -0x40
ltrace 会trace libc的function call
ltrace -e 'malloc+free' ./hacknote
chunk在使用的时候,fd bk没有作用,可以存放data,free之后才有作用
p/x *(struct malloc_chunk*)0x555555756250
将内存转为chunk来查看
08.13
1、b站视频
使用malloc需要包含 <stdlib.h>
free掉p之后,按理说size的P位应该为0,但是测试发现还是1
查看最开始free的chunk, fd指向main_arean部分
实验结果:main_arean是一个环状
-
malloc会把刚刚释放的给重新分配回来
08.14
1、b站视频
发现和视频讲解不一样,新malloc的是靠后的0x...4e0
查看bin结构如下
这是由于新引入的tcachebins的结构,新free的被放在最开头的位置
可能是单链表的结构,bk的值都是0.
- 如果一个chunk后面是top chunk,在free的时候会和后面的合并。如果它前面或者后面的没有使用(not inuse),free的时候也会合并
2、UAF
free掉的东西有机会再被利用,因为指针没有清空。
函数如下
#include <cstdio>
#include <cstdlib>
#include <cstring>
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的相同,容易绕过。
08.19
🈚️
08.20
🈚️
08.21
1、fastbin
取出的chunk的size要正确
绕过:
- stack上的变数当作size
- GOT上,如果函数没有call过,通常地址为0x40,把0x40当作size
接下来就会对任意地址进行读写
08.23
1、fastbin -- double free
程序如下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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的部分是空的,就什么都不做。
检查不太好
objdump -d fastbin > d1
ps au
查看进程id
08.23
1、fastbin
heap起始的位置是 0x555555756000
结束的位置是
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