PWN一些用到的指令和工具

ROPgadget

ROPgadget --binary 文件名 --only "指令|指令" | grep 寄存器或者其他存在的字段

查找汇编指令的地址

例子:

ROPgadget --binary get_started_3dsctf_2016 --only "mov|ret" |grep eax

ROPgadget --binary get_started_3dsctf_2016 --only "mov|ret" |grep ': mov eax'

  • --only ” | “ 表示只返回含有xx指令或xx指令的gadget

  • grep 表示含有什么什么特定字段(通常是寄存器)的指令

    但是grep能寻找的必须是连续的指令中间不能隔开,连空格都必须一致才能被搜索到

    比如你想要搜索0x080701a8 : mov eax, ecx ; ret,你可以用命令ROPgadget --binary get_started_3dsctf_2016 --only "mov|ret" |grep 'eax, ecx';命令ROPgadget --binary get_started_3dsctf_2016 --only "mov|ret" |grep 'eax,ecx'无法成功因为逗号和ecx之间少了一个空格

  • 取地址的指令[edx]无法被识别,[ ]在ROPgadget中貌似是表示含有[ ]内字母的指令

    比如 ROPgadget --binary get_started_3dsctf_2016 --only "mov|ret" |grep '[edx]'得到的是这样

ROPgadget --binary 文件名 --sting '/bin/sh'

查找字符串地址

例子:

ROPgadget --binary 文件名 --sting '/bin/sh'

ROPgadget --binary 文件名 --sting '/sh'

ROPgadget --binary 文件名 --sting 'sh'

ROPgadget --binary 文件名 --sting 'cat flag'

ROPgadget --binary 文件名 --sting 'cat flag.txt'

![(

vmmap

vmmap [-h] [pages_filter]

首先vmmap需要在pwndbg,且程序运行时使用

  • 输入vmmap,显示出程序运行时所用到的所有地址段
  • 输入vmmap 地址 ,显示该地址对应的地址段
  • vmmap -h,提示帮助;-w只显示可写的部分;-x只显示可执行的部分

例子:

第一行,表明了哪个颜色对应哪个段,

start和end对应该地址段的起始和结束位置

Perm 是该段的权限,rwx代表可读、可写、可执行

Size表示该段大小

Offset表示这段与程序基址的偏移

File表示加载的是什么

vim

命令模式下:

$ 行末

^ 行首

L 屏幕底行

H 屏幕顶行

yy 拷贝该行

dd 删除该行

P 前粘贴

p 后粘贴

D 删除至行尾

u 撤销

gg 光标移至行首

dG 删除光标行及光标行以下全部内容

底线命令模式下:

:wq 保存并退出

:%d 删除全部内容

:%s 替换 参考(万里哥我滴神)

pwndbg

基本指令

  • r = run 运行程序,如果你当前已经在运行程序了,再输入r会重新运行程序
  • b = break 下断点,在调试pwn中,一般是 b 0xabcde ,abcde是在ida中看到的地址,如b 0x400908
  • c = continue 继续运行程序直到停在下一个断点
  • n = next 下一行,一般装了pwndbg之后下一行指的是下一条汇编,但是如果调试的程序是带调试信息的,一般会跳几行汇编
  • ni = nexti 下一条指令,这个就是真正的下一条汇编指令
  • s = step 单步进入函数
  • d = delete 删除断点,后面可带数字,说明删除第几个断点,如果不带参数,说明删除全部断点
  • x 查看内存

c,n,ni这几个程序都可以带一个数字,用来代表连续运行这个指令多少次

x/num xg 地址 64位查看某处地址

x/num xw 地址 32位查看某处地址

s/num s 地址 查看从地址开始的num个字符串

b *$rebase(地址) 用于开启PIE该指令会在基址+地址处下断点

ASLR和pie编译

查看系统当前ASLR打开情况

sudo cat /proc/sys/kernel/randomize_va_space

ASLR的三个级别 :

0, 不开启任何随机化;

1, 开启stack、libraries [、executable base(special libraries -^-) if PIE is enabled while compiling] 的随机化;

2,开启heap随机化。

PIE编译出来的executable如果ASLR=0的话,基址也是不会变的(有能力但没使用),如果ASLR=1的话,即使按照ASLR定义这个级别似乎不会对heap基址随机化,但是由于executable的基址已经随机化了,所以heap的基址自然也就被随机化了

指令关闭ASLR

sysctl -w kernel.randomize_va_space=0

echo 0 > /proc/sys/kernel/randomize_va_space

fPIE选项仅能在编译可执行码时用,不能用于编译库。所以,如果想要PIE的程序,需要你除了在gcc增加-fPIE选项外,还需要在ld时增加-pie选项才能产生这种代码。即gcc -fpie -pie来编译程序。单独使用哪一个都无法达到效果。

gcc  helloworld.c

file a.out a.out:

ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped

file a.out a.out:

ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped

未开启PIE的文件属性为executable,开启的为shared object

注意PIE随机程序加载基地址,要和libc的随机libc库基地址区分

shellcode

pwntools生成的shellcode默认64位

shellcode = asm(shellcraft.sh())

要生成32位的shellcode需要指定

shellcode = asm(shellcraft.sh(),arch='i386',os='linux')

手动反汇编汇编指令

xx = asm('')

posted @ 2023-07-28 21:51  lmarch2  阅读(168)  评论(0编辑  收藏  举报