[xman] level0
- file : 64位 程序 静态链接加载函数
- checksec : NX 开启(堆栈不可执行)
info :系统库函数加载到了程序中
- tip :
1.64位程序特性 : 寄存器长度为8 , 函数传参 优先使用寄存器传参(顺序从左向右 , rdi rsi rdx rcx r8 r9), 超过 6 个参数时 使用栈传参
- padding 长度 需要考虑 leave 指令 (类似于 mov sp , bp ; pop bp) ,所以 padding 长度为0x80 + 8
[Xman] level1
- file: 32位 elf , 动态链接
- checksec : 开启partial RELRO
- tip :
1: 32位 程序,寄存器4位 ,使用栈传参 , 调用函数逻辑 addr_fuc + addr_pr + addr_arg1 +...+ addr_ret (addr_pr 是为了清除传入的参数 保持栈平衡)
2.此处利用的难点在于获取输入开始处地址,但是本题中的输入开始地址用printf函数给出了
[Xman] level2
- file : 32位 elf , 静态链接
- checksec :nx
- info: 和level0类似,system函数和/bin/sh加载在程序中
[Xman] level2_x64
- file: x64 elf , 动态链接
- checksec : 开启 nx
- info : 在 level2 的基础上 适应64位程序的传参方式即可
[Xman] level3
- file: 32位 elf
- checksec : nx
- info: 写一个 leak 函数,功能 :用 write 函数输出 write 的got装载地址
[Xman] level3_x64
- file: 64位 elf
- checksec : nx
- info : 在 32位 leak函数的基础上根据64位的 函数传参特性做出修改即可(可用ROPgaget 获取可用的gadget)
[Xman] level4
- file : 32位 elf , 动态链接
- checksec: nx
- info:使用了 DynELF 模块进行Memory leak
- tip:
1.DynELF 使用的 leak 函数有格式上的要求 , 直接获取目标位置 p.recv(N) 的结果 然后return即可,不要多做处理
- 需要将 "/bin/sh" 写入bss段或者其他已知的可写读地址
smashes
- file : 64位 elf
- checksec :stack canary | nx | fortify
- info : 利用stack canary 会在检查失败后 调用 __stack_chk_fail 输出 argv[0] | (即程序名) 的特性 。因为没有开aslr , 可以在找到 argv[0] 后覆盖它为 flag 的地址 并且触发 stack_chk_fail 从而输出flag
网友评论