某安全公司实习生,目前正在学习逆向和木马分析,希望能从各位大佬身上学习并提升自己。
公钥K = 基点G * 私钥k
mov byte ptr ss:[ebp-5],0
mov eax, dword ptr fs:[0x30]
mov al, byte ptr [eax + 2]
mov byte ptr [ebp - 5], al
movzx eax, byte ptr [ebp - 5]
k_is_9:0042F000 start proc near
k_is_9:0042F000 mov byte ptr [ebp-5], 0
k_is_9:0042F004 mov eax, large fs:30h
k_is_9:0042F00A mov al, [eax+2]
k_is_9:0042F00D mov [ebp-5], al
k_is_9:0042F010 movzx eax, byte ptr [ebp-5]
k_is_9:0042F014 test eax, eax
k_is_9:0042F016
k_is_9:0042F016 loc_42F016: ; CODE XREF: start:loc_42F08A↓j
k_is_9:0042F016 jnz short loc_42F08A
k_is_9:0042F018 jmp sub_4110FF
int __usercall keyFunc@<eax>(int a1@<xmm0>)
{
int v1;
int v2;
int v3;
int v4;
int v5;
int v6;
int v7;
int v8;
int v9;
int v10;
_DWORD *v11;
int v12;
int v13;
void *v14;
int v16;
int v17;
void *v18;
char v19;
struc_String *keyString_1;
struc_String *keyString;
int v22;
char goalBuf[56];
char v24;
int v25;
char v26;
char v27;
struc_String sting;
int *v29;
int v30;
int v31;
struc_String goalString;
struc_String keyStringFromInput;
int v34;
int v35;
int savedregs;
G1.x = 11;
G1.y = 4;
v30 = j_timesPiont((struc_Point *)a1, &G1, times);
v31 = v1;
G2.x = v30;
G2.y = v1;
sub_4113B6((int)&keyStringFromInput, a1, byte_4252C2);
v35 = 0;
v2 = sub_411802(std::cout, "Ep = y^2 = x^3 + 125*x ");
v3 = std::basic_ostream<char,std::char_traits<char>>::operator<<(v2, sub_411159);
j_asmFun(v4, &v19 == &v19, v3, a1);
v5 = sub_411802(std::cout, "Prime field p=127,base point G(11,4),publicK(120,41) please find private key k");
v6 = std::basic_ostream<char,std::char_traits<char>>::operator<<(v5, sub_411159);
j_asmFun(v7, &v19 == &v19, v6, a1);
v8 = sub_411802(std::cout, "input your flag:");
v9 = std::basic_ostream<char,std::char_traits<char>>::operator<<(v8, sub_411159);
j_asmFun(v10, &v19 == &v19, v9, a1);
getInput(a1, std::cin, &keyStringFromInput);
v29 = &v16;
v22 = sub_411447(&v16, a1, &keyStringFromInput);
keyString = (struc_String *)calcuKey(a1, (int)&sting);
keyString_1 = keyString;
stringCopy(&keyStringFromInput, a1, keyString);
releaseString(&sting, a1);
goalBuf[0] = 0x5E;
goalBuf[1] = 0x26;
goalBuf[2] = 0;
goalBuf[3] = 0x13;
goalBuf[4] = 94;
goalBuf[5] = 38;
goalBuf[6] = 86;
goalBuf[7] = 94;
goalBuf[8] = 94;
goalBuf[9] = 38;
goalBuf[10] = 45;
goalBuf[11] = 121;
goalBuf[12] = 94;
goalBuf[13] = 38;
goalBuf[14] = 4;
goalBuf[15] = 5;
goalBuf[16] = 94;
goalBuf[17] = 38;
goalBuf[18] = 90;
goalBuf[19] = 116;
goalBuf[20] = 94;
goalBuf[21] = 38;
goalBuf[22] = 49;
goalBuf[23] = 73;
goalBuf[24] = 94;
goalBuf[25] = 38;
goalBuf[26] = 8;
goalBuf[27] = 41;
goalBuf[28] = 94;
goalBuf[29] = 38;
goalBuf[30] = 94;
goalBuf[31] = 55;
goalBuf[32] = 94;
goalBuf[33] = 38;
goalBuf[34] = 53;
goalBuf[35] = 2;
goalBuf[36] = 94;
goalBuf[37] = 38;
goalBuf[38] = 12;
goalBuf[39] = 92;
goalBuf[40] = 94;
goalBuf[41] = 38;
goalBuf[42] = 98;
goalBuf[43] = 50;
goalBuf[44] = 94;
goalBuf[45] = 38;
goalBuf[46] = 57;
goalBuf[47] = 41;
goalBuf[48] = 94;
goalBuf[49] = 38;
goalBuf[50] = 16;
goalBuf[51] = 51;
goalBuf[52] = 94;
goalBuf[53] = 38;
goalBuf[54] = 102;
goalBuf[55] = 18;
v18 = j_getThis_0((int)&v27);
v11 = sub_4112C1(&v26, (int)goalBuf, (int)&v24);
createString(&goalString, a1, *v11, v11[1], (int)v18);
if ( stringCmp((int)&keyStringFromInput, a1, (int)&goalString) )
sub_41186B("try again", v19);
else
sub_41186B("Congratulations~~", v19);
v12 = system("pause");
j_asmFun(v13, &v19 == &v19, v12, a1);
v25 = 0;
releaseString(&goalString, a1);
v35 = -1;
releaseString(&keyStringFromInput, a1);
v18 = v14;
v17 = v25;
sub_411677((int)&savedregs, (int)&dword_41BC54);
return j_asmFun((unsigned int)&savedregs ^ v34, 1, v17, a1);
}
for ( i = 0; ; ++i )
{
len = getInpuKeyLen((int)sting, a1);
if ( i >= len )
break;
index = i;
oneKey = *(char *)getKeyByIndex((int)sting, a1, i);
pointPair_1 = (struc_PointPair *)timesPiontByOneKey(a1, &pointPair, index, oneKey);
copyPoint_1(&pointPair_2, a1, pointPair_1);
j_addZuobiao2Buf_0(a1, (struc_String *)&resultStr, pointPair_2.p1_x);
j_addZuobiao2Buf_0(a1, (struc_String *)&resultStr, pointPair_2.p1_y);
j_addZuobiao2Buf_0(a1, (struc_String *)&resultStr, pointPair_2.p2_x);
j_addZuobiao2Buf_0(a1, (struc_String *)&resultStr, pointPair_2.p2_y);
}
int __usercall timesPiontByOneKey_0@<eax>(struc_Point *a1@<xmm0>, struc_PointPair *result, int index, int onekey)
{
int y1AfterTimes;
int y2AfterTimes;
struc_Point p1;
struc_Point p2;
int v9;
int savedregs;
p2.x = j_timesPiont(a1, &G1, 17);
p2.y = y1AfterTimes;
p1.x = index * j_timesPiont(a1, &G2, 17) % 127;
p1.y = onekey * y2AfterTimes % 127;
copyPoint(result, (int)a1, (int)&p2, (int)&p1);
sub_411677((int)&savedregs, (int)&dword_417788);
return j_asmFun((unsigned int)&savedregs ^ v9, 1, (int)result, (int)a1);
}
createString(&goalString, a1, *v11, v11[1], (int)v18);
if ( stringCmp((int)&keyStringFromInput, a1, (int)&goalString) )
sub_41186B("try again", v19);
else
sub_41186B("Congratulations~~", v19);
public class Q3CTF8 {
static char [] result1 = {0x13,0x5E,0x79,0x05,0x74,0x49,0x29,0x37,0x02,0x5C,0x32,0x29,0x33,0x12};
static char key;
public static void main(String[] args)
{
for(int k = 0;k<result1.length;k++)
{
key = result1[k];
for(int i =0;i<0xff;i++)
{
if(i*0x5A%127==key)
{
System.out.printf("%c",i);
break;
}
}
}
}
}
详情请查看 录制你的专属视频,玩出CTF新花样!
往期赛题
* 看雪.纽盾 KCTF 2019 Q3 | 第一题点评及解题思路
* 看雪.纽盾 KCTF 2019 Q3 | 第二题点评及解题思路
* 看雪.纽盾 KCTF 2019 Q3 | 第三题点评及解题思路
* 看雪.纽盾 KCTF 2019 Q3 | 第四题点评及解题思路
* 看雪.纽盾 KCTF 2019 Q3 | 第五题点评及解题思路
合作伙伴