JustRE

环境

  • windows10,IDA pro,ExeinfoPe
  • 文件attachment.exe

[BJDCTF2020]JustRE

  • 首先使用ExeinfoPe进行查壳
    Microsoft Visual C++ ver 5.0/6.0 - no sec. Cab/7z/Zip - 2019-09-15
    并且是一个32位程序。
  • 使用IDA进行分析
    等IDA分析结束后,使用shift+F12搜索字符串

发现BJD{%d%d2069a45792d233ac}十分可疑,点进去

ctrl+x查看引用,并使用F5反汇编,得到如下结果

INT_PTR __stdcall DialogFunc(HWND hWnd, UINT a2, WPARAM a3, LPARAM a4)
{
  CHAR String[100]; // [esp+0h] [ebp-64h] BYREF

  if ( a2 != 272 )
  {
    if ( a2 != 273 )
      return 0;
    if ( (_WORD)a3 != 1 && (_WORD)a3 != 2 )
    {
      sprintf(String, Format, ++dword_4099F0);
      if ( dword_4099F0 == 19999 )
      {
        sprintf(String, " BJD{%d%d2069a45792d233ac}", 19999, 0);
        SetWindowTextA(hWnd, String);
        return 0;
      }
      SetWindowTextA(hWnd, String);
      return 0;
    }
    EndDialog(hWnd, (unsigned __int16)a3);
  }
  return 1;
}

注意到sprintf(String, " BJD{%d%d2069a45792d233ac}", 19999, 0)这个语句,当dword_4099F0 == 19999时,前者成立,即 BJD{1999902069a45792d233ac}
猜测flag与之有关,点击dword_4099F0,使用ctrl+x查看引用

依次点入

可以看出Format记录您已经点了%d次,dword_4099F0是点击的次数。
看汇编

mov     eax, dword_4099F0
add     esp, 0Ch
cmp     eax, 4E1Fh
jnz     short loc_4013D0

jnz为结果不为0跳转,将eax中值与4E1Fh进行比较,注意4E1Fh转换为十进制数为19999,所有程序需要你点击20000次才会输出flag。

  • 得到flag
    flag为flag

[GWCTF 2019]pyre

拿到一个pyc文件,反编译后结果:

#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
print 'Welcome to Re World!'
print 'Your input1 is your flag~'
l = len(input1)
for i in range(l):
    num = ((input1[i] + i) % 128 + 128) % 128
    code += num

for i in range(l - 1):
    code[i] = code[i] ^ code[i + 1]

print code
code = [
    '\x1f',
    '\x12',
    '\x1d',
    '(',
    '0',
    '4',
    '\x01',
    '\x06',
    '\x14',
    '4',
    ',',
    '\x1b',
    'U',
    '?',
    'o',
    '6',
    '*',
    ':',
    '\x01',
    'D',
    ';',
    '%',
    '\x13']

翻译后代码含义为:输入flag,经过两次操作后,得到code,这里code已经给出,这道题要求我们反解出flag。

code = ['\x1f','\x12','\x1d','(','0','4','\x01','\x06','\x14','4',
    ',','\x1b','U','?','o','6','*',':','\x01','D',';','%','\x13']
l=len(code)
for i in range(l-2,-1,-1):#这里使用切片的操作
    code[i]=chr(ord(code[i]) ^ ord(code[i+1]))
for i in range(l):
    print(chr((ord(code[i])-i)%128),end="")

code[i] = code[i] ^ code[i + 1]从code[0]一直到code[-2]处,code[-1]的值未发生改变,所以反解时,从i-2一直到-1,步长为-1

知识点
pyc
  • 当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当python程序运行结束时,python解释器则将PyCodeObject写回到pyc文件中,当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。
  • pyc文件是py文件编译后生成的字节码文件(byte code),pyc文件经过python解释器最终会生成机器码运行。因此pyc文件是可以跨平台部署的,类似Java的.class文件,一般py文件改变后,都会重新生成pyc文件

参考

说说Python程序的执行过程:https://www.cnblogs.com/kym/archive/2012/05/14/2498728.html
一文掌握CTF中Python全部考点:https://www.freebuf.com/column/232197.html

posted @ 2021-09-25 22:29  超级想睡觉  阅读(147)  评论(0)    收藏  举报