BUUCTF–[GWCTF 2019]re3学习记录

又是一道很操(没做出来)的题目,学习其他师傅的思路。

第一步:

常规操作,无壳64位,放入IDApro中。

搜索找到main函数,出现红色提示

栈存在问题,修改一下栈的值

 查看main函数,读取,mproct函数,一种保护函数,不是很重要。

mprotect函数详解

 SMC自修改代码

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


第一次看,一脸懵逼,到这里就卡住了,把函数+i??? wtf???点进去查看

 大概意思是将sub_402219函数的汇编代码修改了,最后再次执行,我们静态分析看不出来。而且这里无法动态调试。

查看汇编代码

 发现这里出现了一大堆数据,应该就是我们需要处理的数据。

选中402219数据段 D键转换为数据段。

 这时我们就需要使用IDC脚本进行数据修改(一种类c语言)shift+F2

IDC脚本介绍

IDC脚本举例

IDC函数

#include <idc.idc>

static main()
{
    auto addr = 0x402219;     //声明局部变量 addr是起始地址
    auto i = 0;
    for(i=0;i<224;i++)        
    {
        PatchByte(addr+i,Byte(addr+i)^0x99);   //设置虚拟地址addr处的一个字节值
    }
}

然后将修改后的数据选中,右键分析,选择force强制执行,然后把代码按P键形成函数。

 我们分析一下函数,点进去都是好长一段,试试findcrypt插件,可能是某种加密,发现是AES

 byte_6030A0就是最后加密后的内容

BC0AADC0147C5ECCE0B140BC9C51D52B46B2B9434DE5324BAD7FB4B39CDB4B5B

现在我们需要来求密钥unk_603170.linux远程动态调试(输入一个长为32位的字符串)

CB8D493521B47A4CC1AE7E62229266CE

最后学习别的师傅的脚本

from Crypto.Cipher import AES
from Crypto.Util.number import *
key = long_to_bytes(0xcb8d493521b47a4cc1ae7e62229266ce) #密钥
mi = long_to_bytes(0xbc0aadc0147c5ecce0b140bc9c51d52b46b2b9434de5324bad7fb4b39cdb4b5b) #密文
lun = AES.new(key, mode=AES.MODE_ECB)
flag = lun.decrypt(mi)
print(flag)

得到最后的flag为

flag{924a9ab2163d390410d0a1f670}

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>