SMC代码自修改基础练习题

0x00 代码自修改简介


SMC(self-Modifying Code),就是在真正执行某一段代码时,程序会对自身的该段代码进行自修改,只有在修改后的代码才是可汇编,可执行的。在程序未对该段代码进行修改之前,在静态分析状态下,均是不可读的字节码,IDA之类的反汇编器无法识别程序的正常逻辑。是一种反调试代码技术。


0x01 TSCTF—代码自修改writeup

  • 整体流程

    首先用IDA打开程序,然后F5反汇编查看伪代码。
    可以发现程序的逻辑是:可以输入100个字符,当输入字符串长度为28且“v6”= ‘}’时,程序对byte_414C3C异或0x7D解密后执行解密出的函数,否则输出“Try again”。
    SMC代码自修改基础练习题_第1张图片

  • sub_414C3C函数流程
    接下来我们查看byte_414C3C。因为程序中可以很清楚的看到这里有明显的SMC代码自解密。直接跟进查看该字节串。查看得知起始地址为00414C3C,结束地址为00414C9F。
    SMC代码自修改基础练习题_第2张图片

要想知道程序接下来做了什么,我们就要对byte_414C3C解密,因为该题仅对该代码进行了简单的0x7D异或,我们可以直接执行脚本(格式为.idc)来解密。脚本如下:

#include 

static main()
{
    auto addr = 0x00414A3C;   //这里填入要解密字节串的起始地址
    auto i = 0;
    for(i=0;addr+i<0x00414C9F;i++)   //循环结束的条件为字节串的结束地址
    {
        PatchByte(addr+i,Byte(addr+i)^0x7D);   //异或的数字根据情况修改
    }
}

放入IDA中执行该脚本:
SMC代码自修改基础练习题_第3张图片
SMC代码自修改基础练习题_第4张图片

按快捷键‘c’将其转化为汇编代码,再“create function”将其变为函数,即可反汇编为伪代码。
SMC代码自修改基础练习题_第5张图片
SMC代码自修改基础练习题_第6张图片

函数自解密后我们观察IDA中的伪代码就可知:输入的前五个字符依次等于‘flag{’,然后执行sub_414BE0的自解密。

  • sub_414BE0函数流程
    同样利用脚本自解密,不再过多描述。解密后反汇编伪代码如下:
    SMC代码自修改基础练习题_第7张图片

根据while中的条件判断我们可以化简得到while后代码执行的条件为:
*(a1+v3)^0xCC == (&v5+v3),也就是输入的字符异或0xCC对应与v5中的数相等。
所以输入字符串的第6~9个字符应该为:The_(注意反序)

  • sub_414A84

    解密反汇编后伪代码如下:
    SMC代码自修改基础练习题_第8张图片
    SMC代码自修改基础练习题_第9张图片
    SMC代码自修改基础练习题_第10张图片

Sub_414A84代码非常长,反编译后观察发现有点像base64编码(符合替换表中A-Z,a-z,0-9,+,/ 以及在编码末尾的 ‘=’)
打开OD(OD动态运行程序进入到第三个函数,之前两个函数的输入规则一定要满足)动态运行程序,发现随便输入数字时结果就是为输入10~17位的base64编码。根据IDA伪代码可知,该串字符的base64编码要与程序初始给的字符串进行比较,正确后解密sub_414A30函数并执行。
这里的输入规则为:realCtF_

  • sub_414A30函数流程

    解密后伪代码如下:
    SMC代码自修改基础练习题_第11张图片
    sub_414A30函数,已经是最后一个函数了。输入的值为字符串的第18位。
    因为没看懂IDA中第一个do-while的意思,在OD中打开,发现V2最后的值变到了10。也就是剩余未确定输入的位数。
    SMC代码自修改基础练习题_第12张图片
    之后就是逐个比较输入与程序给定的“kvtu’C4h”o”字符-1,正确则成功执行所有程序。最后十个输入为:just_B3g!n

  • 总结

    综上所述,本题flag为:flag{The_realCtF_just_B3g!n}

你可能感兴趣的:(CTF)