主函数分析
分析 main 函数

加密逻辑在 sub_DE9 是一个 base64 加密

查看 base 码表和密文,发现是换表加密

但是使用 base 换表解密不对,查看函数也没有别的逻辑
init_array

查看函数列表发现有别的函数,但是在 main 函数中并没有

那么就可能是藏在 init_array 段中,init 函数是在 main 函数之前执行

查看 init_array 段发现执行了 sub_CDA, sub_D83, sub_950 三个函数

依次查看在 sub_CDA 中发现关键逻辑

fork()
用于创建一个子进程,将父进程的代码段、数据段、BSS 段、堆、栈等所有内容复制到这个新进程中执行
在父进程中,fork 会返回子进程的 PID,而在子进程中会返回 0,出错时则返回-1
在执行过程中,经过 fork(),此时有两个进程
执行流程
父进程分支:v2 = PID (>0)
执行 sub_AD7

虽然下面有一些监控寄存器的值和寄存器的操作
但是在 14 行就是 waitpid 等待子进程结束
然后 15 行监控子进程状态,此时子进程已经结束,所以一定!=127,会直接结束
子进程分支:v2=0

调用了 ptrace 来向父进程请求被调试,然后返回结果,成功为 0,失败为-1
这里是用来反调试的,如果被其他调试器占用(IDA)就会返回-1
执行下面的 sub_95A + 7

sub_95A + 7 = sub_961
查看 subA_961 是对主函数中的 byte 数组进行修改,这里推测修改的 base 码表或密文

解题步骤
在 fork()处打上断点动调,然后不让他执行中间的反调试,直接执行 sub_961 中的数组修改

修改为 for( i = 0; i <=0; ++i) 的地址

跳过反调试了,直接执行到 main 函数


查看码表和密文都发生了变化

取数据进行解码

NSSCTF{1f4d518eeaca3306838852ba95d89194}
总结
程序表面只是一个 base64 换表加密,实际涉及了 ELF 文件的执行流程、fork 函数、prace 函数,在 main 函数执行之前对码表和密文进行了替换
1680

被折叠的 条评论
为什么被折叠?



