自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 ESP32自动登录北邮校园网

里面有信息指示你是从哪来的,甚至精确到宿舍,你的mac和ip。我们还需要再对这个地址用一次GET,因为我们分析10.3.8.216/login正常登陆时候发送的POST,里面是有一个cookie的,写了sessionID 这里在这个地址就是拿cookie。这时候我再去对这个地址发送GET(仅限于还没有登录的情况) 会被再次重定向。你前面访问的什么地址,这里就是什么,所以访问百度可以省去。重定向到哪里呢 是一个10.3.8.216开头的地方 例如。首先任意访问一个网页,比如我访问百度,那么路由会把我重定向。

2023-12-22 00:28:43 808 1

原创 TSCTF-J 2023部分WP

第三个函数像这样,不知道为什么会对result再进行操作啊,并没有直接的操作,猜测可能是通过伪寄存器的那个数组索引到了。因为第一次return ++FackEIP,所以这次从第一个255之后开始执行,然后到下一个255结束,拿出来动态调试提取的数组看一下,并根据这个再写一个类似于汇编的操作出来。用到了索引8,-432,这是一组,然后下面是类似的相同操作,只是变成索引9,-431,那么这些位置是什么呢。因为有代码自修改,我们直接去x64dbg执行到printf的地方,然后再dump出来,代码自修改就没了。

2023-09-25 10:41:43 329 3

原创 攻防世界:Crackme

由于在程序自解密或者自解压过程中, 多数壳会先将当前寄存器状态压栈, 如使用pushad, 而在解压结束后, 会将之前的寄存器值出栈, 如使用popad. 因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发(这就是我们要下硬件断点的原因),然后在程序当前位置, 只需要一些单步操作, 就会到达正确的OEP位置”用Scylla,OEP的数值就设置这里,然后IAT Autosearch,再get imports,dump,pe rebuild,fix dump,就可以dump出来文件,没壳。

2023-09-06 15:48:15 370 1

原创 攻防世界:EasyHook

先获取writefile这个函数的位置,把这个函数备份下来。然后40C9BC处是个跳转,跳转到401080.之后把BC跳转写到writefile的位置,这样执行到writefile就进入了401080函数。才会是这个程序里用来写文件的函数。然后用40c9b4进行备份,然后把40c9bc写成跳转,后续跳转的地址是401080。401140把40C9B4重新写回来,而这正式我们备份的真正的writefile。按照真正的判断函数,我们重写就可以了,注意要把循环倒过来写。看看401240,是一个假的判断的函数。

2023-09-05 09:59:08 398

原创 攻防世界:elrond32

只看access granted的部分。8048414和8048538两个函数。直接把不符合条件的赋值0就可以,因为后面反正有i%8其实赋值几都无所谓没有影响。可以发现,先用v2和a1[i%8]异或后输出。先提取8048760处的数据。至于a1需要我们计算一下,根据switch来猜测,是这样。因为我的64位虚拟机运行不了 直接拖进IDA看看。

2023-09-04 21:51:02 192 1

原创 攻防世界:parallel-comparator-200

由最后一个for可以知道,这个generated_string和just_a_string是完全一样的,那就是说上面虽然对just_a_string加了一个result,但是这个result应该一直都是0.result其实来源于thread+i,我们直接把thread当成一个数组来看待就可以。这个arg[i][0]其实就是first_letter,这是不管i是几都不变的一个数字,只有在前面随机生成一次。主函数就是调用了一个函数,如果返回值是真就正确否则错误,去看上面的函数。写一个简单的程序跑一下看看。

2023-09-04 16:58:51 157 1

原创 攻防世界RE:babyre

输入了以后先judge,然后输出正误。注意这里judge函数是从指针转换来的,是前面数组来的。但是这个数组经过异或的变化,所以直接追过去转换代码肯定不行。这里运行一半下断点来看可以 但是linux不是那么方便。其中i+a1其实就是a1[i] 这样代码就很好写了。那就先写python脚本来得到正确数据。还是随便输入就会错误。然后再转换成代码看函数 就很显然了。die查壳,linux可以运行。

