2020MRCTF(Re)-Hard-to-go(WP)
2021-04-16 18:59:00 Author: mp.weixin.qq.com(查看原文) 阅读量:157 收藏

本文为看雪论坛优秀文章

看雪论坛作者ID:SYJ-Re

题目下载地址:

https://www.jianguoyun.com/p/DXPFHvIQiNbmBxjshoID

拿到程序查壳后发现无壳直接拖入ida进行分析。

然后发现没有符号表。

我们导入一个插件。

https://github.com/Mas0nShi/IDAGolangHelper

直接将zip下载下来然后解压,解压之后将文件夹中的两个内容移动到IDA7.5的plugins目录下,然后重新打开ida即可。

然后将文件载入的时候:

点击Rename function,即可重新命名函数。

之后直接找到main.main开始分析:

// main.main__int64 __fastcall main_main(__int64 *a1, __int64 a2, int a3, __int64 a4, int a5, int a6){int v6; // edxint v7; // ecxint v8; // er8int v9; // er9int v10; // er8int v11; // er9int v12; // edx__int64 v13; // rcxint v14; // er8int v15; // er9int v16; // edxint v17; // ecxint v18; // er8int v19; // er9int v20; // edxint v21; // ecxint v22; // er8int v23; // er9int v24; // er8__int64 v25; // r9int v26; // esiint v27; // er8__int64 *v28; // r9int v29; // er8int v30; // er9int v31; // edx__int64 result; // rax_QWORD *v33; // [rsp+8h] [rbp-C0h]__int64 v34; // [rsp+18h] [rbp-B0h]__int64 v35; // [rsp+18h] [rbp-B0h]unsigned __int64 v36; // [rsp+20h] [rbp-A8h]__int64 v37; // [rsp+28h] [rbp-A0h]__int64 v38; // [rsp+28h] [rbp-A0h]__int64 v39; // [rsp+30h] [rbp-98h]unsigned __int64 v40; // [rsp+40h] [rbp-88h]_BYTE key[12]; // [rsp+48h] [rbp-80h] BYREF_BYTE v42[12]; // [rsp+54h] [rbp-74h] BYREF__int64 v43; // [rsp+80h] [rbp-48h] BYREF_QWORD *v44; // [rsp+88h] [rbp-40h]__int128 v45; // [rsp+90h] [rbp-38h] BYREF__int128 v46; // [rsp+A0h] [rbp-28h] BYREF__int128 v47; // [rsp+B0h] [rbp-18h] BYREFwhile ( (unsigned __int64)&v43 <= *(_QWORD *)(__readfsqword(0xFFFFFFF8) + 16) )runtime_morestack_noctxt();qmemcpy(v42, "MRCTF_GOGOGO", sizeof(v42));crypto_rc4_NewCipher((int)a1, a2, a3, (int)v42, a5, a6, (__int64)v42, 12LL);if ( dword_592FA0 ){a1 = &byte_577540;runtime_gcWriteBarrier(&byte_577540, a2, v6, v7, v8, v9);}else{byte_577540 = v34;}runtime_newobject((_DWORD)a1, a2, v6, v7, v8, v9, (__int64)&unk_4ACA60);v44 = v33;*(_QWORD *)&v47 = &unk_4A9740;*((_QWORD *)&v47 + 1) = v33;fmt_Fscanln( // 输入(int)a1,a2,(int)&byte_4EBFC0,(unsigned int)&v47,v10,v11,(__int64)&byte_4EBFC0,byte_577550,(__int64)&v47,1LL,1LL);main_move((int)a1,a2,v12,v13,v14,v15,4LL,(__int64)&unk_4D0B6F,1LL,(__int64)&unk_4D0B76,1LL,(__int64)&unk_4D0B70,1LL);qmemcpy(key, "MRCTF_GOGOGO", sizeof(key));crypto_rc4_NewCipher((int)a1, a2, v16, v17, v18, v19, (__int64)key, 12LL);// rc4初始化if ( dword_592FA0 ){a1 = &byte_577540;runtime_gcWriteBarrier(&byte_577540, a2, v20, v21, v22, v23);}else{byte_577540 = v35;}v40 = v44[1];runtime_makeslice((int)a1, a2, (__int64)qword_4ACBA0, v40, v22, v23, qword_4ACBA0, v40, v40);v43 = v35;runtime_stringtoslicebyte((_DWORD)a1, a2, v44[1], *v44, v24, v25);v26 = v40;v39 = v37;crypto_rc4__ptr_Cipher_XORKeyStream((int)a1, v40, v36, v35, v27, v28, byte_577540, v43, v40, v40, v35, v36);// rc4_crypto部分,点击a1过去可以看见第一个参数就是我们输入的字符串v31 = qword_577948;if ( qword_577948 == v40 || (v26 = v43, v38 = qword_577950, internal_bytealg_Compare(), v39) ){*(_QWORD *)&v45 = &unk_4ACA60;*((_QWORD *)&v45 + 1) = &off_4EA7D0;result = fmt_Fprintln((_DWORD)a1,v26,v31,(unsigned int)&off_4EBFE0,v29,v30,(__int64)&off_4EBFE0,byte_577558,(__int64)&v45,1LL,1LL,v38,v39);}else{*(_QWORD *)&v46 = &unk_4ACA60;*((_QWORD *)&v46 + 1) = &off_4EA7C0;result = fmt_Fprintln((_DWORD)a1,v26,v31,(unsigned int)&off_4EBFE0,v29,v30,(__int64)&off_4EBFE0,byte_577558,(__int64)&v46,1LL,1LL,v38,0LL);}return result;}

可以看出就是一个标准的RC4加密,我们可以直接操作内存得到flag。

先逐步动调,修改跳转条件(一个jz改为jnz),因为此时我们是随便输入的长度,让程序能够执行函数:

internal_bytealg_Compare

将rdi,即最后加密的数据复制出进行处理。

然后再次重新动调,这次我们要输入30个字符长度的字符串aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

到这个函数时,将参数a1所对应内存的值直接修改为加密后的数据。

最后查看rsi的值:

就得到了flag:
CTCFTFCTFCFTCTCFTFTCFCTFCTCFTF
本文中附件可点击左下方阅读原文自行下载

- End -

看雪ID:SYJ-Re

https://bbs.pediy.com/user-home-921830.htm

  *本文由看雪论坛 SYJ-Re 原创,转载请注明来自看雪社区。

# 往期推荐

公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]

球分享

球点赞

球在看

点击“阅读原文”,了解更多!


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458383774&idx=1&sn=57e13ef249bf29b6764b81547215cfe3&chksm=b180c51486f74c02555d370eda045cd67e39e5d7d941b35c87c0d9fbed2ed983958e82bcfba0#rd
如有侵权请联系:admin#unsafe.sh