gdb无法找到main
gdb无法找到main最近在用gdb调试一个程序的时候,由于程序经过了strip处理,没有debug信息,所以当b main的时候会出现”Function main not defined”错误信息,也就是无法定位main函数。而当b libc_start_main函数时是可以定位到的,而libc_start_main函数的第一个参数就是main函数的地址,因此可以通过定位__libc_start_main函数,然后获得第一个参数的内容,此时就是main函数的地址。具体操作如下:
传进__libc_start_main函数的参数查看汇编可以看到将__libc_start_main的第一个参数传进了$RDI寄存器中(64位机器):
因此在gdb中先在**libc_start_main函数下断点: b** libc_start_main
在$RDI指向的内容处下断点在 libc_start_main处下了断点后,run一下会在libc_start_main入口处停下,此时$rdi寄存器存储的是main函数的地址,b *$rdi则会在main处下断点
转自
gdb无法找到main | ...
FSOP
FSOP介绍FSOP 是 File Stream Oriented Programming 的缩写,根据前面对 FILE 的介绍得知进程内所有的_IO_FILE 结构会使用_chain 域相互连接形成一个链表,这个链表的头部由_IO_list_all 维护。
进程中打开的所有文件结构体使用一个单链表来进行管理,即通过_IO_list_all进行管理,在fopen的分析中,我们知道了fopen是通过_IO_link_in函数将新打开的结构体链接进入_IO_list_all的,相关的代码如下:
1234fp->file._flags |= _IO_LINKED;...fp->file._chain = (_IO_FILE *) _IO_list_all;_IO_list_all = fp;
从代码中也可以看出来链表是通过FILE结构体的_chain字段来进行链接的。形成的链表如下图所示:
看到链表的操作,应该就大致猜到了FSOP的主要原理了。即通过伪造_IO_list_all中的节点来实现对FILE链表的控制以实现利用目的。通常来说一般是直接利用任意写的漏洞修改_IO_lis ...
Foundry搭建和使用
Foundry搭建和使用Foundry介绍
Foundry 是一个智能合约开发工具链。
Foundry 管理您的依赖关系、编译项目、运行测试、部署,并允许您通过命令行和 Solidity 脚本与链交互。
开始使用 Foundry
要开始使用 Foundry,请安装 Foundry 并设置第一个项目。
启动 Foundry 项目
本节将向您概述如何创建和使用现有项目。
Forge 概述
本节概述将为您提供有关如何使用“forge”来开发、测试和部署智能合约所需的所有知识。
Cast 概述
了解如何使用“cast”与智能合约交互、发送交易以及从命令行获取链上数据。
Anvil 概述
了解 anvil, Foundry 的本地节点。
Chisel 概述
了解如何使用 chisel - Foundry 集成的 Solidity REPL。
Foundry 配置
Foundry 配置指引:
配置 foundry.toml
持续集成 CI
与 VSCode 集成
Shell 命令补全
静态代码分析器
与 Hardhat 集成
教程
与 Foundry 建立智能合约的教程。
使用 Solmat ...
fastbinattack---0ctfbabyheap
fastbinattack—0ctf2017babyheap题解和学习前言这篇文章主要是在学习fastbinattack中遇到的一些知识点的总结和在做babyheap的时候的遇到的问题。
fastbin 二次释放由于fastbin采用单链表结构,当chunk释放的时候并不会清空next_chunk的prev_inuse(这与fastbin的机制有关,为了多次利用,为了效率嘛),只要存在堆溢出和其他漏洞能够控制chunk的内容,即可更改fastbin的chunk的fd指针,使我们下次申请的空间是我们需要的任意地址,但是得绕过一些检查。
绕过fastbin检查机制fastbin dupfastbin对于二次释放的检查机制仅仅验证了当前块是否与链表头部的块相同,而对链表中其他的块没有做验证。此外还会检查当前块的size域与头部块的size域是否相等的检查。
于是我们可以先释放当前块,然后释放另一个相同大小的块,然后再释放当前块,就可以在fastbin的链表上形成一个循环链表,只要申请当前块大小的空间,都会是fastbin中的两个块。
fastbin dup consolidate这种绕过 ...
fastbin dup 来获取libc地址
fastbin dup 来获取libc地址
当我在做0ctf2017 babyheap的时候遇到利用fastbin dup 来泄露mainarena的地址来获取libc的地址,其他大佬给的wp没有讲如果通过泄露的smallbin的地址获取mainarena和获取libc的地址。
获取mainarena地址首先我们要知道
bin是由struct chunk结构体组成的链表。
不同的chunk更据特点的不同分为不同的chunk,为了将这些chunk进行分类管理,glibc采用了bin链这种方式管理不同的chunk。
不同的bin链是由arena管理的
bin链中的chunk均为free chunk。
主线程的main_arena保存在libc.so的数据段里面,其他线程的arena则保存在该arena分配的heap里面。
bin链的保存依赖struct malloc_state结构体
1234567891011121314151617181920212223242526typedef struct malloc_chunk* mchunkptr;typedef struct mall ...
fastbin attack报错内存损坏
fastbin attack报错内存损坏前言在做off-by-one的Plaiddb的时候研究到最后一步,将one_gagedt写入__malloc_hook的时候包了内存损毁的错误,在星盟安全群里面,各位师傅给了我回答,觉得挺有用的,写下来做个笔记
报错1234567[DEBUG] Received 0x19 bytes: 'PROMPT: Enter data size:\n'[DEBUG] Sent 0x3 bytes: '97\n'[DEBUG] Received 0x53 bytes: "*** Error in `PlaidDB': malloc(): memory corruption (fast): 0x00007f3d42a5672d ***\n"Traceback (most recent call last):
这个错误说的是从bins中申请堆块的时候 这个堆块的大小和这条链上的大小不一致
就会报错
1234567if (__glibc_likely (victim != N ...
ethernaut训练笔记
ethernaut训练笔记前言Ethernaut是一个类似于CTF的智能合约平台,集成了不少的智能合约相关的安全问题,这对于安全审计人员来说是一个很不错的学习平台,本篇文章将通过该平台来学习智能合约相关的各种安全问题,由于关卡较多,而且涉及合约的分析、攻击流程的演示所以篇幅较长,经过缩减最终定为两篇文章来分享。平台地址:https://ethernaut.zeppelin.solutions
环境准备
Chrome浏览器
插件——以太坊轻钱包MetaMask(https://metamask.io/)
在MetaMask中调整网络为测试网络,之后给自己的钱包地址充值ETH。
前置知识浏览器控制台在整个Ethernaut平台的练习中我们需要通过Chrome浏览器的控制台来输入一系列的命令实现与合约的交互,在这里我们可以直接在Chrome浏览器中按下F12,之后选择Console模块打开浏览器控制台,并查看相关信息:
具体的交互视情况而定,例如:当控制台中输入”player”时就看到玩家的地址信息(此时需实现Ethernaut与MetaMask的互动):当输入getBlance(play ...
ESP32 IoT CTF 清华校赛版
ESP32 IoT CTF 清华校赛版简介一个以ESP32为底座的新手向CTF IoT赛题,包括基本的硬件操作,串口调试,网络通信,WIFI,蓝牙,MQTT,固件提取等,总共13个flag。
环境搭建硬件:esp32、杜邦线、usb->ttl、支持嗅探的无线网卡
软件:
https://github.com/xuanxuanblingbling/esp32ctf_thu
ESP32 的 windows 烧录环境,直接链接下载离线安装包(一定要是离线安装包,否则安装很慢):
https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/get-started/windows-setup.html
选择赛题要求的对应版本就是,相近的也可以,赛题环境要求是4.3.1 ,我们选择提供下载的最低的4.4.8就行,太高了很容易出现不兼容的情况
完 ...
ERROR] Could not find a terminal binary to use. Set context.terminal to your terminal报错的解决办法
ERROR] Could not find a terminal binary to use. Set context.terminal to your terminal报错的解决办法由于在用docker做pwn题的时候attach时报错,网上找到了一个解决办法,为了防止以后找不到了,于是先记录一下
一、问题描述在用docker做pwn题的时候,在命令行界面进行pwntools的实验中,在调用gdb进行debug时会报这样一个错
[ERROR] Could not find a terminal binary to use. Set context.terminal to your terminal
其中部分实验代码如下:
123456from pwn import *p = process('./leakmemory')gdb.attach(p)
经过对源码的分析,我们知道是脚本在第9行调用gdb对p进程进行debug时,需要新开一个终端,也就是说在前面对新开终端的参数进行设置(即context.terminal=[])。
一开始我到/us ...
ELF文件格式
ELF文件格式
可重定位文件,包含由编译器生成的代码和数据。链接器会将它与其他目标文件链接起来从而创建可执行文件或者目标共享文件,在linux中,这种文件后缀一般为.o
共享目标文件,包含代码和数据,这种文件是我们所称的库文件,一般是以.so结尾。
一般有两种使用情形:
链接器将其生成为另一个目标文件。
动态链接器将它与可执行文件以及其他共享目标文件组合在一起生成进程镜像。
链接视图文件开始处是ELF头部,他给出了整个文件的组织情况
如果程序头部表存在的话,他会告诉系统如何创建进程。用于生成进程的目标文件必须有程序头部表,但重定位文件不需要这个表。
节区部分包含在链接视图中要使用的大部分信息:指令,数据,符号表,重定位信息。
节区头部表包含描述文件节区的信息,每个节区在表中都有一个表项,会给出节区名称,节区大小等信息。用于链接的目标文件必须有节区头部表,其他目标文件则无所谓。
数据形式ELF文件格式支持8位/32位体系结构,当然这种格式是可以扩散的,也可以支持更小的或者更大位数的处理器架构,因此,目标文件会包含一些控制数据,这部分数据表明了目标文件所使用的架构,这也 ...