2023-09-04 13:59:15 137 5

原创 攻防世界RE:simple-check-100

我们可以直接写程序。先把flag_data和v7都提取出来,然后再复制粘贴这一段代码,稍加修改,把v4直接换成v7就可以了。用x64dbg试一下。给了三个文件,先运行一下exe试试吧,就是输入key,乱输会直接关掉,应该是直接结束了。传入的参数是v7的地址,在ida能看出来,如果传入地址的话可以把v7这里看成一个数组。检查了一下v8是不是正确的key,如果是那就执行下面的函数,否则错误结束。发现都是乱码啊,有可能linux下可以,我们就不试了,直接用ida接着看。为了防止运行完了直接结束,下一个断点。

2023-09-04 11:30:26 358 1

原创 攻防世界RE:crazy

发现有一个构造函数,后面有两个函数一个计算量长度,另一个检查是否通过,最后才输出了flag。但是这里我们直接去看flag的v22是看不到东西的,因为它是在运行中计算出来的。注意这里使用了指针,所以看似没有对this进行修改,其实已经通过v4和v2两个指针,修改了其中的内容。这里检查了一下是否通过,条件其实就是+16和+80是不是相等。这两个其实分别是输入的字符被操作之后,和+80的那一大长串。那现在我们就可以写一个反向的代码,从+80还原我们的输入。随便输入一个数字,发现这里有长度检查,太短或者太长了。

2023-09-04 11:03:33 172 1

原创 攻防世界RE:Mine

先用IDA简单看一眼主函数,发现有一个循环,而循环的下面才会输出ans。这就好办了,我们直接把循环给nop掉,执行一次直接去后面输出ans就可以了。使用x64dbg进行调试,然后把循环结束位置的判断和跳转nop了。这里有两个思路,要么直接看ans是多少,要么去nop掉一些命令拿到ans。虽然是一堆问号,但是显然不只是在main被调用了。这样我们再运行程序,只需要第一次碰运气不踩雷,结果就会直接被输出。但这并不是flag,具体问题我们后面再说。我们先看第二种方法。打开运行发现是扫雷,或许扫完了能拿flag。

2023-09-04 01:47:56 490 1

原创 攻防世界:The cat did it

尝试CatCTF{9F1EF07877F9D85A82BD500F408B4814} 错误。尝试CatCTF{9f1ef07877f9d85a82bd500f408b4814} 正确。这道题主要是一个思路,其实非常简单。首先我们拿到题目,里面是一个网址,打开是desmos。flag格式如:CatCTF{md5(87%)} 计算一下0%的md5。左边有一个Cat{}看起来和flag很像,其实没啥用。小写在内0%的md5就可以了。所以我不会离开猫猫!

2023-09-01 20:23:00 650 1

原创 攻防世界:IgniteMe

这里的for是对v7内的所有字符进行操作,看到熟悉的65 90 97 122 就知道 这是把大小写颠倒操作。传入的参数是Str的指针,然后还是先判断够不够4位长,够了才继续。如果够了的话,就进行拷贝操作。拷贝的范围是从第五个字符开始(str4)直到结束的前一个(len-1),然后把strlen处的最后一个字符赋值为0,就是结束符。所以这里判断的逻辑是,先看看字符长度够不够4,再看前四位是不是EIS{ 最后一个是不是}。为什么要这么做呢,从第五个开始,这样忽略掉EIS{,最后一个不要,就是不要}。

2023-09-01 20:11:30 435 1

原创 攻防世界:easyxor

主要涉及到的操作,通过key和输入的字符v8进行异或计算,算出来的v7赋值给v4后自减。一直在里面的循环继续,把s的值赋成1。所以第几个元素,始终跟v11有关,对于每一个字符,从异或后的ascii码自减,有多少个就写多少个1,写完了写一个0,然后再继续下一次。接下来就可以反向编写我们的程序来获取flag了,其实非常简单,就是用1的个数来算出每一个字符的ascii并输出。遍历一下就可以,写1和0的条件,-1直接不管 因为没有意义。shift+e导出,果然是有1有0,最后全都是-1,印证了我们的猜想。

