第六届蓝帽杯初赛CTF题目 Re WriteUp

  1. LOADER.exe

LOADER.exe

首先64位程序,没壳

通过VirtualProtect 更改unk_140003040地址处数据的属性,0x40为PAGE_EXECUTE_READWRITE,即可执行可读写,作为sub_7FF7D5941040的参数传入。查看该函数的汇编指令

我们发现把unk_140003040的地址覆盖到了ret的位置,所以该函数执行完后跳到unk_140003040的地址执行,然后就是不断调式找真正执行程序逻辑的函数

继续跟

主要就一直下断点找函数就行了,这里就是程序的真正逻辑

通过动调可以发现一些函数的执行逻辑

我们输入测试flag进行调试,不过在多次调试后,我们发现flag是有长度限制的

长度为42,测试flag{123456123456123456123456123456123456}

我们点击v1查看存储flag的内存时,其实是指向0000018DF0A42050,并不是直接指向flag字符串的

所以这应该是一个结构体

这里是把flag{}里面的前18个字符串取出来

sub_7FF7592D4380函数有三个参数v13,10,xmmword_7FF7592EF1B0,其中v13就是我们输入的123456123456123456,最后一个参数应该是用来接收输出的

可以发现这个函数作用是把我们的字符串转换成了10进制的数字形式123456123456123456

下面同样出现了相同的循环

我们猜测是对后面18位的flag进行操作,所以我们换一组测试数据,可以看到下面又多了两组str_to_int的操作,并且是常数,我们进去观察一下,一个是72,057,594,037,927,936,另外一个是1,152,921,504,606,846,976

测试输入flag{720575940379279361152921504606846976}

这里的sub_7FF7592D50C0是一个比较大小的函数,要求我们的flag要在72,057,594,037,927,936与1,152,921,504,606,846,976之间

将flag第一部分进行两次传参,结果返回到v31中,v31结果为0x1400000000000001

可以发现这个函数是一个乘法

同理下面对flag的后18位也是乘法操作

继续往后调试

这里是把flag后半部分在经过平方后又乘上了11

sub_7FF7592D5400里面最后执行这个函数

进去分析一下,得到结果为0x327557B48632115FC02A5000000001

现在我们理一下数据

flag前18位进行了平方操作,得到了0x640000000000001400000000000001

flag后18位进行了平方操作,再乘以11,得到了0x318AA84B79CDEE0B43FD5B00000000

现在经过函数sub_7FF7592D5400后得到0x327557B48632115FC02A5000000001

经过测试,发现这个函数的作用是一个减法

最后一个strcmp,比较的结果是9,所以这道题其实就是一个方程求解问题

x^2 - 11*y^2 = 9 (72057594037927936<x<1152921504606846976)

在x的范围内求出对应的整数y,都为64bit的大整数,需要用到一般Pell方程进行求解,也可以使用wolframalpha在线计算。

求出来的解118936021352508390 和35860559716724409,判断两段长度是否为18,不足在最前面补0。flag{118936021352508390035860559716724409}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 767778848@qq.com