发表于 2019-1-27 17:50

申请会员ID:offbyn0ll【未报到,账号注销】

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等漏洞利用模型。做题过程中,自己给自己加限制条件,使用多种解法解出来。
源码:
//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;
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 = mbuf;
}

void delete(){
    uint index;
    printf("index(0,15): ");
    index = (uint)get_num();
    if(index > 15)
      return;
    free(mlist);
}

void edit(){

    uint index;
    size_t mem_size;

    printf("index(0,15): ");
    index = (uint)get_num();
    if(index > 15)
      return;
    char* mbuf = mlist;
    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;
    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 = {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劫持控制流。
其他脚步都是常规做法。

Hmily 发表于 2019-1-28 10:49

I D:offbyn0ll
邮箱:offbyn0ll@sina.com

申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。

ps:登录后把文章整理下发到脱壳破解区吧。

Hmily 发表于 2019-2-12 14:19

未报到,账号注销。

sunny呀 发表于 2019-2-27 14:39

卧槽!这一堆代码完全看不懂的说!还得专业的才看的懂!
页: [1]
查看完整版本: 申请会员ID:offbyn0ll【未报到,账号注销】