首页 > 其他分享 >PMKF [NKCTF2023] RE

PMKF [NKCTF2023] RE

时间:2023-03-30 12:23:23浏览次数:57  
标签:NKCTF2023 ... .. esp int RE ebp PMKF v8

定位到关键函数

int sub_401090()
{
  int v1; // [esp+20h] [ebp-140h]
  int v2; // [esp+24h] [ebp-13Ch]
  int k; // [esp+2Ch] [ebp-134h]
  int i; // [esp+30h] [ebp-130h]
  int v5; // [esp+30h] [ebp-130h]
  int j; // [esp+30h] [ebp-130h]
  int v7; // [esp+30h] [ebp-130h]
  char v8; // [esp+34h] [ebp-12Ch]
  DWORD NumberOfBytesRead; // [esp+3Ch] [ebp-124h] BYREF
  unsigned __int8 Buffer; // [esp+43h] [ebp-11Dh] BYREF
  char v11[16]; // [esp+44h] [ebp-11Ch] BYREF
  char v12[256]; // [esp+54h] [ebp-10Ch] BYREF

  memset(v12, 0, sizeof(v12));
  ReadFile(hObject, &Buffer, 1u, &NumberOfBytesRead, 0);
  if ( Buffer != 5 )
  {
    sub_401690((int)"Wrong!\n");
    CloseHandle(hObject);
    exit(0);
  }
  ReadFile(hObject, v12, Buffer, &NumberOfBytesRead, 0);
  for ( i = 0; i < Buffer; ++i )
  {
    if ( v12[i] != byte_405100[i] )
    {
      sub_401690((int)"Wrong!\n");
      CloseHandle(hObject);
      exit(0);
    }
  }
  v5 = 0;
  v8 = 0;
  while ( v5 < Buffer )
    v8 += v12[v5++];
  ReadFile(hObject, v11, 0x10u, &NumberOfBytesRead, 0);
  v2 = 18;
  for ( j = 0; j < 16; ++j )
    v11[j] ^= v8;
  v7 = 0;
  v1 = 1;
  while ( v7 < 16 )
  {
    for ( k = 6; k >= 0; k -= 2 )
    {
      switch ( ((unsigned __int8)v11[v7] >> k) & 3 )
      {
        case 0:
          v2 -= 18;
          break;
        case 1:
          ++v2;
          break;
        case 2:
          v2 += 18;
          break;
        case 3:
          --v2;
          break;
        default:
          break;
      }
      if ( aN[v2] == 42 || aN[v2] == 32 )
      {
        v1 = 0;
        break;
      }
      if ( aN[v2] == 75 )
      {
        sub_401690((int)"Congratulations! you found it!\n");
        break;
      }
    }
    ++v7;
  }
  CloseHandle(hObject);
  return v1;
}

从文件中读入一个5,然后从byte_405100中读取5个字符,点进去可知为"nkman"然后求和得v8,v8作为异或的值
aN为一个迷宫。

******************
N...*****...*....*
**.*****..*...**.*
...*****.*****.*.*
.**....*..*...*..*
....**.*.*..*...**
*.**...*.*.*******
..*****..*......**
.*......**.****.**
...*****...*K...**
******************

然后继续从文件中读入,异或v8,手动走一下迷宫
ddssaassdssassddwdddddwdwwwwwdwddsddwdddsssasaawaasassdddddssaaa
switch语句简单看一下得出上是0,右是1,下是2,左是3
1122332212232211011111010000010112110111222323303323221111122333
关键是这句话的理解for ( k = 6; k >= 0; k -= 2 ) (v11[v7] >> k) & 3
这句话是将v11的每两个二进制位转换为一个四进制位,
那我们就需要转换回去,转回16进制再加上05和'nkman'即为flag

v12 = [0x6E, 0x6B, 0x6D, 0x61, 0x6E]#nkman
v8 = 0
for i in range(5):
    v8 += v12[i]
