入门题,考察 x64的字符格式化漏洞 和 Canray
main里一个switch case
12341.add2.naming3.edit4.show
menu()这也有
再看每个函数
add()
naming()
这里很明显的存在fmt漏洞,变量名上其实也给了提示
edit()
这里是一个写入,写入长度是_b所存储的长度。
gdb断点看下b所在的位置
下一个rip地址0x55555555533c+0x2d2c=0x555555558068
其实这个是在bss部分
从反编译也可以看到
show()
思路从反编译的地址可以看出这题开了pie,还有喜闻乐见的canary。
顺便题目还给了个libc
既然考点是format,那存在fmt漏洞的也就只有naming函数,不过他写死了长度0x30,也就只能做fmt漏洞使用,触发点不在这个func里
另一个可以输入但是没有完全写死长度的是edit()
这里他是从bss部分的_b里取长度值的,泄露pie基地址+4068就可以获取_b的地址,用fmt的$n直接写就好
梳理一下
1.现在naming()存在fmt漏洞
...
这题考察的还是对子进程与父进程之间堆栈的关系
debug部分参考的这位师傅
https://mp.weixin.qq.com/s/ngdtDGE8bGVe6v3GTrH1rw
依照程式启动时输出的leave your name
查看string调用找到004019e9()
再追下,就到了main()中
看下调用顺序
应当是
12300401931() -> 004019e9()
但神奇的是它在程式执行过程中,首先输出的是004019e9的leave_your_name
而后才是00401931的Wanna_return
实际上在gdb的debug时候这部分的逻辑有些乱,所以我换到ida之后发现,他会进入401931()
而后执行到这里会call 44EDF0
eax给了0x3a这里是
1234567#syscallrax:系统调用号rdi:第一个参数。rsi:第二个参数。rdx:第三个参数。r10:第四个参数。....
158 common vfork sys_vfork
所以这里是syscall_vfork创建一个子进程
在其中他会sys_vfo...
对TransformMap调用了setValue(),但因为他的父类是AbstractInputCheckedMapDecorator其中的MapEntry继承AbstractMapEntryDecorator,而这个AbstractMapEntryDecorator实现了Map.entry部分,同时其子类MapEntry重写了setValue,所以TransformMap在Mapentry轮询的时候调用setValue调用的是他爹的
AnnotationInvocationHandler因为不是公共类,所以只能通过反射的形式获取而后实例化
1234Class c = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor TestConstructor = c.getDeclaredConstructor(Class.class,Map.class);TestConstructor.setAccessible(true);Object o = TestC...
1之后会更新一部分可以公开的脱敏后的拿点或src的思路过程记录,以供熟悉的朋友和师傅们参考
1本文强脱敏,因为涉及的企业都很大,涉及到信息和资产相关的都不会贴图,相关特征图片也用其他类似的代替,所以文字占了大部分,着重记录一下思路,十分抱歉师傅们见谅。
本次攻击用到了两个供应链,包含一个我没公开的day
这次的目标是一个投送广告的大屏管理企业,拿下了这个系统基本就控住了那个地市三分之一的商业大屏
而其资产是托管在其他厂商那里,或者说是委托其他厂商来开发运维,目标只是作为使用方。
那目标就很明确,由这目标单位范围延伸覆盖到了运维厂商侧,然后开始收集厂商资产。
在收集过程中发现这个厂商做了非常多家企业的运维开发业务,但业务系统并不一致,只是主域名资产都是备案在厂商。
不过对于这种单位,他运维团队除非很大,否则在运维习惯上会有很大的通用性,为了验证这点,在查了他单位的人员信息和一些采购、业务纠纷、合同指标之后发现他公司的开发运维技术团队并不大,直觉告诉我只要打进一个或者两个,就有很大概率杀到目标单位。
所以我挑选了旗下的一个建筑企业,因为他的ui很眼熟,让我想起来一个年初时候的...
ABP is a renowned open-source .NET framework, and its “/api/abp/api-definition“ path within the framework leaks the API interfaces within the project.
Within this, we can identify the API paths inherent to the ABP framework itself.
like api/abp/xxx
The leaked API path of ABP itself is not the primary danger, as it is quite limited. However, developers using this framework may not realize that the APIs in their own projects are directly exposed within the api-definition file. Consequently, ...
ssti 和 jail除去渲染部分其实利用的是一样的,都是寻找执行链条
这里常用用来寻找的几个方法分别为
摘自 https://www.cnblogs.com/h0cksr/p/16189741.html
12345678910111213__class__ 返回类型所属的对象// __base__和__mro__都是用来寻找基类的__mro__ 返回一个包含对象所继承的基类元组和方法在解析时按照元组的顺序解析。(继承链)__base__ 返回该对象所继承的基类__subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表//通过以上几个魔法函数找到可利用的模块和object父类__init__ 类的初始化方法__globals__ 对包含函数全局变量的字典的引用//__dir__()和__dict__可以帮助我们找到需要类方法 __dir__() 更多的可以参考这个文章类特殊成员/函数https://www.cnblogs.com/twotigers/p/7779501.html__dict__ 为了方便用...
main调用puts输出
看vuln
这里应该是个read写入到var_38h位置 共可以写入0x40个(我的Cutter有点问题不显示具体函数名。
var_38一共长度0x38 ,因为上面read读0x40个,所以只可以溢出到rbp的下一个8位,也就是正好覆盖返回地址。
因为溢出长度不够干啥,所以这里考虑栈迁移到bss。
首先溢出覆盖到rbp给个bss的地址,然后返回地址再给个vuln的地址
这么做是为了,使得rbp直接在初次执行到最后的经过leave也就是mov rsp,rbp pop rbp,之后rbp pop到我们指定的bss的位置,然后再次执行vuln为了往rbp跳过去的bss的var_38部分写东西,方便再跳一次。
123456789101112131415from pwn import *context(terminal=['tmux','new-window'])p=gdb.debug('./pwn',"b main")context(os="linux"...