BugKu-树木的小秘密
这个题:
当我们用die看这个文件的时候,通过里面的打包方式,要对他进行拆分,一个exe文件可能不是一个exe文件
die 的时候,要慢慢看下面的内容,而不是看到一个32位或者64位就开始反编译。
过程:
用Die打开看看
第一行就是打包方式:
起始当你在下这个文件的时候是4Mb 就已经发现了不对劲
然后通过百度看看这个PyInstaller(-)[-]
然后就是来提取一下,首先要把 pyinstxtractor.py 和目标文件放在一起。然后执行
1python pyinstxtractor.py easy_reverse.exe
这样就提取成功了
这里看123 这个文件就能直接得到一个base64编码的东西解码就是flag
这里看到好多pyc xxx 奇奇怪怪的文件
通过百度有一个
uncompyle6 这个工具
1uncompyle6 -o [目标文件名字] [源文件]
如下:
就得到一个a.py的文件
格式化字符串(37)
首先啥是格式化字符串
这里借用维基百科中的内容:
格式化字符串(英语:format string)是一些[程序设计语言]的输入/输出[库]中能将[字符串]参数转换为另一种形式输出的[函数]。例如C、C++等程序设计语言的printf类函数,其中的转换说明(conversion specification)用于把随后对应的0个或多个函数参数转换为相应的格式输出;格式化字符串中转换说明以外的其它字符原样输出。[1]
关闭地址随机化
可以先查看一下
1cat /proc/sys/kernel/randomize_va_space
然后再root用户下:
1echo 0 > /proc/sys/kernel/randomize_va_space
这样就关闭的地址空间随机化
首先来看看printf中的%
%[标志][输出最小宽度][.精度][长度]类型
1.输出最小宽度:用十进制整数来表示输出的最小位数。
若实际位数多于定义的宽度,则按实际位数输出
若实际位数少于定义的宽度则补空格或者0
2.类型
%c:输出字符,配上%n可用于向指定地址写数据。
这个配上%n就比牛了
...
选择排序
选择排序最简单最垃圾的排序算法
在写的时候
由简单到复杂
验证一步走一步
多打印中间结果
先局部后整体
没思路先细分
先粗糙后精细
变量更名
语句合并
边界处理
思路:
经过一次一次的遍历总体找到最小的数放在最前面,已经放好的不在改变。
首先假设第一个是最小的,然后将这个数和后面的每一个数进行对比,如果找到了更小的数就把该数和假设的数进行交换。
数组arr 是通过下标进行操作的,所以我们需要有一个int型的变量来存放这个下标
也就是下面使用到的Min_Pro
在进行交换的时候,同时需要一个临时的变量来存放之前的数来进行交换,也就是下面使用到的temp变量
12345678910111213141516171819202122#include <stdio.h>#include <string.h>int main() { char arr[] = {1,4,7,2,5,8,3,6,9};//对这个数组进行排序 //printf("%d",sizeof(arr)); for (int i = 0 ...
算法基本概念
什么是数据结构?
Data Structure
存储数据的不同方式
就是数据结构
什么是算法?
同一个问题不同的解决方法
算法往往是针对特定数据结构的
在进行算法的时候
需要选定特定的数据结构,不同的数据结构有各自的优缺点
算法的优势,缺点
时间测算
计算算法时间差
幅度不够循环来凑【循环某个算法,扩大使用时间来判断时间差】
空间测算
Big O
用于描述算法的复杂程度
忽略低次项
时间复杂度
规模的扩大n,时间的变化规律【和函数差不多】
O(1);O(n)
求一个数组的平均数
O(n)
空间复杂度
BJDCTF2020 JustRE (13)
首先是下载附件
然后打开看到是32位的文件
然后用IDA打开看看
进去看到有main函数,但是没有啥思路
用shift+f12看看字符串
通过强大的眼里看到这个地方,点过去看看
这里就考察了一个sprintf函数没了…
flag{1999902069a45792d233ac}
Linux-GDB动态调试
1.在自己写的程序需要用GDB的时候
需要用-g 来编译
1gcc test.c -g -o test
2.
ROP编程(36)
ROP编程什么是ROP?ROP是一种–返回导向编程,这是一种高级的内存攻击技术,可以用来进行绕过。绕过一些防御,比如:内存不可执行和代码签名。
栈溢出的特点是ret处,那么ROP的核心思想就是利用ret结尾指令序列吧栈中应该返回EIP的地址改成我们需要的值,从而控制程序的执行流程
ROP是一种绕过开启了NX一种办法。NX是:不可执行的意思。
NX原理:将数据所在内存页标志为不可执行,当程序溢出成功转入shellcode的时候,程序会尝试在数据页面上执行指令,这个时候CPU就会抛出异常,而不是去执行恶心代码。
当NX开启的时候,往栈上或者堆上注入代码的方法难以发挥效果。
这个时候就可以用ROP来进行绕过。
ROP思想:在栈缓冲区溢出的基础上,利用程序中已有小片段【gadgets】来改变某些寄存器或者变量的值,从而控制程序的执行流程。
gadgets
就是以ret结尾的指令序列。
通过这些指令序列,我们可以修改某些地址的内容,方便控制程序的执行顺序
核心在于
利用指令集中的ret指令,改变了指令流的执行顺序
条件
程序存在溢出,并且可以控制返回地址
可以找到满足条件的g ...
堆溢出(35)
堆溢出的原理堆溢出,本质上和栈溢出我感觉差不多。【缓冲区溢出的一种】
主要就是写入的字节的数目,超过了声请的空间。倒置覆盖掉物理相邻的高地址的下一个堆块。
前提
要有数据的写入(gets())
写入的数据没有良好的被控制
对于攻击者来说:堆溢出可以程序崩溃也可以控制程序的执行
但是堆溢出无法控制EIP所以
利用的方法有
覆盖与之相邻的下一个chunk的内容
prev_size
size,主要有三个比特位,以及该堆块真正的大小
NON_MAIN_ARENA
IS_MAPPED
PREV_INUSE
the True chunk size
chunk content,从而改变程序固有的执行流。
2.利用堆中的机制(如unlink)来实现任意地址写入(Write-Anything-Anywhere)或控制堆块中的内容等效果,从而来控制程序的执行流
例子123456789#include <stdio.h>int main(void){ char *chunk; chunk=malloc(24); puts("Get ...
栈溢出实战(34)
栈溢出原理由于C语言对数组引用不做任何边界检查 ,从而导致缓冲区溢出。
栈没有保护,指针可以通过传入的参数的大小,一直基于基地址往上指。
缓冲区溢出:
栈溢出
栈上保存着局部变量和一些状态信息(寄存器值,返回地址…)
发生了溢出就可以做到随意的该这些状态信息。并且攻击者可以通过覆写返回地址来执行代码,利用方法包括shellcode注入,ret2text,ret2libc ,ROP…
堆溢出
实现
首先你得能在栈上写数据
写入的数据大小没有被检测或者未被检测到
12345678910111213#include <stdio.h>#include <string.h>void success() { puts("You Hava already controlled it."); }void vulnerable() { char s[12]; gets(s); puts(s); return;}int main(int argc, char** argv) { vulnerable( ...
保护机制(33)
Windows保护机制数据保护(DEP) 是一项安全功能,可有助于防止计算机受到病毒和其它安全威胁的损坏。 有害程序可能尝试从为Windows 和其它授权程序保留的系统内存位置运行(也称为执行)代码,以攻击Windows。 这些类型的攻击可能会损害您的程序和文件
还有其他的:
https://xineting.github.io/2018/11/03/windows%E4%BF%9D%E6%8A%A4%E6%9C%BA%E5%88%B6/
DEP全称Data Execution Prevention,是Windows平台的一个说法。早年的DEP分硬件DEP和软件DEP,软件DEP实际上是指SafeSEH。现在大部分提到DEP都是指硬件DEP,也叫NX(编译选项/NXCOMPAT)。
Linux上只有硬件DEP(因为异常处理并非SEH机制),但Linux上一般不用DEP来描述,而是仅仅用NX。
NX的作用是防止数据页上的数据被当成代码来执行,x86是通过PAE的扩充位来标志PTE内存页是否具有可执行权限。开启了NX后,数据页(首当其冲的就是堆页和堆栈页)就不再具有可执行权限。X64因为 ...