hgame ShinyShot!

就是mark一下里面smc

解法
做的时候可以直接锁定加密部分sub_4014FA函数

size_t __cdecl sub_4014FA(char *a1, char *a2)
{
  int v2; // eax@3
  int v3; // ebx@5
  int v4; // eax@5
  int v5; // ebx@7
  int v6; // eax@7
  size_t result; // eax@17
  signed int v8; // [sp+10h] [bp-18h]@1
  size_t v9; // [sp+10h] [bp-18h]@15
  int j; // [sp+14h] [bp-14h]@15
  signed int i; // [sp+18h] [bp-10h]@1
  int v12; // [sp+1Ch] [bp-Ch]@1

  v12 = 0;
  v8 = 4 * strlen(a1) / 3;
  for ( i = 0; i < v8; ++i )
  {
    if ( i & 3 )
    {
      if ( ((((i >> 32) >> 30) + i) & 3) - ((i >> 32) >> 30) == 1 )
      {
        v3 = 16 * a1[v12 - 1] & 0x30;
        v4 = v12++;
        a2[i] = byte_405020[v3 | (a1[v4] >> 4)];
      }
      else if ( ((((i >> 32) >> 30) + i) & 3) - ((i >> 32) >> 30) == 2 )
      {
        v5 = 4 * a1[v12 - 1] & 0x3C;
        v6 = v12++;
        a2[i] = byte_405020[v5 | (a1[v6] >> 6)];
      }
      else
      {
        a2[i] = byte_405020[a1[v12 - 1] & 0x3F];
      }
    }
    else
    {
      v2 = v12++;
      a2[i] = byte_405020[(a1[v2] >> 2)];
    }
  }
  if ( strlen(a1) % 3 == 1 )
  {
    a2[v8] = byte_405020[16 * a1[v12 - 1] & 0x30];
    a2[v8 + 1] = 61;
    a2[v8 + 2] = 61;
  }
  else if ( strlen(a1) % 3 == 2 )
  {
    a2[v8] = byte_405020[4 * a1[v12 - 1] & 0x3C];
    a2[v8 + 1] = 61;
  }
  a2[strlen(a2)] = 0;
  v9 = strlen(a2);
  for ( j = 0; ; ++j )
  {
    result = v9 - 1;
    if ( (v9 - 1) <= j )
      break;
    a2[j + 1] ^= a2[j];   //每个字符异或和前一位异或
  }
  return result;
}
图片.png

改表的base64

图片.png

文件32位跟加密后数据对比


图片.png

字符异或得到

DnY0m19iAgArMKjSP2Uvme8wOzb0iD==

从网上找个base64解码,套脚本就好

题目的解法很简单

关于smc可以看到

int __cdecl sub_4017AA(char a1)
{
  char *Str; // ST00_4@4
  char *MaxCount; // [sp+4h] [bp-200h]@3
  int DstBuf; // [sp+Eh] [bp-1F6h]@1
  __int16 v5; // [sp+12h] [bp-1F2h]@1
  int v6; // [sp+3Ch] [bp-1C8h]@1
  CHAR Filename; // [sp+40h] [bp-1C4h]@1
  char Str1; // [sp+144h] [bp-C0h]@1
  char Buf[60]; // [sp+1A8h] [bp-5Ch]@1
  unsigned int mum; // [sp+1E4h] [bp-20h]@1
  FILE *v11; // [sp+1E8h] [bp-1Ch]@4
  char *v12; // [sp+1FCh] [bp-8h]@1

  v12 = &a1;
  sub_401EE0();
  puts("Sorroundings...Weird..");
  mum = 0;
  memset(Buf, 0, sizeof(Buf));
  memset(&Str1, 0, 0x64u);
  memset(&Filename, 0, 0x104u);
  DstBuf = 0;
  v6 = 0;
  memset((&v5 & 0xFFFFFFFC), 0, 4 * (((&DstBuf + -(&v5 & 0xFFFFFFFC) + 50) & 0xFFFFFFFC) >> 2));
  puts("I see!It's not my fault!Wrong is the world!");
  puts("So..Now I should give a shot to fix it!");
************************************************************************
  scanf("%u", &mum);    //输入一个数字
  if ( mum > 0x20000 )  //判断输入数字大小
    sub_40178C();      
  getchar();                 //吃掉回车
  sub_401460(mum);   //关键
  puts("And then,a shiny explosion!");
  fgets(Buf, 59, iob);
  Buf[strlen(Buf) - 1] = 0;
  if ( strlen(Buf) != 22 )
    sub_40178C();
**************************************************************************
  puts("Seems I have passed a test.");
  sub_4014FA(Str, MaxCount);
  GetModuleFileNameA(0, &Filename, 0x104u);
  v11 = fopen(&Filename, "rb");
  fseek(v11, -32, 2);
  fread(&DstBuf, 0x20u, 1u, v11);
  fclose(v11);
  if ( !strcmp(&Str1, &DstBuf) )
  {
    puts("Congratulations!");
    puts("The flag is hgame{your input string + your input num}");
    puts("e.g:hgame{aaaaaaaaaa111}");
  }
  else
  {
    printf("But Failed..Finally");
  }
  return 0;
}

