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

浙公网安备 33010602011771号