羊城杯2023
CSGO
学习到了sharpOD orz
IDA的话没办法动调 至少很难动调
FindCrypt插件可以发现有base64加密
查看交叉引用 在汇编代码中定位到字串
.text:000000000049B144 mov [rsp+0C8h+var_88], rcx
.text:000000000049B149 mov [rsp+0C8h+var_80], rdi
.text:000000000049B14E mov [rsp+0C8h+var_70], rdx
.text:000000000049B153 lea rcx, BASE64_table_4D9278 ; "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm"...
.text:000000000049B15A movzx ebx, byte ptr [rax+rcx+0Bh]
.text:000000000049B15F xor eax, eax
.text:000000000049B161 call runtime_intstring
.text:000000000049B166 mov rcx, [rsp+0C8h+var_88]
.text:000000000049B16B mov rdi, rax
.text:000000000049B16E mov rsi, rbx
.text:000000000049B171 xor eax, eax
.text:000000000049B173 mov rbx, [rsp+0C8h+var_70]
.text:000000000049B178 call runtime_concatstring2
.text:000000000049B17D mov rcx, [rsp+0C8h+var_80]
.text:000000000049B182 inc rcx
.text:000000000049B185 mov rdx, rax
.text:000000000049B188 mov rax, rcx
.text:000000000049B18B mov rcx, rbx
在main的汇编可以找到最后加密对比字符串
mov rcx, rbx
lea rbx, aCpqebacrpNZepY ; "cPQebAcRp+n+ZeP+YePEWfP7bej4YefCYd/7cuP"...
call runtime_memequal
test al, al
jnz short loc_49B282
但是直接解发现是乱码
那么要么换表 要么base64后还进行了加密
但是看密文形式(=) 只可能是换表 但只有上面找到的一处lea ... ABCD...
理论可以动调查看
但IDA动调会直接while(1)卡死
反调试逻辑也比较复杂
这里学习到了用x64dbg的sharpOD插件过掉反调试的方法
搜索安装好插件 把默认勾上的都勾上
在x64中搜索ABCD... 定位到代码段
下个断点 就能运行了
输入flag后一直F9 可以发现出现了一个很大的循环 对base64表进行了变换
0000000000B5B14 | 48:895424 58 | mov qword ptr ss:[rsp+58],rdx | [rsp+58]:"LMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHI"
0000000000B5B15 | 48:8D0D 1EE10300 | lea rcx,qword ptr ds:[B99278] | 0000000000B99278:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
可以发现这里逻辑就是做了一个整体平移 那么提取出变表base64解密即可
DASCTF{73913519-A0A6-5575-0F10-DDCBF50FA8CA}
抽空还得看看具体怎么反调试的 以及IDA怎么反反调试
其实通过这段代码(概率性的F5出来了)
v19 = (unsigned __int8)BASE64_table_4D9278[v25 + 11];
v8 = runtime_intstring(
0,
v19,
(unsigned int)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
v24,
(int)v25 + 11,
v12,
v13,
v14,
v15,
v53,
v59);
LODWORD(v9) = v19;
可以猜到大致是移位11位 外面套了个64的循环 那么应该是取index赋值之类
Blast
用D810稍微去了点混淆
main
__int64 __fastcall main(int a1, char **a2, char **a3)
{
...
v45 = a1;
v44 = a2;
v43 = &v8;
v42 = &v8;
v41 = &v8;
v40 = &