网鼎杯-2024
初赛赛题名称:pwn2解题步骤:第一步:32位的一个栈迁移 首先打开是一个最简单栈溢出和32位rop链 但是仔细看了一下read函数限制了最大长度只有8字节,rbp和返回地址 加上上面的%p泄露了一下rsp的地址 然后就在栈上进行一下栈迁移一个就行了。 前面有一个用户的登录和密码 ida直接打开就能看见 第二步:这里借鉴了一下BUUCTF-ciscn_2019_es_2 因为这里直接是给了栈顶的位置 我们直接进行接一下就行了。因为存在格式化字符串漏洞%p直接进行泄露就行了 exp:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384from pwn import*from struct import packimport ctypes#from LibcSearcher import *def...
ctfshow-做题笔记-堆利用·前置基础
为防止题目难度跨度太大,135-140为演示题目阶段,你可以轻松获取flag,但是希望你能一步步去调试,而不是仅仅去拿到flag。 如何申请堆? pwn135没啥说的,ida反编译进去看一下源码就知道怎么做了。 简单了解一下堆的知识 malloc函数:作用:从堆内存中分配指定大小的内存块 1void* malloc(size_t size); 参数:size 是需要分配的字节数。 返回值:成功时返回指向已分配内存的指针;若分配失败,则返回 NULL。 特点:分配的内存不会被初始化,可能包含垃圾数据,需要手动清零。 calloc函数:作用:分配并初始化内存块(每个字节都会杯初始化为0)。 1void* calloc(size_t num, size_t size); 参数: num:需要分配的元素个数。 size:每个元素的大小(字节)。 返回值:成功时返回指向已分配内存的指针;若分配失败,则返回 NULL。 特点:分配的内存会被初始化为 0。 realloc函数:作用:重新调整已分配内存的大小 1void* realloc(void* ptr, size_t...
堆的前置知识
什么是堆?在程序运行过程中,堆可以提供动态分配内存,允许程序申请大小未定的内存。其实就是程序虚拟空间的一块连续的线性区域,它由低地址向高地址生长,并称管理堆的程序为:堆管理器。 堆管理器主要进行的工作: 响应用户的申请内存请求,向操作系统申请内存,并将其返回给用户程序。为了保持用户程序的高效性,内核一般都会分配一块很大的连续内存,让堆管理器通过某种算法对其进行管理。只有当堆空间不足时,才会与操作系统进行再次交互 管理用户释放的内存,用户释放的内存并不是直接返回给操作系统,而是由堆管理器进行管理,这样释放的内存可以来响应用户新申请的内存的请求 目前Linux标准发行版中使用的堆分配器是glibc中的堆分配器:ptmalloc2。ptmalloc2主要是通过malloc/free来分配和释放内存块。 ————————————————————————————- 堆和栈的区别 12345678910111213141516171819高地址--->+---------------------------+ | ...
NewStarCTF 2024
NewStarCTF 20241https://match.ichunqiu.com/index?k=AzZXZ11uAmJQOAAxB3Zcfld1UDVScQBkBjoEMFRhDzgGM15pDTUEZQI3BmZUYlc2 pwn签到2024.10.3 nc之后满足条件就行了 Game2024.10.3 1234567891011121314151617181920212223void __noreturn game(){ int v0; // [rsp+0h] [rbp-10h] BYREF int v1; // [rsp+4h] [rbp-Ch] unsigned __int64 v2; // [rsp+8h] [rbp-8h] v2 = __readfsqword(0x28u); v1 = 0; v0 = 0; puts("Let's play a game!"); alarm(5u); while ( 1 ) { printf("pls input you num:...
2024-强网拟态
...
ctfshow-做题笔记-整数安全
ctfshow-做题笔记-整数安全 1234567891011整数溢出原理整数分为有符号和无符号两种类型,有符号数以最高位作为其符号位,即正整数最高位为1,负数为0,无符号数取值范围为非负数,常见各类型占用字节数如下:类型 占用字节数 取值范围Int 4 -2147483648~2147483647 32位 Short int 2 -32768~32767Long int 4 -2147483648~2147483647Unsigned int 4 0~4294967295Unsigned short int 2 0~65535Unsigned short int 4 0~4294967295对于unsigned short int类型的两个变量var1、var2假定取值var1 = 1,var2 =...
ctfshow-做题笔记-格式化字符串
ctfshow-做题笔记-格式化字符串pwn91日常检查 12345678bbq@ubuntu:~/桌面/pwnCTF/pwn91$ checksec pwn[*] '/home/bbq/桌面/pwnCTF/pwn91/pwn' Arch: i386-32-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x8048000)bbq@ubuntu:~/桌面/pwnCTF/pwn91$ 还是很简单的 就直接赋值就行应该 啊啊啊啊啊啊啊啊啊啊啊啊啊 我是真废啊 123456789101112int __cdecl main(int argc, const char **argv, const char **envp){ init(&argc); logo(); ctfshow(); if ( daniu == 6 ) { ...
基本的栈溢出
栈溢出介绍 栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变。这种问题是一种特定的缓冲区溢出漏洞,类似的还有堆溢出,bss 段溢出等溢出方式。栈溢出漏洞轻则可以使程序崩溃,重则可以使攻击者控制程序执行流程。此外,我们也不难发现,发生栈溢出的基本前提是: 程序必须向栈上写入数据。 写入的数据大小没有被良好地控制。 基本栈栈是一种先进后出的数据结构,主要有PUSH和POP两种操作,都是对栈顶的元素进行操作。 内存中从高地址向低地址生长,高地址为父函数的栈帧 基本实例: 最典型的栈溢出利用是覆盖程序的返回地址为攻击者所控制的地址,当然需要确保这个地址所在的段具有可执行权限 1234567891011121314151617181920212223#include <stdio.h>#include <string.h>void success(void){ puts("flag{You Hava already controlled...
格式化字符串
格式化字符串漏洞格式化字符串漏洞函数: 以printf函数为例,它的第一个参数就是格式化字符串:“Color %s,Number %d,Float %4.2f” 然后printf函数会根据这个格式化字符串来解析对应的其它参数。 漏洞原理利用:程序崩溃:最简单的的攻击方法,只需要输入一串%s就可以 %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s 对于每一个 %s,printf() 都会从栈上取一个数字,把该数字视为地址,然后打印出该地址指向的内存内容,由于不可能获取的每一个数字都是地址,所以数字对应的内容可能不存在,或者这个地址是被保护的,那么便会使程序崩溃 在 Linux 中,存取无效的指针会引起进程收到 SIGSEGV 信号,从而使程序非正常终止并产生核心转储 基本的格式化字符串漏洞的格式12//比如正确的写法是:printf("%s",...