吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6324|回复: 3
收起左侧

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

[复制链接]
吾爱游客  发表于 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劫持控制流。
其他脚步都是常规做法。

exps.zip

5.65 KB, 下载次数: 5

几个利用脚步,不包括IO_FILE利用

heap_exp.zip

3.91 KB, 下载次数: 5

二进制 64位 libc2.23

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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 来自手机
卧槽!这一堆代码完全看不懂的说!还得专业的才看的懂!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 12:22

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表