-
-
[原创]CTF2019_Q1_Repwn
-
2019-3-12 17:38 2065
-
首先从第八位对预定义字符串进行比较:
.text:00401350 movzx eax, byte ptr [edx+ebp-38h] .text:00401355 cmp al, [ecx+ebx] .text:00401358 jnz short loc_40136C .text:0040135A inc edx .text:0040135B inc ecx .text:0040135C cmp edx, 0Bh .text:0040135F jle short loc_401350
即X1Y0uN3t
而后在sub_401460中:
int __cdecl sub_401460(char *Str) { char Dest; // [esp+8h] [ebp-10h] if ( strlen(Str) == 0x18 ) { if ( sub_4013B0((int)Str) ) { Str[20] -= 88; Str[21] -= 70; Str[22] -= 3; Str[23] -= 107; strcpy(&Dest, Str); } } else { printf("String Length is Wrong"); } return 0; }
首先判断了字符串长度
而后进入sub_4013B0,是几个方程判断:
int __cdecl sub_4013B0(int a1) { int v1; // ebx int v2; // ecx int v3; // esi int result; // eax str_to_num(a1); v1 = num[3] + 1000 * num[0] + 100 * num[1] + 10 * num[2]; v2 = num[5] + 10 * num[4]; v3 = num[7] + 10 * num[6]; result = 2 * (v1 + v2); if ( result == 0xFC8 ) { result = 3 * v2 / 2; if ( result + 100 * v3 == 0x73 ) { result = 1; if ( v1 - 110 * v3 != 0x76C ) result = printf("Key_Is_Wrong,Please_Input_Again!"); } } return result; }
大致推测前八位为十进制字符且分成三个数v1,v2,v3,而后由方程组解出三个数:
from z3 import * x=Int('x') y=Int('y') z=Int('z') solver=Solver() solver.add((2*(x+y))%0xffffffff==0xfc8) solver.add((2*(x+y))%0xffffffff==0xfc8) solver.add((3*y/2+100*z)%0xffffffff==0x73) solver.add((x-110*z)%0xffffffff==0x76c) solver.add(x<9999) solver.add(y<99) solver.add(x>0) solver.add(y>0) solver.add(z>0) solver.add(z<99) print(solver.check()) print(solver.model())
得到:
sat [z = 1, y = 10, x = 2010]
即前面8位为20101001
最后可以看到最后:
Str[20] -= 88; Str[21] -= 70; Str[22] -= 3; Str[23] -= 107; strcpy(&Dest, Str);
存在溢出,类似2017年的一题
需要我们跳到另一处判断
我是通过字符串引用看到sub_4018B0处代码
上层引用看到401BF0处代码未定义,且有printf和system等操作(可疑)
key=[ 0xf0, 0x1b, 0x40, 0x00 ] key[0]+=88 key[1]+=70 key[2]+=3 key[3]+=107 for i in key: x+=chr(i%256) print x
可以得到最后4字节HaCk
输入20101001X1Y0uN3tG00d即可跳到另一处加密
会再次输入并检测字符串,这里通过程序流的关键处理步骤,(好像PiED的插件也可以)可以看出是DES加密,密钥为XiyouNet(开始我把子秘钥位置当做密钥二进制卡了一大会,犯傻了):
from Crypto.Cipher import DES key = 'XiyouNet' kirin=DES.new(key,DES.MODE_ECB) s=kirin.decrypt("\x9d\xb0\x84\xac\x97\x04\x1e\x30") print s #Wel1C0me #Currect,Flag_Format_Is_Input1+Input2
第二步字符串:Wel1C0me
最后于 2019-3-16 20:29
被梅零落编辑
,原因:
赞赏
看原图