这个大会是做什么的?

逆向工程 拆卸 部件
2021-06-28 11:28:09

我写了一个非常基本的crackme来学习汇编是如何工作的。

尽管是我自己写的,但我在理解程序集的一些部分时遇到了一些麻烦:

在此处输入图片说明

到目前为止我所知道的是:[rbp+rax+input_buffer]基本上input_buffer[rax],异或两个相同的寄存器会重置它们,仅此而已(除了非常基本的东西,如 add、mov、inc)。

我特别不明白什么movsx ..add ecx, 0FFF..正在做什么。

input_buffer 填充了_fgets. 我故意不说一个有效的输入,看看你是否能弄明白(反正应该不难)。

一个正确的输入是0123456789\n,请注意,我通过 丢弃了换行符strcspn

1个回答

我猜原始代码是这样的:

char input_buffer[...];
// ...
int c = input_buffer[i];

由于变量c是 aint并且input_buffer是 a char[],您的编译器必须将读取提升char为 a int这就是为什么你有movsx指令。它将读取当前字符并对其进行符号扩展,因此它将适合int.

关于add,编译器通常将 a 编码sub dst, immadd dst, -imm,如果您否定0xffffffd0(SHIFT - 在 IDA 中),您将获得-0x30. 这就是将 ASCII 数字转换为整数的方法。