-
-
[原创]TSG CTF 2020 Reverse-ing
-
发表于:
2020-7-13 20:14
7312
-
[原创]TSG CTF 2020 Reverse-ing
上周末做了TSG ctf,感觉这个reverse题目还挺有创意,参考了了Writeup发现他们有些点没讲出来,我再这里补充一下。先附上原文链接:https://0x90skids.com/tsg-ctf-writeup/#reverse-ing
Solved By: not-matthias
Points: 114
Flag: TSGCTF{S0r3d3m0_b1n4ry_w4_M4wa77e1ru}
拿到题目的第一件事就是检查二进制架构,目标操作系统以及是否保留了调试信息
现在我们知道他是一个Linux的ELF文件,拖到IDA里面看一下_start函数,可以看到他先是跳到了reverse函数里面进行执行,但是执行完Call rbx
之后,代码就变成了一团糟
reverse函数里面对_start函数进行了修改,所以每次我们从call rbx
回来之后,代码都发生了变化
我最开始直接把代码复制过去,然后写了一个python脚本来转换指令,但是实话实说这个有点难而且花了我很多时间。后面@jeff_提到reverse
函数调用了很多次决定采用另一种方法。我从_start
函数的起始地址开始,遍历所有的代码,检查是否有jmp rbx的opcode存在。因为我们知道在跳转之前的代码都是能够正确执行的,所以我们jmp rbx
之前的代码保存在输出文件中。接下来我们调用reverse
函数,转换_start
函数的代码,继续往下执行。
我们用IDA打开已经去混淆的二进制文件,代码已经能够读懂了。但是IDA似乎无法创建函数?及时我们手动创建,也还是会出现错误:
The function has undefined instruction/data at the specified address..
从上到下看了一遍之后,我注意到没有返回状态,所以我把最后一个NOP(0x90)
修改为了RET(0xC3)
之后按P创建函数,F5看伪代码
那,到了这里大家好像就觉得,“啊,就是个异或和加运算”,这样往下走就行了对不对?并不是!!!
有一点不要忘了,因为reverse
函数的存在我们这里面的loc_600194
里面的数据,每执行一次reverse函数,都会进行交换。
所以还是要回到汇编代码上来看
先单步来解释一下:
因此写出来公式为 Input[i] ^ A[i] + B[i] = 0; i为奇数
Input[i] ^ B[i] + A[i] = 0; i为偶数
计算Flag的代码为:
最后输出flag:TSGCTF{S0r3d3m0_b1n4ry_w4_M4wa77e1ru}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2020-7-14 09:48
被CrackM编辑
,原因: 补充附件