REVERSE-PRACTICE-BUUCTF-8

[GUET-CTF2019]re

elf文件,有upx壳,脱壳后ida分析
字符串交叉引用来到主逻辑函数sub_400E28
逻辑清晰,获取输入,验证输入,重要的是sub_4009AE函数
re-logic
进入sub_4009AE函数,是对输入每个字符的验证,输入长度为32,这里没有验证input[6]
re-sub_4009AE
写脚本,由于程序没有验证input[6],即“#”位置的字符,试出来为“1”时提交成功
re-script

相册

apk文件,用jadx-gui没发现主逻辑
用Apktool Box反编译apk,xiangce1->lib->armeabi->libcore.so
ida分析该so文件
shift+F12,在字符串窗口的最下面发现三段可疑字符串,很像base64
相册-strings
解这三段字符串,由题目的提示可知,flag的内容为完整的邮箱
相册-script

[V&N2020 公开赛]strangeCpp

exe程序,运行后输出了本机系统相关的信息,按任意键结束,无壳,ida分析
在字符串窗口找到一些字符串,提示真正的flag需要找找
strangecpp-strings
字符串交叉引用来到sub_140013AA0函数,该函数就是获取了本机系统信息然后打印,乍一看没什么特殊的地方

__int64 __fastcall sub_140013AA0(__int64 a1, __int64 a2, __int64 *a3)
{
    
    
  char *v3; // rdi
  signed __int64 i; // rcx
  __int64 v5; // rax
  __int64 v6; // rax
  __int64 v7; // rax
  __int64 v8; // rax
  char v10; // [rsp+0h] [rbp-20h]
  struct _SYSTEM_INFO SystemInfo; // [rsp+28h] [rbp+8h]
  __int64 *j; // [rsp+78h] [rbp+58h]
  __int64 v13; // [rsp+98h] [rbp+78h]
  __int64 *v14; // [rsp+1A0h] [rbp+180h]

  v14 = a3;
  v3 = &v10;
  for ( i = 94i64; i; --i )
  {
    
    
    *(_DWORD *)v3 = -858993460;
    v3 += 4;
  }
  sub_1400110AA(&unk_140027033);
  GetSystemInfo(&SystemInfo);
  putchar(byte_140021004);
  putchar(byte_140021005);
  putchar(byte_140021006);
  putchar(byte_140021007);
  putchar(byte_140021019);
  putchar(byte_14002101A);
  putchar(byte_140021005);
  putchar(10);
  puts("Let me have a look at your computer...");
  for ( j = v14; *j; ++j )
  {
    
    
    v13 = *j;
    sub_140011226("%s\n", v13);
  }
  std::basic_ostream<char,std::char_traits<char>>::operator<<(std::cout, sub_140011127);
  dword_140021190 = SystemInfo.dwNumberOfProcessors;
  sub_140011226("now system cpu num is %d\n", SystemInfo.dwNumberOfProcessors);
  if ( dword_140021190 < 8 )
  {
    
    
    puts("Are you in VM?");
    _exit(0);
  }
  if ( GetUserNameA(Str1, &pcbBuffer) )
  {
    
    
    v5 = sub_140011172(std::cout, "this is useful");
    std::basic_ostream<char,std::char_traits<char>>::operator<<(v5, sub_140011127);
  }
  v6 = std::basic_ostream<char,std::char_traits<char>>::operator<<(std::cout, sub_140011127);
  v7 = sub_140011172(v6, "ok,I am checking...");
  std::basic_ostream<char,std::char_traits<char>>::operator<<(v7, sub_140011127);
  if ( !j_strcmp(Str1, "cxx") )
  {
    
    
    v8 = sub_140011172(std::cout, "flag{where_is_my_true_flag?}");
    std::basic_ostream<char,std::char_traits<char>>::operator<<(v8, sub_140011127);
    _exit(0);
  }
  system("pause");
  sub_1400113E3(&v10, &unk_14001DE50);
  return 0i64;
}

仔细观察发现,在sub_140013AA0函数开始的部分,几个putchar的参数的存储地址并不连续
strangcpp-hint
进入到data段,在“welc”和“om”之间有一个在sub_140013AA0函数中没有用到的数组
strangecpp-hidden
交叉引用这个数组来到sub_140013580函数,分析知道,有一个arg和这个数组的元素依次异或后输出,重要的是求出这个arg
strangecpp-logic
arg首先作为参数传入了sub_140011384函数,返回结果存储在result中,下面的if语句对result和arg都有要求,进入sub_140011384函数,可知resul可由arg求出
strangecpp-sub_140011384
写脚本即可得到flag

#include<stdio.h>
void main()
{
    
    
	unsigned char arr[] = {
    
     0x26, 0x2C, 0x21, 0x27, 0x3B, 0x0D, 0x04, 0x75, 0x68, 0x34,
		0x28, 0x25, 0x0E, 0x35, 0x2D, 0x69, 0x3D };
	__int64 result = 607052314;
	int arg = 0;
	while (arg <= 14549743)
	{
    
    
		int v5 = arg >> 12;
		int v6 = arg << 8;
		if (result ==(v6^v5)*291)
		{
    
    
			printf("%d——", arg);
			for (int i = 0; i < 17; i++)
			{
    
    
				printf("%c", arr[i] ^ arg);
			}
			printf("\n");
		}
		arg += 1;
	}
	return;
}

运行结果
strangecpp-flag

[BJDCTF2020]easy

exe程序,运行后提示要找flag,无壳,ida分析
main函数没什么特殊的地方
easy-main
在函数窗main函数的上面有一个ques函数,ques函数没有要求输入,但是有输出打印
easy-ques
想要看看ques函数打印了什么东西,要调试这个exe程序,在main函数return前下断点
easy-breakpoint
程序停下后,去到ques函数的第一条指令处,设置为当前IP
easy-setip
在ques函数return前下断点,F9执行完ques函数,打印的内容即为flag
easy-flag

猜你喜欢

转载自blog.csdn.net/weixin_45582916/article/details/114155818
今日推荐