记忆力不太好,简单记录一下,用作备忘
假设现在有文件如下:

  • 待 Pwn 程序:mypwn
  • libc 文件:libc.so

需要查找的字符串 /bin/sh 在上诉两个文件中都存在。

查找程序中的字符串

0x0 IDA strings window

将程序加载到 IDA 后,使用快捷键 shift+F12 打开 strings window ,查看程序中出现的全部字符。

0x1 Linux strings 命令

1
2
strings -a -t x mypwn | grep '/bin/sh'
> 540

返回的是地址最低 3 位。因为就算随机化,最低 3 位地址也保持不变。

0x2 ROPgadget

1
ROPgadget --binary mypwn --string '/bin/sh'

0x3 pwntools search 方法

1
2
3
from pwn import *
p = process('./mypwn')
binsh = p.search('/bin/sh').next()

pwntools 中用 ELF 加载程序(mypwn)后,elf 对象有一个 search 方法好像也可以查找字符串,未实测。

查找 libc 中的字符串

0x0 pwntools search 方法

1
2
3
4
5
6
from pwn import *
libc = ELF('./libc.so')
binsh = libc.search('/bin/sh').next()
# 这个地址不是真实地址,使用时还需要加上偏移
# 即一般情况下进行下面的处理后,才能正常使用
binsh_addr = binsh + libc_base # 泄露的libc基地址

0x1 libcSearch

使用 libcSearch 之前需要泄露出地址,以初始化 libcSearch 。这里假设泄露出 puts 地址。

1
2
3
4
5
6
from LibcSearcher import *
libc = LibcSearch('puts',puts_leak)
binsh = libc.dump('str_bin_sh')
# 这个地址不是真实地址,使用时还需要加上偏移
# 即一般情况下进行下面的处理后,才能正常使用
binsh_addr = binsh + libc_base # 泄露的libc基地址

0x2 ROPgadget

1
ROPgadget --binary libc.so --string '/bin/sh'