第4章_Linux安全机制
Stack Canaries简介Stack Canaries 是一种对抗栈溢出攻击的技术,即SSP安全机制,有时也叫Stack cookies, 他是一个随机数,保存在栈上,比函数返回地址更低的位置,因为要想覆盖到返回地址,必然先覆盖到Canary,所以在函数返回前检查Canary是否变化,就可以达到保护栈的目的。
写程序测试
1234567#include <stdio.h>int main(){ char buf[10]; scanf("%s", buf); return 0;}
1gcc -fstack-protector main.c -o main
运行,输入过长的字符,发现程序抛出异常stack smashing detected,表示检测到了栈溢出
12345╭─ ~/Desktop/testC ✔ ╰─ ./main 1111111111111111111111111111*** s ...
2022_虎符CTF_部分RE_WP
fpbe根据知乎这篇文章 https://zhuanlan.zhihu.com/p/467647354作者在编写程序中 有用到fpbe.bpf.c这个源文件,而在这个文件中用到了BPF_KPROBE(uprobe),这个函数就是在那个fpbe程序中的uprobed_function之前执行,但是BPF_KPROBE(uprobe) 是ebpf字节码形式的,IDA看不到,所以先binwalk提取出用ebpf字节码的那部分来,然后用llvm-objdump -d xxx.o 提取,就可以看到验证的函数了
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899F4018.elf: file format ELF64-BPFDisassembly of section upr ...
第2章_二进制文件
看到静态链接和动态链接这里,静态链接和windows上感觉一样,就不写了,感觉这里有个位置无关代码和延迟绑定挺有意思,记录一下
位置无关代码 在windows平台上,对于DLL文件的全局变量,在DLL加载到内存中后,要是没有加载到对应的位置,需要重定位,这个时候就需要重定位表, 而这里提到了一个位置无关代码的概念,可以加载而无需重定位的代码称为位置无关代码(Position-Independent Code, PIC),通过GCC传递 -fpic 参数就可以生成PIC。
1个ELF文件本身,数据段和代码段的相对距离是不变的,因此指令和变量之间的举例就是一个运行时常量,与绝对地址无关,这就是PIC的核心。
全局偏移量表GOT(Global Offset Table)被拆分为.got节和.got.plt节,可以理解为是个数组,单位是8字节
.got 不需要延迟绑定,用于保存全局变量引用,加载到内存标记为只读
.got.plt 需要延迟绑定,保存函数引用,具有读写权限
写代码测试下 (比书上多加了一个func2,为了测试延迟绑定调用那个_dl_runtime_resolve前的p ...
2022_SUSCTF_tttree题解
2022_SUSCTF_tttree题解这道题比赛时,逆出了整个节点结构体,就是最后通过二叉树找到索引的时候不会了,只爆破出来了flag的4位,后来看了看别人的WP才发现程序中是存着节点之间的关系的(可惜啊,当时调试还是没有足够的耐心啊,这里复现下,
首先将程序去除ASLR, 用CFF Explorer打开程序,去除去除DLL Can move的属性,然后保存,这样每次程序加载的基址就不会变,就可以方便的下断点了
输入flag,按下暂停键,
然后回车,程序断下,直接ALT+F9 运行到用户代码
观察堆栈,可以发现在00014000E1B0的位置处存着输入的flag,直接转过去,下硬件断点,然后执行
发现程序是从1开始验证的,正好略过了前面的SUSCTF,也就是说他会检测SUSCTF{xxx } 里的 xxx,这里就会发现程序用了花指令,每一段里面存放着1条真正的指令
一路F7,观察执行的汇编,整理
1234567891011121314RAX是自己输入的字符 # 0x31RDX # 0X60 每一次都是固定的RCX # mov ecx, dw ...
VNCTF2022_RE_复盘
VNCTF2022_RE_复盘1.BabyMaze题目给出一个 BabyMaze.pyc 文件,尝试用uncompyle6反编译,但是失败 ,于是用脚本反汇编
1234567891011121314151617181920212223242526# 安装环境import disimport marshalimport sysheader_sizes = [ # (size, first version this applies to) # pyc files were introduced in 0.9.2 way, way back in June 1991. (8, (0, 9, 2)), # 2 bytes magic number, \r\n, 4 bytes UNIX timestamp (12, (3, 6)), # added 4 bytes file size # bytes 4-8 are flags, meaning of 9-16 depends on what flags are set # bit 0 not s ...
networkx 解决CTF_RE图最短路径问题
networkx 解决CTF_RE图最短路径问题前言最近复现了了下今年L3HCTF的IDAAAAA题,然后通过此题又联想到了之前做的一道特殊的迷宫题invisible_maze-fix,发现通过python的networkx解决此类问题相当的方便,因此记录下解题过程,方便以后查询。
2道题目附件👇
链接:https://pan.baidu.com/s/1reVYGScanSCs5H4ykl60vw提取码:kvhl
invisible_maze常规的迷宫题目在CTF逆向题目中,常规的迷宫题目一般是程序给你一个非常长的字符串,然后自己整理可以得到整个迷宫的全貌,比如下图这种
这种能很容易的得到整个迷宫的路径,可是这个invisible_maze这个题才可以说是是真正的迷宫题,因为它没有从上帝视角给你路径的全貌,而是把你放到了个迷宫中,每走一步,它告诉你,上下左右分别去哪
本题题解分析IDA打开程序分析
进入sub_401050函数, 程序告诉你上下左右走的话是什么东西,很明显,只有进入另一个函数路才是通的
直接查找字符串,交叉引用来到成功的地方
可以发现只有进入到sub_ ...
IDAPython 学习笔记
摘要比着大佬写的文章系统的学习下IDAPython,做下笔记,供自己以后查询
大佬的文章,👇
https://www.cnblogs.com/iBinary/p/14642662.htmlhttps://www.cnblogs.com/iBinary/p/14672540.htmlhttps://www.cnblogs.com/iBinary/p/14801928.html
IDAPython参考学习文档
IDAPython官方函数文档: https://www.hex-rays.com/wp-content/static/products/ida/support/idapython_docs/
IDA版本变化后IDAPython对应差异函数查询:https://www.hex-rays.com/products/ida/support/ida74_idapython_no_bc695_porting_guide.shtml
IDA中获取界面中地址函数
作用
老版函数
新版函数
获取当前指令地址(光标点击的那个,灰色阴影那行)
idc.ScreenEA()
idc ...
2道CTF_APK题不能调试的解决方法及引发的思考
2道CTF_APK题不能调试的解决方法及引发的思考前言最近找到2个安卓题目来练习,分析后发现如果可以调试的话会大大降低难度(一道是JEB调试,一道是IDA调试so文件),于是我用工具开始调试,发现都没有办法调试,经过各种查阅资料终于可以调试了,于是写下此文,记录下环境配置。
链接:https://pan.baidu.com/s/1nYwqxmipw_marYN6wKJjAg
提取码:9rxq
题目:CTF_2.apk遇到问题JEB调试APK的时候, 先adb shell, 然后查看进程ID,为4546
123beyond1q:/ # ps | grep "ctf"ps | grep "ctf"u0_a44 4546 1876 964728 83108 d772dcc0 S com.example.ctf
打开JEB附加
没法调试,下面开始解决
解决问题打开Manifest ,发现并没有android:debuggable="true"
先解包 apktool.bat d CTF_2 ...
Python 常用数据类型转换
Python 常用数据类型转换在CTF中,经常需要各种数据类型之间的转换
struct模块
官方文档: https://docs.python.org/zh-cn/3.10/library/struct.html
C语言数据结构与python bytes之间的转换
12345678910111213141516171819In [1]: import struct In [2]: struct.pack("<LLLL", 1,2,3,4) ...
2021西湖论剑_RE_WP
2021西湖论剑_RE_WPTacticalArmedIDA打开发现有TLS回调函数,如果没有调试就初始化4个值
直接patch,强制jmp到4010F1的位置
第50行,v21那里是每次执行的指令
写OD脚本,在004014A3和 40146D位置下断点,OD运行脚本,打印出下图中一轮来
12345678910111213141516var fvar xmov f,"C:\\Users\\ZSKY\\Desktop\\xihulunjian\\log.txt"vv:RUNcmp eip,004014A3je stopcmp eip,40146Djnz vvstiopcode eipeval "{eip} : {$RESULT_1}"wrta f,$RESULTjmp vvstop:pause
1234567891011121314151617181920212223242526272829303132335AC720 : mov ecx,dword ptr ds:[0x405748] ...