最近我遇到了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