-
-
[原创]神秘系统分析
-
发表于:
2014-3-16 23:29
11820
-
我想坛里的大神们很多参加了上周的BCTF,不知为何exploit全是liunx下的,当时看到只有玩泥巴le,希望有大神指导。玩不来liunx的只有认真的将神秘系统进行了一番分析。
附件里有解密后的idb分析记录,与分析报告。
sm.zip
(一)accesscode获取:
神秘的系统,打开发现1FEH 55AA 这是MBR(系统引导)首先分析这部分数据,主要功能就是将数据拷贝到0x8000处然后会利用输入的accesscode 去解密200H~A00H处。
解密算法根据输入的4个(0~9)循环依次解密
第一个肯定是一个call或者jmp,根据opcode可以推导
后面就是一个E8跳偏移,头执行哪个E8 *** BCTF,然后就可以推断出1337
然后解密:
include "stdio.h"
#include <windows.h>
#define SIZE_CODE 0x800
int main()
{
BOOL BRet = FALSE;
DWORD dwsize = 0;
char buf[SIZE_CODE] = {0};
HANDLE hFile = NULL;
hFile = CreateFile("bctfos.3bbbcae1ea13b566477c99941a5eee63",GENERIC_WRITE|GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL
);
if (hFile == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, NULL, "error", MB_OK);
return -1;
}
SetFilePointer(hFile, 0x200, NULL, FILE_BEGIN);
BRet = ReadFile(hFile, buf, 0x800, &dwsize, NULL);
if (!BRet)
{
printf("sdas");
return -1;
}
for (int i = 0; i*4 < 0x800; i++)
{
buf[i*4] = buf[i*4] ^ 0x31;
}
for (i = 0; 1+i*4 < 0x800; i++)
{
buf[1+i*4] = buf[i*4+1] ^ 0x33;
}
for (i = 0; 2+i*4 < 0x800; i++)
{
buf[2+i*4] = buf[2+i*4] ^0x33;
}
for (i = 0; 3+i*4 < 0x800; i++)
{
buf[3+i*4] = buf[3+i*4] ^ 0x37;
}
CloseHandle(hFile);
hFile = CreateFile("1.txt", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ,NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "1.txt", "error", MB_OK);
return -1;
}
SetFilePointer(hFile, NULL, NULL, FILE_BEGIN);
BRet = WriteFile(hFile, buf, 0x800, &dwsize, NULL);
if (!BRet)
{
return -1;
}
CloseHandle(hFile);
return 0;
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!