目录
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}