进入sub_401460函数

BOOL __cdecl sub_401460(unsigned int a1)
{
  DWORD flOldProtect; // [sp+14h] [bp-14h]@1
  unsigned int v3; // [sp+18h] [bp-10h]@1
  unsigned int v4; // [sp+1Ch] [bp-Ch]@1

  flOldProtect = 0;
  VirtualProtect(TopLevelExceptionFilter, 0x4000u, 0x40u, &flOldProtect);//更改页属性
  v4 = a1 >> 3;  
  v3 = a1 & 7;   
  *(TopLevelExceptionFilter + (a1 >> 3)) ^= 1 << (a1 & 7);
  return VirtualProtect(TopLevelExceptionFilter, 0x4000u, flOldProtect, &flOldProtect);  //基址是TopLevelExceptionFilter ,0x401000
}

做的时候并没有太注意,没有详细分析。当喵说了安卓的smc的时候才知道这个也是更改了某个地址。

*(TopLevelExceptionFilter + (a1 >> 3)) ^= 1 << (a1 & 7);
[地址基址 + (输入的数字右移三位)] 和输入数字的后三位异或]
7 bin 0111
后边3位可以与某个地址异或,剩下的几位作为地址偏移来改变某一地方。

图片.png

查看反汇编发现了此处跳传导致sub_4014FA函数没有参数进栈。
这两个参数的作用是显示出


图片.png

怎么能保证正常跳转呢?这就需要使用上面分析的,将jmp short loc_4018F5改为jmp short loc_4018E5

jmp short loc_4018F5的机器码为 EB 15;JMP的机器码为EB,15为偏移。

0x15 = 0x4018F5 - 0x4018DE - jmp长度(2byte)

那么跳到 loc_4018E5就是

x4018E5-0x4018DE-0x2=0x5

所以输入数字最低三位应为100
要修改的字节的地址是0x4018DF ,所以输入的数字:
mum=(0x8df<<3) + 0x4 = 0x46FC=18172
(当然可以直接在文件中更改


图片.png

这样这个题目也算是完整了:
Byt3_H4cker_sho0O0o0t!


图片.png

总结:和安卓的那个smc很像,基本可以归为一类但实现smc的方法明显安卓的要复杂不少。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 王爽汇编全书知识点大纲 第一章 基础知识 机器语言 汇编语言的产生 汇编语言的组成 存储器 cpu对存储器的读写 ...
    2c3ba901516f阅读 2,405评论 0 1
  • 一、基础知识 mov ax,bx把BX内容送到AX中。汇编语言有3类指令,汇编指令、伪指令,其他符号。CPU通过地...
    赤果_b4a7阅读 1,836评论 0 1
  • 手脱UPX的四种方法 首先,查壳,使用PEID是UPX 0.89.6 - 1.02 / 1.05 - 1.24 -...
    小浪崇礼阅读 488评论 0 0
  • 唐城坊,名字取得也挺东方的。我喜欢。 刚来的时候,看到这些店,还以为是多年前,像我们中国那种买一张卡,可以在电话亭...
    花花哒世界阅读 331评论 0 2
  • 春花、秋月、夏日、冬雪, 四季变化都是极美的, 岁月流逝,世事变迁, 你我已不是昨日少年, 我只愿能够不改初心, ...
    悠游自在阅读 253评论 0 0