汇编语言学习笔记
Debug常用命令:
1、R 可查看、改变CUP寄存器的内容
2、D 查看内存中的内容
3、E 改写内存中的内容
4、U 将内存中的机器指令翻译成汇编语言
5、T 执行一条机器指令
6、A 命令以汇编指令的格式在内存中写入一条机器指令
速记:truead
PWN常用汇编指令
mov
:将数据从一个位置复制到另一个位置。
mov eax, 42 ; 将立即数42赋值给eax寄存器
mov ebx, eax ; 将eax寄存器中的值复制到ebx寄存器
lea
:用于计算一个有效地址,并将该地址存储在目标寄存器中。
lea ecx, [ebx 4] ; 将ebx寄存器加上4得到的地址存储在ecx寄存器中
add
:执行加法操作。
add eax, ebx ; 将eax寄存器的值加上ebx寄存器的值,并将结果存储在eax寄存器
sub
:执行减法操作。
sub ecx, 10 ; 将ecx寄存器的值减去10,并将结果存储在ecx寄存器
ret
:用于从函数中返回。
ret ; 从当前函数返回,将返回地址从堆栈弹出,并将程序控制转移到该地址
call
:用于调用函数或跳转到指定的地址。
call my_function ; 调用名为my_function的函数
push
:将数据压入堆栈。
push eax ; 将eax寄存器的值压入堆栈
pop
:从堆栈中弹出数据。
pop ebx ; 从堆栈弹出一个值,并将其存储到ebx寄存器
针对PWN题中的汇编技巧
- Shellcode编写:Shellcode是用于执行特定任务的机器码,通常是用汇编语言编写的。编写有效的Shellcode需要了解目标平台的汇编指令和系统调用接口。可以使用工具如pwntools的
asm
函数来编写和生成Shellcode。 - 缓冲区溢出:缓冲区溢出是Pwn中常见的攻击手法。它涉及到通过向程序输入超过缓冲区容量的数据来覆盖关键数据、修改程序行为或执行恶意代码。了解栈的结构、函数调用的堆栈帧布局以及如何控制返回地址是进行缓冲区溢出攻击的关键。
- 栈调整:在利用缓冲区溢出时,可能需要调整栈的状态以实现特定的攻击目标。这包括修改返回地址、构造ROP链(Return-Oriented Programming)或利用其他栈上的数据结构。
- GOT/PLT覆盖:Global Offset Table(GOT)和Procedure Linkage Table(PLT)是用于在可执行程序中解析和调用外部函数的机制。通过覆盖GOT表中的函数指针,可以控制程序的执行流程和调用其他函数。
- 逆向工程:逆向工程是从程序的可执行二进制文件中提取信息和理解程序行为的过程。通过反汇编和调试程序,可以了解程序的控制流、数据结构、关键函数等,并为Pwn攻击提供有用的信息。
- Shellcode注入:在某些情况下,可以通过将自定义Shellcode注入到程序中,然后利用漏洞执行该Shellcode来获取控制权。这可能涉及到通过缓冲区溢出或其他漏洞覆盖程序中的函数指针或返回地址。
- 格式化字符串漏洞:格式化字符串漏洞是指当程序使用用户提供的格式化字符串函数(如
printf
)时未正确处理用户输入,从而导致信息泄漏或任意内存读写。利用格式化字符串漏洞可以读取栈上的敏感信息、修改变量的值或执行任意内存写入。
在Ubuntu中编译汇编代码
确保安装了GNU工具链:打开终端并运行以下命令,以确保你安装了所需的工具链(汇编器和链接器):
代码语言:javascript复制sudo apt-get update
sudo apt-get install build-essential
编写汇编代码:使用任何文本编辑器创建一个新文件,并编写汇编代码。将文件保存为以.asm
为扩展名。
编译汇编代码:在终端中,使用以下命令将汇编代码编译为目标文件:
代码语言:javascript复制nasm -f elf64 -o program.o program.asm
上述命令中,-f elf64
表示生成64位可执行文件,如果你的代码是32位的,可以使用-f elf32
。
链接目标文件:使用以下命令将目标文件链接为可执行文件:
代码语言:javascript复制gcc -no-pie -o program program.o
-no-pie
选项用于禁用位置独立执行,以便与一些汇编代码兼容。
执行程序:现在,可执行文件已经生成。在终端中,进入可执行文件所在的目录,并执行它:
代码语言:javascript复制./program