Pwn-高质量比赛题目复现4-2024CISCN初赛
2024CISCN初赛gostack比赛时调了很长时间才出的,这里回顾一下。
go语言的pwn题,ida打开逆向不好看(ida8.1还好,会加载go的一些函数名,ida7.7就更难分析了)
首先运行一下,提示输入Input your magic message :
并且输入完就退出了,所以只有一次输入的机会,猜测存在栈溢出。
用shift+f12定位到该输出,找到主要函数,如下:
分析发现0x4A09D3处应该就是我们的输入函数,gdb在这下断点,输入数据后,查看和ebp的偏移。
输入完后发现数据并不在当前栈内,查看ida反编译代码发现输入完存在赋值操作,因此猜测后续会把输入的数据再拷贝到栈上。
所以一直ni下一步,这时就会发现栈上有我们输入的数据了,计算偏移即可。
由于没有libc,且gadget充足,因此考虑syscall(syscall|ret需要使用ropper找),首先调用read向bss读入binsh,之后调用execeve。
这里有个坑,就是在bufio__ptr_Scanner_Scan函数里有一个cmp比较指令,比较栈上那一处是否为0,所以填充到该位置时填充 ...
Pwn-高质量比赛题目复现3-第六届强网拟态线下赛
第六届强网拟态线下赛记一道格式化字符串题目,个人感觉算是格式化字符串里的困难级别了,几乎限制到了最高。
参考自大佬: https://zikh26.github.io/posts/a523e26a.html
libc2.31,保护全开。
main函数如下:
分析可知,只有一次bss段格式化字符串漏洞利用的机会,且printf后跟着exit。
题目分析:1、题目给了栈地址的后四位,用于我们修改返回地址调用链。
2、printf后跟着exit,因此不能控制main函数的返回地址,并且libc未知,也没法修改exit_hook为target,所以只能修改printf函数的返回地址成target,以便后续再次利用。
具体思路:首先获取栈地址低位123ru("Gift: ")ret_addr_low = int(p.recv(4),16)success("ret_addr_low: " + hex(ret_addr_low))
第一步构造首先我们需要根据已知的后四位栈地址,修改返回地址由0x1250 变成0x1223(即read函数的起始地址),因为只 ...
Pwn-堆进阶-House of apple2
House of apple2摘抄自大佬: house of apple2之_IO_wfile_overflow - 先知社区
高版本在禁用了一些hook的情况下,一般的打法都是打io,即通过伪造io_file,然后使用large bin attack 或tcache bin attack修改_IO_list_all或 _IO_stdin等指向堆地址,其中该堆地址处即为伪造的io_file_data。
对于io_file等知识,这里不再赘述,可参考大佬博客:https://bbs.kanxue.com/thread-272098.htm
由于多种io利用链里属apple2最为常用,这里总结一下apple2的几个利用方法。
apple2是由大佬roderick01发现的调用链,其中有多条调用链,这里这阐述第一种_IO_wfile_overflow,具体详见:https://bbs.kanxue.com/thread-272098.htm
这里写一下我的理解。
简介首先回顾一下io结构体的源代码:
1234567891011121314151617181920212223242526272 ...
Pwn-高质量比赛题目复现2-2024吾杯CTF
2024吾杯CTF题目挺难的,比赛的时候有事没怎么打,也没做出来,这里复现一下。
参考自大佬博客:[吾杯 2024] pwn (Yang,如果能重来)-CSDN博客
Yang比赛时没看,有时间再复现吧。。。
如果能重来格式化字符串漏洞的利用,个人感觉应该是格式化里边的困难程度了。
首先checksec看一下,保护全开,没法修改got且存在pie,并且没有后门函数。
main函数是先调用了sub_12f6后调用了sub_13d7,两函数如下:
13d7中只存在一次格式化字符串漏洞,虽然是栈上的,但是只有一次利用(dword_404C初始值为1)几乎且无后门函数,并且开启了pie,got表不可改,感觉所有的都给禁用了,比赛时候就卡住了,虽然根据提示猜测sub_12f6可能有什么东西,但是看了半天汇编也没看出来,这里复现一下佬的思路。
sub_12f6函数调用后,在栈上残留了一个栈地址,栈内存如下:
因为只有一次格式化字符串利用,所以第一步肯定是劫持返回地址使得能够重复利用。因此我们可以输入到该位置修改后两位使其指向返回地址处,然后修改返回地址为start(因为start会重新将dwo ...
Pwn-高质量比赛题目复现1-2024羊城杯初赛
2024羊城杯初赛参考自两位大佬: 2024羊城杯PWN详细全解 - 先知社区 和 羊城杯2024预赛 - rot’s Blog
logger有关C语言异常捕获机制的一道题。
首先查看保护,存在canary,但是没开启pie。
分析main函数,主要是菜单的两个操作,一个Trace,一个Warn。
Trace代码如下:
分析发现,在循环向byte_404020中写入时,一共循环写入了9次,而该数组大小为16*8 = 128,因此当最后这一次循环时会溢出覆盖掉src,这里的src在下边会用到。
Warn代码如下:
Warn中read存在明显的栈溢出,但是因为开启了PIE,所以没法直接利用,这时候就需要使用异常处理函数了。
C++异常处理函数C++的异常处理机制有三个关键字:throw、try和catch。
其中throw是抛出异常、try包含异常模块、catch捕获抛出的异常。
简单例子:
1234567891011121314151617181920#include<iostream>using namespace std;double Div(int a ...
Android-微信小程序库迪coffee逆向
微信小程序逆向摘抄自吾爱破解大佬文章:库迪小程序sign值加密算法分析 - 吾爱破解 - 52pojie.cn
一、环境准备1、抓包环境:
这里采用ProxyPin进行抓包,下载地址:proxypin 发行版 - Gitee.com
2、小程序解包工具:
使用unveilr进行解包,解包操作见摘抄文章。
3、微信开发者工具
使用微信开发者工具进行反编译,以便查看源码。
二、抓包分析1、首先抓包,找到一个post包,以/cotti-capi/shop/homePageGetShopDetail为例,编辑请求后,发现可以在响应体中看到app页面信息。
2、尝试修改时间戳(修改较大,将173改成172开头),发现提示如下,因此猜测后台对时间进行了校验,当请求包的时间与实际时间相差较大时会提示时间错误。
3、之后尝试修改sign值(将sign首位改成1),发现提示md5错误。
因为sign是32位,结合提示md5错误的信息,所以猜测程序的加密逻辑与时间戳有关,猜测sign是某个包含时间戳的字符串的md5值。
我们的目的是推导出md5值为41105C1F534237297E73C5850 ...
Android-Frida辅助逆向嘟嘟牛
一、Frida介绍摘抄自吾爱破解大佬:《安卓逆向这档事》十三、是时候学习一下Frida一把梭了(上) - 吾爱破解 - 52pojie.cn
1.什么是Frida?Frida 是一款开源的动态插桩工具,可以插入一些代码到原生App的内存空间去动态地监视和修改其行为,支持Windows、Mac、Linux、Android或者iOS,从安卓层面来讲,可以实现Java层和Native层Hook操作。
Hook操作就是一个类似动态插桩的功能,可以在app执行的任意过程中插入或修改一些代码以及参数和返回值,来修改程序的执行逻辑。
2.Frida原理及重要组件frida注入的原理就是找到目标进程,使用ptrace跟踪目标进程获取mmap,dlpoen,dlsym等函数库的偏移获取mmap在目标进程申请一段内存空间将在目标进程中找到存放frida-agent-32/64.so的空间启动执行各种操作由agent去实现
组件名称
功能描述
frida-gum
提供了inline-hook的核心实现,还包含了代码跟踪模块Stalker,用于内存访问监控的MemoryAccessMon ...
Android-安卓逆向破解登录
一、安卓开发初识平台:Android Studio Giraffe(2022)
SDK : 33
安卓开发是基于移动端开发的app,通过Android Studio设计,连接真机或虚拟机发行后进行测试。
1.环境安装(1) 首先官网安装Android Studio,之后安装sdk(连接移动端的桥梁,相当于java的jdk)
(2) 配置相关环境变量,将tools和platform-tools加入环境变量,没有的可以在AS的sdk tools中下载。
(3) 测试sdk中的adb,cmd命令行输入adb测试,adb是构建PC端和移动端的桥梁。
2.目录结构创建完一个empty project(java)后
(1) 最重要的是gradle(相当于web开发的maven),是项目构建的工具,可以帮助拉取远程仓库代码,其中有两个build.gradle,一个是项目的,另一个是模块的,在模块中定义了一些sdk版本以及一些包的远程地址和版本。
(2) 在src.main.java中,定义了MainActivity,相当于启动类,并且该类(所有类)需要在AndroidMainfest.xml中声明 ...
Web-反序列化
反序列化反序列化,我个人的理解就是伪造一个类,覆盖掉其原有的成员变量或成员函数的内容;或者需要构造一些链,比如一些指向关系,假如有a类和b类,a类中某个函数可以输出flag,但是没有被调用,b类中存在某个变量可以被调用,所以使b中变量指向a中的函数来调用a中的函数输出flag。我什么也不会,这只是感觉,哈哈哈。。
以下题目均来自于ctfshow web入门练习题反序列化部分。
例题1、签到12345678910111213141516171819202122232425262728293031323334353637class ctfShowUser{ public $username='xxxxxx'; public $password='xxxxxx'; public $isVip=false; public function checkVip(){ return $this->isVip; } public function login($u,$p) ...
Web-SQL注入
SQL注入sql注入,一般上来先测试是整数型还是字符型,如果要求输入id,可以输入1'--+来测试是否报错,如果报错则不是字符型,其中'用来闭合引号,–+用来注释后边内容,也可以使用#,不过要写%23`(url编码)
成功闭合之后,先判断下字段数:
输入1' order by 3--+看是否报错,如果3不报错,4报错,说明该表有3个字段,即3列。
之后,使用union联合查询数据库名、数据表名、字段内容。
以下题目均来自于ctfshow web入门练习题sql注入部分。
例题1、常规查询已知sql语句:
1$sql = "select username,password from user where username !='flag' and id = '".$_GET['id']."' limit 1;";
是字符型,使用-1’ union进行联合查询。
1、首先查询数据库名:
1-1' union select database(),us ...