CTF pwn/re手在学习过程中的零碎操作积累
零碎操作积累
- 概述
- 开启和关闭随机化
- 使用指定版本的libc运行pwn题
- 使用指定版本的libc编译源程序
- IDApython -- Patch SMC代码
- 爆破脚本的编写
- 寻找syscall_ret
- c语言一个特性积累
- 逆向迷宫题的输入求解脚本
- 求数的二进制补码形式
- 总结
概述
谨以此片文章为我那不争气的记性做个记录,随便造福大家,另外如果各位看官也有些骚操作或者基操的话,也请不吝赐教,留言评论,在下定临表涕零,感激不尽。
开启和关闭随机化
# sudo su
cat /proc/sys/kernel/randomize_va_space # 当前值
echo 0 > /proc/sys/kernel/randomize_va_space # 完全关闭
echo 2 > /proc/sys/kernel/randomize_va_space # 完全开启
使用指定版本的libc运行pwn题
这里给几个下libc的网站:
- ubuntu glibc官网
- 清华大学开源镜像站
使用指定版本libc运行pwn题的终端操作:
# 指定libc
$ LD_PRELOAD=/usr/local/libc/libc-2.23.so
# 使用对应的动态链接器运行程序
$ /usr/local/libc/ld-2.23.so ./prog
利用pwntools指定程序运行的libc:
from pwn import *libc_path = "/usr/local/libc/libc-2.23.so"
ld_path = "/usr/local/libc/ld-2.23.so"
p = process([ld_path, "./prog"], env={"LD_PRELOAD":libc_path})
使用指定版本的libc编译源程序
操作如下:
-o
指定生成的程序名-Wl
将后面的参数传给链接器--rpath
指定libc路径--dynamic-linker
指定动态链接器
$ gcc test.c -o test -Wl,--rpath=/usr/local/libc/ -Wl,--dynamic-linker=/usr/local/libc/ld-2.23.so
IDApython – Patch SMC代码
IDApython的文档手册 – IDApython手册。
这里记录一下使用IDApython插件patch代码的过程,在逆向过程中经常遇到SMC代码,此时静态分析的话我们可以用下面的示例脚本来还原出代码,主要记忆一些api的使用。快捷键shift-f2
打开IDA脚本输入框,修改脚本语言为python,如下截图所示,代码也在后面,注释已给。
from idaapi import *addr = 0x0402219 # 代码起始地址
for i in range(224):code = get_byte(addr+i) # 获取对应地址的单个字节值patch_byte(addr+i, code^0x99) # patch_byte(addr, value)print("done!")
爆破脚本的编写
在做pwn题的时候,我们会遇到一些概率题,所谓概率题就是构造的payload中有些字节不一定正确。比如有时候没有leak函数,我们尝试直接覆盖main_arean地址为_IO_2_1_stdout_
,之后分配过去改变其数据结构来leak libc。这里我们可以通过已知的libc版本获得正确无误的后三位地址数,这是固定不变的,但是一般main_arean地址和_IO_2_1_stdout_
会有2个字节即四个数字不一样。即使只是末三位不一样,由于我们只能写整数个字节即最少写2字节(1个字节显然改变不了),所以仍然需要爆破一位。
通过学习各位前辈的wp,我发现大家都是在原wp上添加while循环,增加校验逻辑来实现爆破。通过实际做题,我发现这样有点慢,当然这是从编程角度和软件工程的思维上来说。因为我们在写脚本和调试时肯定一开始不会写循环,毕竟写循环调试起来很麻烦,都是在默认一个正确的地址上进行编写,所以循环和检验是最后加的,当然不怕麻烦也可以手动运行。这里存在两个不足:第一,加循环和校验时需要改变原来脚本的一些逻辑,而且编写校验逻辑会比较耗一点时间;第二,改逻辑有时候会改错脚本,或者说加循环后有时候出错不是原来的脚本而是自己的逻辑出错导致一直没爆破出来。
综上所诉,我个人更喜欢将爆破动作单独提取出来,也就是重新写个小脚本来代替无聊的手动运行原来wp的操作。这里可以使用shell脚本或者就用最熟悉的python好了。
脚本如下,test.py
用来代表wp,用随机数来构造其概率为1/16,没有产生预期数字就引发异常;run.py
则是真正执行的动作,采用子进程的方式不断执行wp,通过返回的状态码来判断是否执行成功。
# test.py
import randomif random.randint(0, 15) == 5:print("you got it: fanxinli{lifanxin}")
else:raise Exception("error")
# run.py
import subprocesswhile True:p = subprocess.run(["python3", "test.py"])if p.returncode == 1:# 1 means error, 0 means successcontinuebreak
寻找syscall_ret
在pwn题中进行ROP利用时,我们有时会需要找到syscall
这种gadget,当然对于这种需求使用ROPgadget工具十分方便,如下代码所示。
ROPgadget --binary libc-2.27.so | grep "syscall"
但是使用该命令找到的syscall
并不一定是以ret
结尾的,所以在我们需要连续的使用系统调用时就需要syscall ret
这样的gadget,此时可以使用如下的命令,即指定opcode来寻找。
# 0f05 --> syscall;
# c3 --> retn;
ROPgadget --binary libc-2.27.so --opcode 0f05c3
c语言一个特性积累
这里记录一个做题过程中遇到的关于c语言整型的问题,观察如下伪代码,a应该等于几可以获得shell。
int a = ???;
if (a < 0) && (a == -a):getshell();
在现实中一个数不可能既小于0又等于其相反数,因为这样的数只能是0。但在计算机中,由于数字使用补码来表示,并且表示精度是有限的,所以会产生上述看似不可能的情况。这里再补充一点计算机组成原理的知识,如果看x86汇编代码的话,可以发现求相反数指令是由neg
指令实现的,该指令的操作是将补码按位取反最后加一(包括符号位)。所以要实现上面代码的情况只需要令a等于其精度下能取到的最大负数,可以使用如下代码验证。
#include <stdio.h>int main()
{int a;a = 0x80000000; // int精度下的最大负数printf("%d\n", a);printf("%d\n", -a);// 下面的算式求出来也是其本身printf("%d\n", a-0x100000000);return 0;
}
"""
-2147483648
-2147483648
-2147483648
"""
逆向迷宫题的输入求解脚本
在做迷宫类的逆向题时,我们经常会遇到不太常规的输入,也就是说出题人自己定义了一个上下左右的对应字符关系,所以往往就需要我们根据这个上下左右来自己输入,这里给出一个简单的脚本来求解其对应关系。我们按照常规的w s a d
来输入,遇到对应的题目修改其键值关系即可。
import hashlibstep_tran = {"w":"1","s":"2","a":"3","d":"4",
}solve = input("input your solve: ")
print("you input len is: ", len(solve))flag = ""
for step in solve:flag += step_tran[step]md5 = hashlib.md5()
md5.update(flag.encode("utf-8"))
flag_md5 = md5.hexdigest()print(flag)
print(flag_md5)
求数的二进制补码形式
正数的补码是其本身,负数的补码等于其模加上自己。如下代码所示。
In [14]: num = 7In [15]: bin(num)
Out[15]: '0b111'In [16]: num = -7# 这里以 模 = 2**8 为例,即二进制位数为 8
In [17]: bin(num + 2**8)
Out[17]: '0b11111001'
总结
不忘初心,砥砺前行!
CTF pwn/re手在学习过程中的零碎操作积累相关推荐
- CTF|pwn栈溢出入门题level3解题思路及个人总结
CTF|pwn栈溢出入门题level3解题思路及个人总结 解题思路 拿到题目将文件下载下来拖入ubuntu 发现这一次的文件比较特殊:是一个linux环境下的压缩包,自然而然想到的是解压它 通过命令行 ...
- CTF pwn题堆入门 -- Unsorted bin
Unsorted bin 序言 概述 攻击方式 unlink 释放Chunk到Unsorted bin House of Orange House of einherjar Unsorted bin ...
- UE4三维游戏毕设制作与学习过程中的所思所想01
提示:前面是一大堆可看可不看的"废话". 随着毕设Deadline的越来越近,在前期模型制作上遇到的问题大多都已得到解决,但是在这个过程中却一直没想过写些文字记录下来这个学习的过程 ...
- CTF PWN之精确覆盖变量数据
刚开始接触pwn的朋友在做pwn练习时可能会有这样的疑问,怎么做到精确覆盖变量数据呢? 我们做pwn练习之前需要先知道:命令行参数C语言的main函数拥有两个参数,为int类型的argc参数,以及ch ...
- 目标检测中如何定义正负样本,和正负样本在学习过程中loss计算起的作用
如何定义正负样本,和正负样本在学习过程中loss计算起的作用 正负样本定义 分类和回归head如何学习和利用划分后的正负样本(loss如何计算) 正负样本在分类中loss计算的处理 正样本在bbox ...
- 心得丨走过最长的路,就是机器学习过程中的弯路
营长的一位转型AI的朋友,最近对营长抱怨,"走过的最远的路,就是机器学习过程中的弯路",然后开始各种blablabla,从论文的坑,到模型的坑,再到培训的坑...一路吐槽. 尤其是 ...
- linux 学习过程中的坑之 find 正则表达式
1 标准的正则表示式 格式 . 表示任意单个字符 * 表示任意次数 + 表示1次或1次以上 {3} 表示精确匹配次数为3次 {n,m}表示n次到m 次之间 ^ 行首锚定 $行尾锚定 \< 单词首 ...
- origin9语言设置中文_英雄联盟手游怎么设置繁体 LOL手游繁中设置方法?_英雄联盟手游...
英雄联盟手游终于在海外部分地区上线了,不过玩海外服有一点不好,就是界面都是外文,比如英文.日文.韩文等等.那么英雄联盟手游怎么设置繁体中文呢,这里就来给大家介绍一下LOL手游繁中设置方法,将游戏语言切 ...
- 手机端网页中图片之间出现白线的解决方法
手机端网页中图片之间出现白线的解决方法 参考文章: (1)手机端网页中图片之间出现白线的解决方法 (2)https://www.cnblogs.com/syzdidi/p/9686463.html 备 ...
最新文章
- 4月CISSP中文机考备考经验
- python turtle库画图案-python中的turtle库绘制图形
- c语言字符串加减_C语言中指针的介绍
- vs2010 asp.net mysql,安装VS2010后,更改iis的asp.net版本 | 吴小强的博客
- Redis-主从复制
- Jrebel 激活方式
- java方法被编译器调用_我异常了,快来捕获我,Java异常简述
- python 发送 smtp
- 影像科dsa为什么必须买维修保险_DSA在医疗方面为什么重要?看这3点
- 参观 Facebook 是一种什么体验?
- 思科网络设备命令大全
- Dart语言学习理由
- 前端Jquery使用pagination.js插件进行分页
- matlab 三角函数 积化和差,瞬间记住三角函数和差化积积化和差公式
- 删除linux 中压缩文件
- Java接口:实现防盗门功能
- 5款支持Web端创作的脑图工具,学习一款就够了
- ImportError: cannot import name ‘_maybe_get_pandas_wrapper_freq‘ from ‘statsmodels.tsa.filters._util
- Android简易实战教程--第五话《开发一键锁屏应用》
- 【基于Swing+Java的连连看小游戏的设计与实现(效果+源代码+论文 获取~~)】