在radare2上的AT&T XOR参数

逆向工程 雷达2 反汇编者 快手
2021-06-15 00:38:26

最近我遇到了radare2的奇怪(在我看来)行为。

我一直在阅读关于使用此破解版进行黑客攻击人工真理博客文章

在一篇文章中 Julien 使用了Intel语法,但我选择了AT&T

所以我开始反汇编crackme:

$ r2 ./crackme.03.32

将语法设置为 intel,块大小为 10 字节,并寻找所需的地址并打印反汇编:

[0x00010020]> e asm.syntax = intel
[0x00010020]> b 10
[0x00010020]> s 0x0010112
[0x00010112]> pd

输出是:

       0x00010112    80f2ac         xor dl, 0xac
       0x00010115    eb02           jmp 0x10119

但是当我将语法更改为 ATT 时:

[0x00010112]> e asm.syntax = att
[0x00010112]> pd

我收到了:

       0x00010112    80f2ac         xorb $-0x54, %dl
       0x00010115    eb02           jmp 0x10119

crackme源码中我们可以发现argument的值为0xac (xor dl, 0xac)

所以,实际上,问题:

为什么80 f2 ac转换为相同的操作码,但 AT&T 和 Intel 语法的参数不同。

为什么 0xac 变成了 -0x54?


$ r2 -version
radare2 0.10.0-git 8247 @ linux-little-x86-64 git.0.9.9-148-gd5f2661
commit: d5f2661cbe1a32bc26490bd7a1864ef45907aaea build: 2015-06-26
1个回答

这是签名和未签名的问题。

改变符号的方法是否定它,这不是该数字的所有位并将其增加 1

>>> 256 - (~(-0x54)+1)
172
>>> hex(172)
'0xac'
>>>