2023-09-01 19:25:44 517 1

原创 攻防世界:666

对于异或,只要再对key异或一次,就可以获得原来的结果。所以我们把enflag写进去,先和key异或再进行反的加减就行了。注意+-是优先于异或进行运算的,所以要给异或打上括号。对于这个encode函数,如果得出来的结果是enflag,那么说明用户输入的正确,即用户输入的字符就是flag。所以我们需要从enflag反推用户输入,写一下逆过程的代码。再看看key是什么。key应该是一个数值,发现是12h,即0x12,十进制的18。首先我们来看一下enflag是什么。对于这个数据,我们可以直接写。

2023-09-01 17:24:23 195 1

原创 攻防世界:easyre-xctf

数据是放在栈上的,小端序存储方式存储(高位字节放高地址,低位字节放低地址)。所以这里字符顺序正好是反着的。正过来就是flag{UPX_4n。一样可以找到part1 这里顺序是正确的 我们只需要拿到flag{UPX_4n就可以了。我们根据函数名称可以猜part2。点过去就是第二部分的flag了。主函数基本没东西 查一下字符串 shift+f12。和part2连接起来 就获得了完整的flag.发现了第一个 长得很像flag 点过去看一下。长串16进制 转成char看一下。直接运行 猜测是UPX壳 查一下。

2023-09-01 14:13:20 902 1

原创 从游戏中学习逆向:制作OW的dump

我们要用到X64DBG,用来制作dump。会用到它的两个插件Scylla和ScyllaHide。ScyllaHide是一个高级的开源x64/x86用户模式Anti-Anti-Debug库。它hook用户模式(ring3)中的各种函数以隐藏调试。为了防止检测 ,我们还需要用到processhack2在运行游戏之后,首先进入一场游戏之中(这样保证我们想找的东西一定会出现在dump文件里面)使用process hack把整个进程全部暂停。这样不管是x64dbg 还是ce 都不会被检测到。

2023-09-01 13:29:24 2180 2

原创 从游戏中学习逆向:获取OW的实体

通过IDA进行逆向工程,查找游戏用到entity_admin的地方,我们可以轻松找到Entity_Admin位于base+35F5300(这一偏移不具有时效性!由于这一部分获取的只是parent和Link,所以不需要一直执行,只需要在新实体生成(有新玩家、新物体)的时候执行一次。后面我们再新建一个进程,从上面获取到的内容中,对所有可能用到的组件进行解密。这计算了实体列表的大小,基于内存信息结构中的。)关联的进程的虚拟内存信息,查询的地址为。),获取游戏内存中实体列表的基址。的内存块,将内容存储在。

2023-09-01 13:12:59 1145 1

原创 从游戏学习逆向工程:OW的ECS架构

对于不同种类的实体,所拥有的component当然也不同。对于常见的组件,例如健康/可见性 /技能CD/英雄名称/位置等等,全部都有对应的组件ID。我们需要在entity_admin处,首先获得到该实体的ComponentParent,和LinkParent,再将它和对应的组件ID传入相应的解密函数,即可获得读取信息的地址。OW的ECS模式是,在entity_admin的地方,可以获取到游戏的所有实体。守望先锋的反作弊中,应用了动态加密,对组件的读取位置进行了加密保护,需要decrypt后才能获得。

2023-09-01 13:00:45 1299 1

原创 攻防世界RE:CatFly

根据printf的输出来找,那么跟输出字符串相关的是off_FA88,而且注意到这里有dword_E1E8 += printf("\x1B[1;然后再计算整数值的长度,用来进行自增,这也是可以的。注意传入的参数a4,即v12,其实就是off_FA88。运行效果如图,最下面指示次数,最上面有字符串,猜测Flag可能和最上面的字符串有关系。发现在62B5里面也更改了、而且返回也用到了E1E8的值,想起来我们在main函数看到的printf。我们知道printf函数的返回值,其实就是打印出来的字符串的长度。

2023-09-01 12:46:04 1106 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除