-
-
[原创] 看雪CTF.TSRC 2018 - 半加器
-
2018-12-3 14:29 2033
-
给了一个 32bit 的 exe
搜索字符串 Input: 可以找到输入的地方,跟踪输入的字符串
mov ecx, offset unk_5F6007 call antisome push offset aPleaseInput ; "Please Input:" push offset unk_5F31E0 call sub_48CD46 add esp, 8 push 1Eh push offset input_str push offset aS ; "%s" call readsome_48C0EE add esp, 0Ch push offset input_str call strlensome add esp, 4 mov [ebp+var_8], eax cmp [ebp+var_8], 1Eh // 长度 no greate than 0x1e jg short lenerror
可以看到长度<=0x1e, 否则输出错误信息
push offset wrongmsg ; "输入错误;" call printsome add esp, 4 push 0 call exitsome jmp short loc_4A1A7E
接下来做了一些字符串的拷贝, 判断 input[7]=='A', 不对又输出错误信息
push offset input_str push 1Eh mov eax, something2 push eax call memcpysome_48E5BF add esp, 0Ch mov eax, 1 imul ecx, eax, 7 mov edx, something2 movsx eax, byte ptr [edx+ecx] cmp eax, 'A' jz short norerror
后面 调用了一个 函数对输入的字符串进行变换, 具体是
input[7]='#'
然后每个byte 异或 0x1f
mov eax, something2 push eax call xor0x1f_48D3A4 add esp, 4
后面ida解析有点问题,掉了一个不知道什么函数
xor eax, eax pop edi pop esi pop ebx add esp, 0CCh cmp ebp, esp call sub_48D935 mov esp, ebp pop ebp
直接看 something2 的引用,最后进入了一个函数
int __userpurge sub_49DC80@<eax>(int a1@<xmm0>, int a2) { int v2; // edx int v3; // ecx unsigned int i; // [esp+E8h] [ebp-14h] antisome((int)&unk_5F6007); if ( a2 ) { for ( i = 0; i < strlensome(a2); ++i ) *(_BYTE *)(i + a2) ^= 0x1Cu; if ( !strcmpsome(a2, something2) ) { sub_48B4AA(&unk_5F31E0, 111); sub_48B4AA(&unk_5F31E0, 107); } } return sub_48D935(v3, v2, 1, 0, a1); }
看一下谁调用了这个函数可以知道 a2 = 'invalid argument'
所以具体就是
t='' s='invalid argument' for i in s: t+=chr(ord(i)^0x1c^0x1f) print t # jmubojg#bqdvnfmw
将 # 换成 # 即可
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。
赞赏
他的文章
看原图