April 27, 2022

PWNHUB-LetsGo

0基础go逆向,麻了,直接找乱找,后来下个断点终于找到了

0x00 日常查壳

无壳go逆向(雾

image-20220425172513888

0x01 分析主函数

go第一次逆,根本一头雾水,就是动调跟,跟着跟着还能莫名跑飞??好像是什么并发然后就会跑到其他线程?

image-20220425173923898

下面就是关键的加密函数了,不过跟不进加密函数,经过几番调试,在数据上下个写入断点发现加密逻辑

image-20220425174147314

直接跳到main_f,其实找就找到这个了,就是跟不上很懵

image-20220425174217899

动调跟到最后的判断,知道是rax和rbx,一个是我们输入一个是密文,提取密文

image-20220425174533864

0x02 GetFlag

写个脚本简单直出

1
2
3
4
5
6
7
8
9
10
data = [  0x07, 0x0A, 0x14, 0x55, 0x1C, 0x51, 0x57, 0x5C, 0x10, 0x02,
0x02, 0x4F, 0x51, 0x18, 0x03, 0x04, 0x05, 0x4D, 0x1A, 0x19,
0x51, 0x4E, 0x53, 0x01, 0x09, 0x0D, 0x43, 0x00, 0x4F, 0x52,
0x5A, 0x5C, 0x40, 0x02, 0x01, 0x4B, 0x52, 0x03, 0x4C, 0x1B,
0x52, 0x50]

for i in range(0, len(data), 3):
print(chr(127 - data[i + 2] ^ data[i] ^ data[i + 1]), end = "")
print(chr(127 - data[i + 2] ^ data[i]), end = "")
print(chr(127 - data[i + 2] ^ data[i + 1]), end = "")

GetFlag!

image-20220425174616372

关于官方WP额外扩展

通过官方WP是得知到底是在哪里实现的

image-20220427155233138

比较有意思的是前面处理完数据,再在这接收数据进行修改,所以每次跟的迷惑就是这了,不过下断点还是能找到关键加密位置的

image-20220427155342079

引用自WP

  1. 主要流程并不复杂,通过 fmt_Fscanf 获取输入,

  2. strings_Map 调用 main_main_func1 进行映射

  3. 之后 runtime_stringtoslicebyte 将映射后的输入转为 []byte

  4. runtime_makechan 创建 channel,在循环中,获取 []byte [i:i+3] 的 slice

  5. 将 slice 和 channel 一同传给 main_maindwrap1 调用 goroutine main_f 进行处理

  6. runtime_chanrecv1 获取处理结果,runtime_memmove 将结果复制回 []byte [i:i+3]

  7. 循环处理结束后,调用 runtime_memequal 将处理结果与正确结果进行比较。

DASCTF X SU
🍬
HFCTF2022
🍪

About this Post

This post is written by P.Z, licensed under CC BY-NC 4.0.