基操

拿到一个core.cpio,一般得到的都是压缩包,先将其回归到正常的名字,mv core.cpio core.cpio.gz,然后将其解压,gunzip core.cpio.gz,解压后的状态就是运行起仿真所需要的core.cpio

然后我们将exp放入重新生成一个core.cpio要怎么办呢,先生成一个空的文件夹,mkdir core;cd core,cpio -idmv <core.cpio,就得到了core.cpio的东西了,然后编译exp,gcc exp..c -static -masm=intel -g-o exp,将其放入core文件夹,在core文件夹中执行find . | cpio -o --format=newc >core.cpio,会在该文件夹中获取到一个core.cpio,放回start.sh目录下,运行期环境然后执行就可以了

泄露地址

一般开启KASLR的时候寻找地址

1.Dmesg

在启动内核后可以查看内核的信息,如dmesg | grep -i "kernel可以查看内核的地址信息

但是,在init.sh文件中有 echo 1 > /proc/sys/kernel/dmesg_restrict,即设置dmesg_restrict为1 就不能使用;或者是 编译内核时CONFIG_SECURITY_DMESG_RESTRICT=y

2.kallsyms

看init.sh文件

1
echo 2 > /proc/sys/kernel/kptr_restrict
  • 0:默认情况下,没有任何限制。
  • 1:使用 %pK 输出的内核指针地址将被替换为 0,除非用户具有CAP_ SYSLOG特权,并且 group id和真正的 id 相等。(这个不太懂,root用户就可以看到)
  • 2:使用 %pK 输出的内核指针都将被替换为 0 ,即与权限无关。(root用户也看不到,需要在启动时去掉这个才行)

3.module

这个是用来获取模块加载地址的

1
bashcat /sys/module/module_name/sections/.text

打印地址

1.常规打印

1
plaintextprintf("0x%lx\n",leakAddr);

有时候不加\n打不出来

1
2
3
4
#define HEX(x) 
printf("[*]0x%016lx\n", (size_t)x)
#define LOG(addr)
printf("[*]%s\n", addr)

2.gdb式打印

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void gdbPrint(size_t* data,int len)
{
int rowLen = 0;
for(int i = 0 ; i < len/0x10 ; i ++)
{
printf("0x%04x\t",rowLen);
printf("0x%016llx ",*data++);
printf("0x%016llx\n",*data++);
rowLen = rowLen+0x10;
}
}

char data[0x50];
memset(data,'\xaa', 0x10);
memset(data+0x10,'\xbb', 0x20);
gdbPrint(data,0x50);

实现效果

image-20220512151331110

搜索内存

当不知道内存在哪里时,可以使用peda的搜索功能,搜索地址范围,常常在操控栈时很好用

1
find "galf" 0xffffc900001d3f80 0xffffc900001d3f98

image-20220114170510292