2022网鼎杯青龙组部分wp--re两题(challenge,Fakeshell)

目录

challenge

Fakeshell


challenge

用notepad打开,找到main函数,首先会通过函数调用输出两个字符串,并且需要相应的输入

往上是定义了两个数组

找到调用两个数组相应的函数

是一个简单的异或操作

变为英文是

Input the first function, which has 6 parameters and the third named gLIhR:

Input the second function, which has 3 callers and invokes the function named cHZv5op8rOmlAkb6:

接着根据要求找出需要输入的字符串nFAzj与 CuSkl

要求找的第一个字符串(函数)需要有六个参数并且第三个参数的名字是gLIhR

全局搜索含有gLIhR的函数

找到符合要求的函数ZlXDJkH3OZN4Mayd

要求找的第二个字符串(函数)有3 个调用者并调用名为 cHZv5op8rOmlAkb6 的函数:

直接先搜索字符串cHZv5op8rOmlAkb6

顺序下来手动尝试每一个函数,看看谁有三个调用者

找到相应函数hnCm82SDGE0zLYO

此时相对应需要输入的字符串如下

接下来此函数对第一个输入的字符串进行了处理

没学过go,但是大概可以猜出是先将字符串转为十六进制字符串,然后再从中选择一些字母合成最后的flag

最后字符串变量vNvUO为3A4E76449355C414

接着是函数

对第二个字符串进行处理

一直跟踪到此

比赛的时候原以为是直接返回一个字符串,其实是再次调用UhnCm82SDGE0zLYO函数

来到相应的函数

看出只是定义了一些变量,且只有第一个变量(参数)有效

再次来到相应的函数

看出也只是一个简单的异或就返回flag值得第二部分

8ce3da2b46019f75

最后组合起来即为最后的答案

flag{3a4e76449355c4148ce3da2b46019f75}

Fakeshell

尝试直接用ida64打开,无关键信息,判断是已经加了壳

然后尝试脱壳,发现无法脱壳

网上搜索资料,发现此题用了一点防止直接脱壳的方法

https://www.52pojie.cn/thread-326995-1-1.html

用任意二进制查看器打开,发现此处可能有误

将FUK改为UPX

之后放到脱壳软件或者直接放到kali上脱壳,则脱壳成功

之后用IDA64打开(建议使用7.7版本,较低版本可能无法显示main函数)

找到main函数,找到重点,忽略一些无用的指令

找到对输入字符串的第一个处理函数

点进去分析

其中a1即为输入的字符串,至于上面的j___intrinsic_setjmp函数则可能是

https://blog.csdn.net/qq_21438461/article/details/125754216

程序首先进入sub_140011230(v7为0)

进入分析,并且找到关键字符串a1

发现此时若a1长度不为20,则程序跳回setjmp处(见上上图),并且v7赋值为当前字符串长度值,而后又返回0

若返回0,从主函数中可以看出,此时输出错误信息

因此我们获知输入长度需要20

在判断输入字符串长度后,发现程序又对字符串进行了异或处理

异或后跳转到setjmp处并且返回20

在main函数中,程序又进行了setjmp,并且此时进入到sub_1400111E5中,并且传递了参数20

进入此函数分析

找到关键a1(字符串),a2(20,也就是v8)

在最下面的从0到20的循环体中,程序将字符串的逐个异或值传递到函数中

进入函数查看

找到关键参数a1,a2(v8),发现是将字符串的异或值与内存word_14001D000逐个比较,若有一个不相同,则会跳转到上一个setjmp位置,并且返回1

从main函数看出,若是返回1(即v7为1),则输出“wrong”

查看内存情况

综合以上分析,也就是对原字符串进行了长度判断,然后进了异或操作,加10后再进行异或操作,最后与内存中的十六进制值进行比较,相同则输出正确信息

最后写出脚本输出即可

flag{why_m0dify _pUx_SheLL}

猜你喜欢

转载自blog.csdn.net/weixin_51681694/article/details/126883101