Kar*_*jas 5 debugging assembly gdb x86-64 disassembly
我刚刚开始在 VMware 中的 Kali Linux 中学习汇编语言。我有一个锐龙 5 CPU。在下面的代码片段中,我有一些不明白的地方。
\nlea rax, [rip \xc2\xb1 0xeb3]at <main + 17>是什么意思?我明白是什么lea意思,但是 \xc2\xb1 的含义是什么?(gdb) list\n1 #include<stdio.h>\n2\n3 int main(){\n4 int i;\n5 for(i = 0 ; i < 10 ; i++){\n6 printf("Hello World!\\n");\n7 }\n8 return 0;\n9 }\n(gdb) disassemble main\nDump of assembler code for function main:\n 0x0000000000001139 <+0>: push rbp\n 0x000000000000113a <+1>: mov rbp,rsp\n 0x000000000000113d <+4>: sub rsp,0x10\n 0x0000000000001141 <+8>: mov DWORD PTR [rbp-0x4],0x0\n 0x0000000000001148 <+15>: jmp 0x115d <main+36>\n 0x000000000000114a <+17>: lea rax,[rip\xc2\xb10xeb3] # 0x2004\n 0x0000000000001151 <+24>: mov rdi,rax\n 0x0000000000001154 <+27>: call 0x1030 <puts@plt>\n 0x0000000000001159 <+32>: add DWORD PTR [rbp-0x4],0x1\n 0x000000000000115d <+36>: cmp DWORD PTR [rbp-0x4],0x9\n 0x0000000000001161 <+40>: jle 0x114a <main+17>\n 0x0000000000001163 <+42>: mov eax,0x0\n 0x0000000000001168 <+47>: leave \n 0x0000000000001169 <+48>: ret \nEnd of assembler dump.\n(gdb) \nRun Code Online (Sandbox Code Playgroud)\n编辑:
\ngdb -v \nGNU gdb (Debian 12.1-3) 12.1\nCopyright (C) 2022 Free Software Foundation, Inc.\nLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\nRun Code Online (Sandbox Code Playgroud)\n
它不是一个加减号(\xc2\xb1,Unicode 点 0x00b1),而是一个带下划线的加号。
\n如果你复制粘贴它,你只会得到一个加号(+)。
GDB 12.1 使用 Python 为其反汇编器输出的每一行着色。具体来说,它使用 Pygments 包,在当前版本 2.11.2 中,该包处理 x64 代码的效果很差,这里是一个测试用例:
\nfrom pygments import formatters, lexers, highlight\n \ndef colorize_disasm(content, gdbarch):\n # Don\'t want any errors.\n try:\n lexer = lexers.get_lexer_by_name("asm")\n formatter = formatters.TerminalFormatter()\n return highlight(content, lexer, formatter).rstrip().encode()\n except:\n return None\n \n \nprint(colorize_disasm("lea [rip+0x211] #test", None).decode())\nRun Code Online (Sandbox Code Playgroud)\n\n(尚未发布)的下一个版本使用完全不同的着色代码,其中每个反汇编器函数都可以在其输出和反汇编命令中引入样式标记(请参阅gdb/disassemble.c)将这些标记转换为终端转义符。