PWN入门-基础知识-1

Fri Nov 08 2024
PWN
untagged

关于NC

  1. 如何在Linux系统下使用NC工具连接远程?
SH
1
nc <服务器地> <服务器开放的端>

关于GCC的使用

  1. 怎么在Linux中运行或编译可执行文件?
SH
1
2
chmod +x pwn5 # 这里是确保可执行文件有权限
./pwn5        # 运行可执行文件
  1. 如何将C语言源程序编译成可执行文件?
SH
1
gcc -o <需要生成的可执行文件> <源程> 
  1. 如何编译汇编代码到可执行文件?
SH
1
2
nasm -f elf64 <你的.asm文> # 将.asm文件编译为.o文件
ld -s -o <需要生成的可执行文件> <你的.o文> # 将.o链接成可执行文件
  1. 如果将汇编源代码编译成可执行文件?
SH
1
gcc -o <需要生成的可执行文件> <汇编源代> 

关于汇编

  1. 立即寻址方式结束后eax寄存器的值?
ASM
1
2
3
mov     eax, 0Bh    # 将0x0B的值,赋给EAX寄存器
add     eax, 1BF48h # 将0x1BF48与之前EAX寄存器的数值(0X0B),相加
sub     eax, 1      # 将EAX里的数值-1
  1. 寄存器寻址方式结束后edx寄存器的值为?
ASM
1
2
mov     ebx, 36Dh # 将0x36D赋值给EBX
mov     edx, ebx  # 将EBX的值赋给EDX
  1. 直接寻址方式结束后ecx寄存器的值为?
ASM
1
mov     ecx, dword_80490E8 # 将dword_80490E在内存里的地址赋值给ECX
ASM
1
2
3
.data:080490E8                 ;org 80490E8h
.data:080490E8 dword_80490E8   dd 636C6557h            ; DATA XREF: LOAD:0804805C↑o
.data:080490E8                                         ; start+14↑r ...

这里可以看出dword_80490E的内存地址是0x080490E8,则ECX=dword_80490E的内存地址=0x080490E8。

  1. 寄存器间接寻址方式结束后eax寄存器的值为?
ASM
1
2
mov     esi, offset dword_80490E8 # 将dword_80490E在内存里的地址赋值给ESI
mov     eax, [esi]                # 将ESI指向的地址的值赋给EAX
ASM
1
2
3
.data:080490E8                 ;org 80490E8h
.data:080490E8 dword_80490E8   dd 636C6557h            ; DATA XREF: LOAD:0804805C↑o  # dword_80490E8所在地址的值是0x636C6557
.data:080490E8 

这里可以看到dword_80490E8所在地址的值是0x636C6557,ESI的地址=dword_80490E8的地址,EAX的值=ESI的地址的值=dword_80490E8所在地址的值=0x636C6557

  1. 寄存器相对寻址方式结束后eax寄存器的值为?
ASM
1
2
3
mov     ecx, offset dword_80490E8 # 将dword_80490E在内存里的地址赋值给ECX
add     ecx, 4                    # 将ECX+4  +4就是偏移量
mov     eax, [ecx]                # 将ECX的地址的值赋给EAX
ASM
1
2
3
.data:080490E8                 ;org 80490E8h
.data:080490E8 dword_80490E8   dd 636C6557h            ; DATA XREF: LOAD:0804805C↑o
.data:080490E8 

这里可以知道dword_80490E在内存里的地址是0x080490E8,EAX=dword_80490E+4=0x080490E8+4=0x80490EC。

ASM
1
2
3
4
5
.data:080490EC aOmeToCtfshowPw db 'ome_to_CTFshow_PWN',0
.data:080490EC _data           ends
.data:080490EC
.data:080490EC
.data:080490EC                 end start

这里就可以得到EAX的地址的值是ome_to_CTFshow_PWN=EAX。

  1. 基址变址寻址方式结束后的eax寄存器的值为?
ASM
1
2
3
mov     ecx, offset dword_80490E8 # 将dword_80490E在内存里的地址赋值给ECX
mov     edx, 2                    # 将2赋值给EDX
mov     eax, [ecx+edx*2]          # 将ECX+EDX*2的地址的值赋给EAX
ASM
1
2
3
.data:080490E8                 ;org 80490E8h
.data:080490E8 dword_80490E8   dd 636C6557h            ; DATA XREF: LOAD:0804805C↑o
.data:080490E8 

这里可以知道dword_80490E在内存里的地址是0x080490E8,EAX=dword_80490E+EDX2=0x080490E8+22=0x80490EC

ASM
1
2
3
4
5
.data:080490EC aOmeToCtfshowPw db 'ome_to_CTFshow_PWN',0
.data:080490EC _data           ends
.data:080490EC
.data:080490EC
.data:080490EC                 end start

这里就可以得到EAX的地址的值是ome_to_CTFshow_PWN=EAX。

  1. 相对基址变址寻址方式结束后eax寄存器的值为?
ASM
1
2
3
4
mov     ecx, offset dword_80490E8 # 将dword_80490E在内存里的地址赋值给ECX
mov     edx, 1                    # 将1赋值给EDX
add     ecx, 8                    # 将EDX+8
mov     eax, [ecx+edx*2-6]        # 将ECX+EDX*2-6的地址的值赋给EAX
ASM
1
2
3
.data:080490E8                 ;org 80490E8h
.data:080490E8 dword_80490E8   dd 636C6557h            ; DATA XREF: LOAD:0804805C↑o
.data:080490E8 

这里可以知道dword_80490E在内存里的地址是0x080490E8,EAX=(dword_80490E8+8)+12-6=(0x080490E8+8)+12-6=0x80490EC。

ASM
1
2
3
4
5
.data:080490EC aOmeToCtfshowPw db 'ome_to_CTFshow_PWN',0
.data:080490EC _data           ends
.data:080490EC
.data:080490EC
.data:080490EC                 end start

这里就可以得到EAX的地址的值是ome_to_CTFshow_PWN=EAX。

关于汇编的总结

  1. MOV 指令 将数据从一个位置复制到另一个位置。
  2. ADD 指令 将两个操作数相加并将结果存入目标。
  3. SUB 指令 将源操作数从目标操作数中减去,并将结果存回目标。
  4. XOR 指令 执行异或操作,将源和目标操作数进行异或运算,并将结果存入目标。
  5. EAX 累加寄存器 算术操作(加法、减法等)的结果通常存储在 EAX 中。
  6. EBX 基址寄存器 用于数组或结构体的基址计算。
  7. ECX 计数寄存器 计数器。
  8. EDX 数据寄存器 存储扩展的数据或操作数。
  9. ESI 源索引寄存器 表示源数据的位置。