|
吾爱游客
发表于 2019-1-27 17:50
1、申 请 I D:offbyn0ll
2、个人邮箱:offbyn0ll@sina.com
3、原创技术文章:CTF堆基础知识训练万能题
最近在学习ctf,学到pwn的libc堆的利用,感觉很吃力。针对每种利用模型都需要找相应的题目
进行练习,而现实中很多题目并不适合初学者边做实验边练习。所以,自己编了一道万能堆漏
洞利用题用于实验,享受用各种堆漏洞模型解出这道题目。
此题可用于练习double free、uaf、fastbin_attack、unlink、house of 系列、unsorted bin attack、
IO_FILE等漏洞利用模型。做题过程中,自己给自己加限制条件,使用多种解法解出来。
源码:
/[C++] 纯文本查看 复制代码 /gcc -o heap_exp heap.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define int64 long long
#define uint64 unsigned long long
#define NAME_LEN 32
void get_input(char *buf,size_t len);
int64 get_num();
char* mlist[16];
uint m_count=0;
void menu();
void init();
void show();
void edit();
void delete();
void add();
void add(){
printf("malloc size: ");
size_t mem_size = get_num();
char* mbuf = malloc(mem_size);
printf("Name: ");
read(0, mbuf, mem_size);
mlist[m_count++] = mbuf;
}
void delete(){
uint index;
printf("index(0,15): ");
index = (uint)get_num();
if(index > 15)
return;
free(mlist[index]);
}
void edit(){
uint index;
size_t mem_size;
printf("index(0,15): ");
index = (uint)get_num();
if(index > 15)
return;
char* mbuf = mlist[index];
if(mbuf == NULL)
return;
printf("input size: ");
size_t input_size = get_num();
printf("Name: ");
read(0, mbuf, input_size);
}
void show(){
uint index;
printf("index(0,15): ");
index = (uint)get_num();
if(index > 15)
return;
char* mbuf = mlist[index];
if(mbuf == NULL)
return;
printf("%s\n",mbuf);
}
void init(){
setvbuf(stdin, 0, 2, 0);
setvbuf(stdout, 0, 2, 0);
setvbuf(stderr, 0, 2, 0);
}
void get_input(char *buf,size_t len){
int i;
char c;
for(i = 0; i < len; ++i ){
if(read(0,&c,1) < 1){
perror("Read faild!\n");
exit(-1);
}
if( c == '\n' )
break;
*(buf+i) = c;
}
*(buf+i) = 0;
}
int64 get_num(){
char buf[20] = {0,};
get_input(buf,20);
return atol(buf);
}
void menu(){
putchar(10);
puts("1. add");
puts("2. delete");
puts("3. edit");
puts("4. show");
puts("5. exit");
printf(">> ");
}
int main(int argc, char **argv){
init();
uint func = 0;
while(1){
menu();
int ret = scanf("%u",&func);
if(ret==0)
{
puts("Invalid choice!");
break;
}
switch(func){
case 1:
add();
break;
case 2:
delete();
break;
case 3:
edit();
break;
case 4:
show();
break;
case 5:
exit(0);
default :
puts("Invalid choice!");
break;
}
}
return 0;
}
编译后,只有pie没有开。
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x400000)
接下来,把几个简单的利用脚步放上来供大家参考。由于也是初学,脚步写的很烂,大神勿喷。
简要说明:
offbynull1.py是用把size改小的方法做的,这种比较麻烦。
offbynull2.py是用改标志位的方法做的。
houseoforce1.py将堆向低地址分配,通过修改got表劫持控制流。
houseoforce2.py将堆向高地址分配,通过修改malloc_hook劫持控制流。
其他脚步都是常规做法。
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|