学习pwn2
脚本中gdb调试之前不知道自己哪里有问题,现在懂怎么改了
from pwn import *context(log_level='debug', arch='amd64', os='linux')context.terminal = ["tmux", "splitw", "-h"]p=process('./pwn')gdb.attach(p,'b* 0x4013C2')
第三行是关键点,之后在想gdb调试的地方添加gdb.attach语句即可
使用时,先提升终端的权限为root,再输入tmux,之后进入tmux的界面之后运行脚本即可
简化书写uu64 = lambda x: u64(x.ljust(8, b'\x00'))s = lambda x: p.send(x)sa = lambda x, y: p.sendafter(x, y)sl = lambda x: p.sendline(x)sla = la ...
qemu学习
前言我只使用了一下用户态
安装sudo apt-get install qemu-usersudo apt-get install qemu-use-binfmt qemu-user-binfmt:i386sudo apt install gdb-multiarch
程序如果是动态链接的话还需要动态链接库
apt search "libc6-" | grep "aarch64"
apt install libc-aarch64-cross
sudo apt install gdb-multiarch
运行qemu-arm -L /usr/arm-linux-gnueabi ./program
调试qemu-arm -g 1234 -L /usr/arm-linux-gnueabi ./program
另起一个shell,然后
gdb-multiarch (gdb) file ./program # 也要在本地加载远程的目标程序Reading symbols from ./program(No debugging symbols fo ...
安卓学习
买了google pixel,重新学一遍安卓逆向。搞一搞frida。root跟着网上的教程来,不过中途挺曲折的,但是已经一个月前root的了,具体
就不记录了。(当初怎么忘记记录了啊!!)
LSPosed安装此模块时发现未启用Zygisk,在Magisk中右上角设置,启用Zygisk即可。
MT管理器 NP管理器adb install <电脑上的路径>
MT管理器存在activity记录的功能
adb 使用
https://blog.csdn.net/u010610691/article/details/77663770
开发者助手进行apk资源分析
核心破解可以解决同apk不同签名时安装失败的问题
算法助手很牛逼的调试工具
可以进行动态插桩
log插桩流程
将插桩所用dex加进apk中,注意重命名,例如classes2.dex 序号要顺延
在需要插桩的位置(只能插桩寄存器)插入代码
invoke-static {对应寄存器}, Lcom/mtools/LogUtils;->v(Ljava/lang/Object;)V
重新打包签名安装 ...
unlink学习
前言unlink学习地址
https://www.yuque.com/hxfqg9/bin/ape5up#G0M19
how2heap unsafe_unlink
还有bilibili视频星盟安全
https://www.bilibili.com/video/BV1Uv411j7fr?p=20&vd_source=a85daf8eb54f32264d9f6976d087fe98
这两个讲的unlink挺好的,尤其是第一个how2heap跟着调试一遍程序就完全理解了
unlink 思路在此不会详细讲解unlink的原理,写博客的目的是为了我以后回过头来看能快速理解
我们malloc两块内存,第一块内存大小限制比较少,第二块申请的内存大小必须大于等于0x80(保证不落于fastbin)
edit第一块内存和第二块内存的头部(通过溢出),内存布局是这样的
下面的chunkptr指的是存储了下面chunk地址的全局变量
一般来说题目中会有将malloc的内存地址放在一个全局变量数组里当做页码,这时候就满足这个要求了
0000000000000000 ...
被迫学习docker
前言就如标题所言,这篇文章是(被迫)学docker写出来的。
事情的起因是这样的,我最近在学堆,需要编译一个libc2.23的题目,问过pwn爹之后才知道,在本机时肯定不行 的,需要在docker里用ubuntu16.04编译。
于是就开始了docker的学习。
当然下面的docker学习仅限我能用就行(不够用了再学)
安装docker
https://zhuanlan.zhihu.com/p/675938110
本着能用就行的原则,我选择了直接apt安装。
sudo apt updatesudo apt install docker.io docker-compose
之后查看是否正确安装
docker -v
生成镜像我们的镜像是基于ubuntu16.04的,因此首先要先拉取一个ubuntu16.04。
docker pull ubuntu:16.04
现在我们本地已经有了ubuntu16.04镜像,之后就需要写dockerfile,docker通过dockerfile来生成我们需要的镜像。
我现在有了我需要编译程序的源代码,将其命名为fastbins.c,我需要用ubu ...
一些东西
1 32位linux_server无法使用报错信息:
./linux_server: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
解决方法:
https://blog.csdn.net/qin9800/article/details/106342940/
sudo apt-get install lib32stdc++6
2 终端不走clash代理
https://www.cnblogs.com/tany-g/p/17783416.html
export http_proxy=http://127.0.0.1:7890export https_proxy=$http_proxy
set http_proxy=http://127.0.0.1:7890set https_proxy=http://127.0.0.1:7890
这种解决方法是可以让当前这个终端走代理,如果不想每次都输入一遍的话就修 ...
ponce学习
前言最近看n1ctf题解的时候看到了一个IDA插件,用来符号执行的,简单的理解就是一个更简单的angr,比angr使用要方便一点,叫做ponce。
https://github.com/illera88/Ponce
安装直接把Ponce编译好的版本全部粘贴到IDA的插件文件夹中即可。
使用Ponce是一个符号执行的工具,按照我的理解,符号执行就是将输入看作一个变量(符号),然后通过动态执行能够将这个变量所满足的所有约束条件找到,这些约束条件可能是某些比较复杂的加密比较,但总之肯定有某种约束条件,将所有的约束条件收集好后工具就可以自动算出这个变量应该是什么。
因此我们需要首先找到两个东西或者三个东西,一个是输入存放的位置,一个是最终正确错误的分支点。我们先将输入转变为符号,执行后到达正确错误的分支点时也就已经收集好了所有的约束条件,然后得出结果即可。
这里以一个例子来讲解一下Ponce的简单使用。
测试文件的源代码:
#include<iostream>#include<cstdio>#include<cstring>using namespace ...
idapython中的图论bfs
前言例题是minLCTF2023中的一道maze_aot。参考wp为doctor3写的。
github上可以搜的到题目和wp。
在此主要分析doctor3写的idapython脚本,从而学习idapython。
题目
idapython脚本分析我将doctor3写的wp脚本分为三个部分,每一个部分都会尽量详细地介绍。
可以通过IDA清晰地看到这个题目的难点。
第一部分脚本,我称之为生成图。
#原脚本import idaapifunction_address = 0x1500function = idaapi.get_func(function_address)graph = dict()cfg = idaapi.FlowChart(function)exclusive_nodes = list()target_length = 65first = Noneend = 9177jmp_dict = dict()for block in cfg: graph[block.start_ea] = list() start_address = block.start_e ...
一些有意思的考点
前言本文记录一下打国外比赛或者自己做题时遇到的一些有意思的考点知识。
https://github.com/tgrddf55/any/tree/main/challenges
2023-08-07 LITCTF
obf.py
eval(compile(b64decode(eval('\x74\x72\x75\x73\x74')),'<string>','exec'))
python中 compile的用法 字符串混淆方法 import as修改名称
budget-mc
题目是在远端服务器上运行的,因此这里的flag.txt在本地是无法看到的
题目本身是一个带有重力的二维游戏
程序中开了一个数组,用一维数组来表示二维数组,向上走只能通过改变当前元素值为1。程序中唯一可以显示元素值的是
看起来程序没有地方直接输出flag,我们要想获得flag只能依据这个数组和flag数组的位置关系,通过类似于pwn的方式来越界访问数组,从而获取flag。
3.regex
(正则表达式的学习) 比赛的时 ...
格式化字符串+ret2txt
前言最近学了格式化字符串的知识,而且想自己独立做一下pwn题,于是就找到了下面的一道题,比较简单
https://www.nssctf.cn/problem/774
基本思路IDA打开,能够很容易发现程序有一个后门函数,直接cat flag。找到关键漏洞处。
先输入format,再打印这个format最后再输入。
前面是格式化字符串漏洞,后面是栈溢出漏洞。
但是程序保护全开,pie保护和栈溢出保护都需要想办法绕过。
pie保护开启了,我们再想通过栈溢出控制程序执行后门函数就没那么简单了,至少需要知道某个指令的地址。
canary保护的话需要能够泄露出rbp-8位置上的值。
格式化字符串漏洞都可以帮我们做到,只需要找到canary和ret地址相对于格式化字符串的位置就可以了。
expfrom pwn import *#p=process('./find_flag')p=remote('node4.anna.nssctf.cn',28795)payload=b'AAAAAAAB%17$p%18$p%19$p'p.sendli ...