v8 ^= 0x200 
#因为ReadFile(hObject, &Buffer, 1u, &NumberOfBytesRead, 0);
#这段读入函数只读取了v11中的0x10u即16个字节的数据,也就是取了低八位,
#所以等价于与v8的低八位的异或,v8是0x215,我们只取0x15
#有以下迷宫,N为起点,K为终点,只能走'.'的地方,上下左右分别用wsad表示
# ******************
# N...*****...*....*
# **.*****..*...**.*
# ...*****.*****.*.*
# .**....*..*...*..*
# ....**.*.*..*...**
# *.**...*.*.*******
# ..*****..*......**
# .*......**.****.**
# ...*****...*K...**
# ******************
path="ddssaassdssassddwdddddwdwwwwwdwddsddwdddsssasaawaasassdddddssaaa"
path =path.replace("w","0")
path =path.replace("d","1")
path =path.replace("s","2")
path =path.replace("a","3")
s = [path[i:i+4] for i in range(0, len(path), 4)]
qua = [int(x, 4) for x in s]
for i in range(len(qua)):
    qua[i]^=v8
v11=['0x05', '0x6e', '0x6b', '0x6d', '0x61', '0x6e']
for i in range(len(qua)):
    v11.append(hex(qua[i]).zfill(4))#有0x0出现用zfill填满四位
flag = 'nkctf{'+''.join(v11).replace('0x','')+'}'
print(flag)

标签:NKCTF2023,...,..,esp,int,RE,ebp,PMKF,v8
From: https://www.cnblogs.com/Tree-24/p/17272143.html

相关文章

  • linux里 cannot create /www: permission denied
    这个错误信息表明你尝试在根目录下创建一个名为www的目录,但是你没有足够的权限来完成这个操作。在Linux中,根目录(/)拥有系统管理员账户(root)的特殊权限,普通用户默认没有在根......
  • future.get()处理多个线程的java例子
    一种代码示例是使用ExecutorService类的submit()方法提交多个Callable任务,并返回多个Future对象,然后在主线程中循环调用Future对象的get()方法获取结果,并进行汇总1。代码......
  • Navicat Premium 12连接mysql
    命令行连接数据库查询当前用户修改加密方式设置密码,即可用NavicatPremium12正常登陆 ......
  • SpringBoot中集成Redis实现对redis中数据的解析和存储
    场景SpringBoot中操作springredis的工具类:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108335645上面讲的操作redis的工具类,但是对于redis的集成并没......
  • 【HMS Core】FAQ之机器学习服务知多少
    【问题描述1】使用骨骼点驱动虚拟人偶,华为是否提供相关能力以及可使用的API?【解决方案】API请参考下图:参考链接:https://developer.huawei.com/consumer/cn/doc/development/......
  • 走过最长的路是ChatGPT的套路,信过最真的话是Adobe的Firefly
    在人工智能爆火的当下,去讨论以ChatGPT为首的人工智能的优劣,容易引起上纲上线的麻烦。所以在开始之前我们先说好,今天不聊主义聊生活;不聊抽象聊具体;不聊结构聊个体,这是大前提......
  • 13岁软件小天才Thomas Suarez最近在忙什么
    还记得雷锋网去年为大家介绍的软件小天才ThomasSuarez吧?当时他的演讲视频红遍全球,神情举止都酷似乔布斯,还有自己的软件公司CarrotCorp,自己开发了两款娱乐应用,这个软件小天......
  • Facebook用户消费力竟不敌Pinterest
    表面上Pinterest的用户数下降了,实则是上升了,为什么这样说呢?前Ebay联合创始人创立的珠宝和饰品在线网站Boticca.com最近比较了Pinterest和Facebook各自50000个用户的消费能力......
  • Redux入门
    一、认识Redux二、创建Redux第一个程序2.1、安装命令安装稳定版:npminstall--savereduxnpmiredux2.2、创建一个文件夹reduxstate1、在文件下创建一个count......
  • 选择Kendo React PDF查看器的几个理由,一定要看!
    KendoUI致力于新的开发,来满足不断变化的需求,通过React框架的KendoUIJavaScript封装来支持ReactJavascript框架。KendoUIforReact能够为客户提供更好的用户体验,并且......