PWN PWN PWN !!! 技巧 (2)
简介:
紧接上次技巧(1),这次总结一些工具的用法和模板,俗话说好记性不如烂笔头,记录一手
环境
32位:
context(log_level = 'debug',arch = 'i386',os = 'linux') |
64位:
context( log_level = 'debug',arch = 'amd64',os = 'linux' ) |
查找程序所动态链接的库
ldd 文件名 |
/1.png)
ROPgadget
在构造rop链的时候,需要一些寄存器的地址,就可以用下面的命令:
ROPgadget --binary 文件名 | grep 'ret' #注意ret是可以改成别的欧,像rdi,rsi寄存器啥的 |
在遇到静态链接的时候,往往用ROPgadget搜索就会出现一大堆地址,这个时候就需要区分一下:
ROPgadget --binary 文件名 --only "pop|ret" | grep 'eax' #根据自己的需要进行改动 |
如果是做ret2syscall就需要binsh,in 0x80,就用如下命令:
ROPgadget --binary 文件名 --string '/bin/sh' |
ROPgadget还可以直接构造rop链(主要争对的是静态链接)
ROPgadget --binary 文件名 --ropchain |
/2.png)
32位
# Padding goes here |
64位
# Padding goes here |
Onegadget
one_gadget libc版本 |
/3.png)
Seccomp
存在沙箱,就需要注意两点,第一点就是return ALLOW(allow也就是允许可行),第二点就是return KILL(kill也就是杀死禁止)
seccomp-tools dump ./文件名 |
/4.png)
readelf
readelf -S ./111 | grep bss 查看可读可写的bss段 |
/5.png)
shellcode
可以用工具编写shellcode(划重点,唯一需要注意的就是环境,不标注环境默认为32位的,让雨果遇到64位shellcode的题目,就需要标注环境,上面有自己翻)
shellcode = asm(shellcraft.sh()) |
也可以自己找 https://www.exploit-db.com (根据题目的要求,选取适合的字节)
# 32位 短字节shellcode --> 21字节 |
GDB
- plt 查看 plt 表内容
/6.png)
- got 查看 got 表内容
/7.png)
- vmmap vmmap – 可以用来查看栈、bss段是否可以执行
/8.png)
- distance
用于计算两地址的距离
distance 地址 地址
/9.png)
- disassemble
用于查看某段代码的汇编指令
disassemble 地址
/10.png)
- attach
调试
gdb.attach(p) - print
查看变量地址
print 函数名
/11.png)
其他
gcc命令生成可执行文件
gcc <c文件名> -o <生成的可执行文件名> |
gcc编译运行c文件(Linux系统)
1、新建.c文件 |
不开启PIE保护
gcc -fno-stack-protector -no-pie -s test.c -o test |
Relro / Stack / NX / PIE
- Full Relro(重定位表只读) Relocation Read Only, .got 和 .plt 只读
- No Canary found(能栈溢出)
- NX enable(不可执行内存) Non-Executable Memory
- PIE enable(开启ASLR 地址随机化) Address space layout randomization
总结:
水平一直停滞不前,一直在原地踏步,放松心情,加油加油!!!