基础的汇编语法

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函数反汇编出来的伪代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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代码,按照那些条件一一对应就能直接算出来。