CTFwiki之基本ROP
CTFwiki之基本ROP现在才知道CTFwiki上有这么多的好东西,果断转换到这里来学,在这里能学到很多好东西。
基本 ROP - CTF Wiki (ctf-wiki.org)
这是官方给出的wp。
接下来开始写我自己对这些题的理解和收获。
ret2text原理
ROP的基本原理就是栈溢出,只是通过栈溢出,然后返回的地址不同罢了。这里就是返回回程序本来就有的函数。
由给出的题来解释这个原理。
题目
通过checksec和file命令查出该文件只开启了堆栈不可执行保护,是个32位的程序。
ida反汇编看出来,这里存在栈溢出漏洞。
接下来就是寻找该数组到返回地址的偏移是多少来控制返回地址。
其实这里是可以看出来偏移为多少的,但是ida算出来的偏移地址有时候是有问题的,最好是以gdb调试出来的返回地址为准。(这里的偏移地址就有问题,这里算出来是0x68,但是实际上并不是,貌似可能是ida的机制问题,没有去细细研究)
接下里就是通过gdb调试来调试出偏移地址。
1230x80486a7 <main+95> lea eax, [esp + 0x1c] 0x ...
CTF PWN 题之 setbuf 的利用
setbuf 的利用前言在学习IO_FILE的时候,学到关于IO_FILE结构体的时候死活都不理解为什么在pwn题要设置缓冲区才能够有显示,不设置的话就没有显示,学到了setbuf的时候了解到了setbuf的利用,于是写这篇笔记,算是对自己的学习加深理解,文章很多参考其他师傅的,后面会给出参考链接
setbuf关于IO__FILE的结构体介绍和几个std(stdin,stdout,stderr)这里就不介绍了。有兴趣的师傅可以参考我的另一篇笔记
C 库函数 void setbuf(FILE *stream, char *buffer) 定义流 stream 的缓冲区在哪。除非 buffer 是 NULL 。
也就是说buffer这个数组会被设置为stream的缓冲区,当你调用 setbuf 函数并将其 BUFF 参数设置为 NULL(通常用数字 0 表示)时,你正在告诉标准I/O库停用缓冲机制。
deme案例为了方便理解setbuf函数的用法,这里写两个demo案例
demo (setbuf buff)代码如下
12345678#include<stdio.h>i ...
CPU卡加密系统与M1加密系统比较
CPU卡加密系统与M1加密系统比较非接触CPU卡与逻辑加密卡1、 逻辑加密存储卡逻辑加密存储卡:在非加密存储卡的基础上增加了加密逻辑电路,加密逻辑电路通过校验密码方式来保护卡内的数据对于外部访问是否开放,但只是低层次的安全保护,无法防范恶意性的攻击。
早期投入应用的非接触IC卡技术多为逻辑加密卡,比如最为著名的Philips公司(现NXP)的Mifare 1卡片。非接触逻辑加密卡技术以其低廉的成本,简明的交易流程,较简单的系统架构,迅速得到了用户的青睐,并得到了快速的应用和发展。据不完全统计,截至去年年底,国内各领域非接触逻辑加密卡的发卡量已经达到数亿张。随着非接触逻辑加密卡不断应用的过程,非接触逻辑加密卡技术的不足之处也日益暴露,难以满足更高的安全性和更复杂的多应用的需求。特别是2008年10月,互联网上公布了破解MIFARE CLASSIC IC芯片(以下简称M1芯片)密码的方法,不法分子利用这种方法可以很低的经济成本对采用该芯片的各类“一卡通”、门禁卡进行非法充值或复制,带来很大的社会安全隐患。因此,非接触CPU卡智能卡技术正成为一种技术上更新换代的选择。
2、非接触CPU卡非接 ...
CPU 的 ring0,ring1,ring2,ring3
CPU 的 ring0,ring1,ring2,ring3Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3。Windows只使用其中的两个级别RING0和RING3,RING0只给操作系统用,RING3谁都能用。如果普通应用程序企图执行RING0指令,则Windows会显示“非法指令”错误信息。
ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之…… 拿Linux+x86来说, 操作系统(内核)的代码运行在最高运行级别ring0上,可以使用特权指令,控制中断、修改页表、访问设备等等。 应用程序的代码运行在最低运行级别上ring3上,不能做受控操作。如果要做,比如要访问磁盘,写文件,那就要通过执行系统调用(函数),执行系统调用的时候,CPU的运行级别会发生从ring3到ring0的切换,并跳转到系统调用对应的内核代码位置执行,这样内核就为你完成了设备访问,完成之后再从ring0返回ring3。这个过程也称作用户态和内核态的切换。
RING设计的初衷是将系统权限与程序分离出来,使之能够让OS更好的管理当前系统资源 ...
const和static的区别
const和static的区别const
const修饰的变量不能被更改,但是const修饰又有三种特殊的修饰方法。
const修饰指针——常量指针
const修饰常量——指针常量
const既修饰指针,又修饰常量
const修饰指针1const int *p = &a;(p为常量指针)
在被const修饰后,p为常量指针。
常量指证:指针的指向(即指向的地址)可以修改,但是指向的
数值不能修改。
const修饰常量1int *const p = &a;(p为指针常量)
指针常量:指针的指向不可以修改,指针指向的值可以修改
const既修饰指针,又修饰常量1const int* const p = &a;
指针指向的值和指向的地址都不能改。
staticstatic修饰的变量为全局变量,在局部函数进行完之后不会被销毁。
static修饰也有三种办法。
static修饰局部变量——静态局部变量
static修饰全局变量——静态全局变量
static修饰函数——静态函数
static修饰局部变量static可使得局部变量出了自己的范围也不会销毁,本质 ...
Colab使用教程
Colab使用教程前言有兴趣学习了李宏毅的Machine learning and deep learning的教程,对教授提出来的使用Google Colab作为训练神经网络的平台深感有用,特此记录使用方法
一、Colab介绍在第一次使用Colab时,最大的困难无疑是对整个平台的陌生而导致无从下手,因此我们首先介绍一些与Colab相关的基础概念,以帮助大家更快地熟悉Colab平台。
Colab是什么?Colab = Colaboratory(即合作实验室),是谷歌提供的一个在线工作平台,用户可以直接通过浏览器执行python代码并与他人分享合作。Colab的主要功能当然不止于此,它还为我们提供免费的GPU。熟悉深度学习的同学们都知道:CPU计算力高但核数量少,善于处理线性序列,而GPU计算力低但核数量多,善于处理并行计算。在深度学习中使用GPU进行计算的速度要远快于CPU,因此有高算力的GPU是深度学习的重要保证。由于不是所有GPU都支持深度计算(大部分的Macbook自带的显卡都不支持),同时显卡配置的高低也决定了计算力的大小,因此Colab最大的优势在于我们可以“借用” ...
Cobalt Strike BOF原理分析
Cobalt Strike BOF原理分析0x01 Beacon Object File BOF(Beacon 对象文件)是C/C++编译,但未链接产生的Obj文件,BOF运行在Beacon进程中,并执行内部的Beacon API和Win32 API函数。BOF本质是COFF Obj文件,其符合COFF文件格式规范,结构类似于windows PE文件格式。在被Cobalt Strike加载和使用过程中,BOF是一段地址无关的Shellcode,BOF本身体积比较小,在传输过程中,适用于那些传输带宽小的模式,然后其本身运行在beacon进程内部,不会重新创建进程,也可以有效规避EDR。
0x02 如何开发BOF 下面是官方提供的一个demo
12345#include <windows.h>#include "beacon.h"void go(char * args, int alen) { BeaconPrintf(CALLBACK_OUTPUT, "Hello World: %s", arg ...
CISCN2023初赛复现
CISCN2023初赛复现funcanary12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455from pwn import *import binasciicontext.log_level = 'debug'context.os = 'linux'context.terminal = ['tmux', 'splitw', '-h']local = 1elf = ELF('./funcanary')def db(): if (local): gdb.attach(p)def exp(): global p if local: p = process('./funcanary') else: p = remote('47.9 ...
CISCN-PWN复现
CISCN-PWN复现ezheap123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687# --------------------------exploit--------------------------def exploit(): li('exploit...') # add(0xf0,"A"*0x20) #0 # add(0xf0,"A"*0x20) #1 # add(0xf0,"A"*0x20) #2 # add(0xf0,"A"*0x20) #3 # delte(2) # delte(1) # edit(0,0x150,"B"* ...
Chisel-1.9.1逆向分析
Chisel-1.9.1逆向分析前言为了写针对Chisel的内网穿透工具的流量报警,这里对该工具进行流量分析和逆向分析
逆向解析命令行123456version := flag.Bool("version", false, "")v := flag.Bool("v", false, "")flag.Bool("help", false, "")flag.Bool("h", false, "")flag.Usage = func() {}flag.Parse()
这段代码用于处理命flag包的作用是帮助Go程序处理命令行参数和选项。
flag包的作用是帮助Go程序处理命令行参数和选项。它允许程序员定义各种命令行标志,然后在运行程序时根据传递的参数来设置这些标志的值。这有助于使命令行工具更加灵活,并且能够接受用户提供的参数来控制程序的行为。
一旦使用flag.Parse()解析了命令行参数,程序就可以根据这些参 ...