RE Note 1

基础的汇编语法

x86/x64汇编指令的基本格式: 操作码 操作数1 操作数2

基本语法:

  • 数据传输指令:mov
    • mov rax, rbx rax = rbx
    • mov qword ptr [rdi], rax *(rdi) = rax
  • 取地址指令:lea
    • lea rax, [rsi] rax = &*(rsi)
  • 算术运算指令:add, sub
    • add rax, rbx rax += rbx
    • sub rax, rbx rax -= rbx
  • 逻辑运算符:and, xor
    • and rax, rbx rax &= rbx
    • xor rax, rbx rax ^= rbx
  • 函数调用指令:call
    • call 0x401000 执行0x401000地址的函数
  • 函数返回指令:ret
  • 比较指令:cmp
    • cmp rax, rbx 根据rax与rbx的比较结果改变标志位
  • 无条件跳转指令:jmp
  • 栈操作:push pop

⬆其实我觉得没啥用,多看看汇编代码就熟了(

攻防世界的几道入门题

re1

看csdn上一堆堆大佬讲了大量乱七八糟的思路和方法

我直接把flag搜出来了

乐死了

image-20210710171521536

Hello, CTF

放进ida中,_main函数反汇编出来的伪代码如下

strcpy(v13, "437261636b4d654a757374466f7246756e");	#给v13一个奇怪的赋值
  while ( 1 )
  {
    memset(v10, 0, sizeof(v10));	v10初始化为全0
    v11 = 0;
    v12 = 0;
    sub_40134B(aPleaseInputYou, v6);
    scanf("%s", v9);	#读入v9
    if ( strlen(v9) > 0x11 )
      break;
    for ( i = 0; i < 17; ++i )
    {
      v4 = v9[i];
      if ( !v4 )
        break;
      sprintf(Buffer, "%x", v4);	#Buffer=v4(16进制)	<-此处为关键
      strcat(v10, Buffer);	#将Buffer接到v10后
    }
    if ( !strcmp(v10, v13) )	#比较v10和v13,可见v10为一个关键值
      sub_40134B(aSuccess, v7);
    else
      sub_40134B(aWrong, v7);
  }

由于%x为16进制标志,所以强猜v13的赋值为某条信息的16进制,转换之后得出flag:CrackMeJustForFun

Open_Source

没啥好说的,白给c代码,按照那些条件一一对应就能直接算出来。