跳转至

背景

第一次交流会上用LCTF的re1做了一次演示,其实这道题的出题者是从看雪ctf的re2中得到的方法,两题的制作思路都是让用户在正常情况下无法成功得到flag(正常情况下会进入一个无解方程组或者是其他无解运算),然后作者不设置缓冲区溢出保护,提示我们利用缓冲区溢出跳转到已经设定好了的真正算法处。

在这里不建议看lctf的re1,本身这种出题思路有很有BUG,而这道题的验证算法里又有bug,于是建议直接食用kanxuectfre2。

这道题的原题在这里: https://ctf.pediy.com/game-fight-47.htm

备份一份下载链接: ctf2017_Fpc

writeup

观察

regcode: 1234 5678 9abc 分别对应x y z 输入任意regcode,跟一下,可以发现是一个无解方程(用z3可以发现即使在整数溢出条件下也是无解的)

然后反汇编上下拉一下,会观察到可疑乱序代码,考虑使用栈溢出return过去 可疑乱序代码段首:00413131,对应11A结尾字符串,字符串长度15

ps.在考虑段首这里有过犹豫,如果定位在代码0041312F处,这样return进来的参数在乱序段末最终被xor为00401021,进而跳回原处几乎完美地继续执行,这样会导致无穷解的出现,不知是作者有意为之还是无意凑巧。

//这样可以构造无穷解(x为任意字符):
//其实看雪ctf有要求就是flag只能是字母和数字,也不算无穷解
xxxxxxxxxxxx/1A
话说因为这个原因我还在想是不是题目有问题,后来观察了一下乱序代码里的花指令才发现新东西
//还原的加花乱序
////////////////////////////////////////
 add esp,-0x10
 xor eax,eax
 mov dword ptr ds:[0x41B034],eax

 pop eax        //eax=x
 mov ecx,eax    //ecx=x

 pop eax        //eax=y
 mov ebx,eax    //ebx=y

 pop eax        //eax=z
 mov edx,eax    //edx=z
 mov edx,eax    
 mov eax,ecx    //eax=x
 sub eax,ebx    //eax=x-y
 shl eax,0x2    //eax shl 2
 add eax,ecx    //eax+=x
 add eax,edx    //eax+=z
 sub eax,0xEAF917E2 //(必须为零)
 add eax, ecx   //eax=x
 sub eax, ebx   //eax-=y
 mov ebx, eax   //ebx=(x-y)
 shl eax, 1     //eax shl 1
 add eax, ebx   //eax+=(x-y)
 add eax, ecx   //eax+=x
 mov ecx, eax   //ecx=eax
 add eax, edx   //eax+=edx
 sub eax, 0xe8f508c8 //(必须为零)
 mov eax, ecx   //eax=original
 mov eax, ecx
 sub eax, edx   //eax-=edx
 sub eax, 0xc0a3c68 //(必须为零)
 pop eax
 xor eax, 0x8101
 mov edi, eax
 xor eax, eax
 stosd dword ptr es:[edi], eax
 call 0x413841  //00413830 PUSH 00413835
 pop eax
 push eax
 mov edi, eax
 mov edi, eax
 push 0x4e000969
 pop eax
 xor eax, edx
 stosd dword ptr es:[edi], eax
 xor eax, 0x10a3e
 stosd dword ptr es:[edi], eax
 xor eax, ebx
 xor eax, 0x22511e14
 stosd dword ptr es:[edi], eax
 xor eax, 0x61642d
 xor eax, dword ptr [0x41b034]
 jmp eax
 ////////////////////////////////////////////

据此可以求出算法,逆推出flag

Algorithm

((x-y) shl 2)+x+z==0xEAF917E2 3942193122‬ (x-y) shl 1 + (x-y) +x+z==0xe8f508c8 3908372680 (x-y) shl 1 + (x-y) +x-z==0xc0a3c68 201997416

z=1853187632=0x6e756630

4x-3y==3908372680-1853187632=2055185048 4(x-y)+x=5x-4y=3942193122‬-1853187632=2089005490 x -> 1953723722(0x7473754A), y -> 1919903280(0x726F6630)

Regcode

x y z: 4A757374 30666F72 3066756E Just 0for 0fun

Total

Just0for0fun11A